1 | package agents.anac.y2016.maxoops;
|
---|
2 |
|
---|
3 | import java.util.ArrayList;
|
---|
4 | import java.util.Enumeration;
|
---|
5 | import java.util.HashMap;
|
---|
6 | import java.util.HashSet;
|
---|
7 | import java.util.Iterator;
|
---|
8 | import java.util.List;
|
---|
9 | import java.util.Map;
|
---|
10 | import java.util.Map.Entry;
|
---|
11 |
|
---|
12 | import agents.Jama.Matrix;
|
---|
13 |
|
---|
14 | import java.util.Random;
|
---|
15 | import java.util.Set;
|
---|
16 |
|
---|
17 | import genius.core.Bid;
|
---|
18 | import genius.core.BidHistory;
|
---|
19 | import genius.core.Domain;
|
---|
20 | import genius.core.bidding.BidDetails;
|
---|
21 | import genius.core.issue.Objective;
|
---|
22 | import genius.core.issue.Value;
|
---|
23 | import genius.core.issue.ValueDiscrete;
|
---|
24 | import genius.core.issue.ValueInteger;
|
---|
25 | import genius.core.issue.ValueReal;
|
---|
26 | import genius.core.utility.AdditiveUtilitySpace;
|
---|
27 | import genius.core.utility.EVALUATORTYPE;
|
---|
28 | import genius.core.utility.Evaluator;
|
---|
29 | import genius.core.utility.EvaluatorDiscrete;
|
---|
30 | import genius.core.utility.EvaluatorInteger;
|
---|
31 | import genius.core.utility.EvaluatorReal;
|
---|
32 |
|
---|
33 | public class OPTComponent {
|
---|
34 |
|
---|
35 | // Adjustable Parameters
|
---|
36 | protected final double flrate;
|
---|
37 |
|
---|
38 | MaxOops agent;
|
---|
39 | Domain domain;
|
---|
40 |
|
---|
41 | public AdditiveUtilitySpace myUtilitySpace;
|
---|
42 | public HashMap<Objective, Evaluator> fEvaluators;
|
---|
43 | public Payoff[] payoffs;
|
---|
44 | public Matrix w;
|
---|
45 |
|
---|
46 | public OPTComponent(MaxOops agent, AdditiveUtilitySpace utilitySpace) {
|
---|
47 | // Set Adjustable Parameters First
|
---|
48 | agent.params.addParam("OPTComponent.flrate", 0.1);
|
---|
49 | this.flrate = agent.params.getParam("OPTComponent.flrate");
|
---|
50 | this.agent = agent;
|
---|
51 | this.myUtilitySpace = utilitySpace;
|
---|
52 | this.domain = utilitySpace.getDomain();
|
---|
53 | this.fEvaluators = new HashMap<Objective, Evaluator>();
|
---|
54 | Set<Entry<Objective, Evaluator>> fEvaluatorsSet = this.myUtilitySpace
|
---|
55 | .getEvaluators();
|
---|
56 | for (Entry<Objective, Evaluator> entry : fEvaluatorsSet) {
|
---|
57 | this.fEvaluators.put(entry.getKey(), entry.getValue());
|
---|
58 | }
|
---|
59 | this.w = new Matrix(agent.numIssues, 1);
|
---|
60 | Objective root = agent.domain.getObjectivesRoot();
|
---|
61 | int i = 0;
|
---|
62 | for (Enumeration<Objective> issueEnum = root
|
---|
63 | .getPreorderIssueEnumeration(); issueEnum.hasMoreElements();) {
|
---|
64 | Objective is = (Objective) issueEnum.nextElement();
|
---|
65 | Evaluator eval = (Evaluator) fEvaluators.get(is);
|
---|
66 | this.w.set(i++, 0, eval.getWeight());
|
---|
67 | }
|
---|
68 | this.payoffs = new Payoff[agent.numParties - 1];
|
---|
69 | for (i = 0; i < agent.numParties - 1; i++) {
|
---|
70 | this.payoffs[i] = new Payoff(i, agent, myUtilitySpace, this);
|
---|
71 | }
|
---|
72 | }
|
---|
73 |
|
---|
74 | public Bid getOptimalBidByThredhold(double f_thre) {
|
---|
75 | Bid[] firstBid = new Bid[agent.numParties - 1];
|
---|
76 | Bid[] bestBid = new Bid[agent.numParties - 1];
|
---|
77 | Bid[] lastBid = new Bid[agent.numParties - 1];
|
---|
78 | for (int i = 0; i < payoffs.length; i++) {
|
---|
79 | if (!agent.opponentsDistinctBids[i].isEmpty()) {
|
---|
80 | firstBid[i] = agent.opponentsDistinctBids[i]
|
---|
81 | .getFirstBidDetails().getBid();
|
---|
82 | bestBid[i] = agent.opponentsDistinctBids[i].getBestBidDetails()
|
---|
83 | .getBid();
|
---|
84 | lastBid[i] = agent.lastBid;
|
---|
85 | }
|
---|
86 | }
|
---|
87 | BidHistory bidsBySumOfPayoffs = new BidHistory();
|
---|
88 | int lbInd = Math.max(0, (int) (f_thre * 100) - 1);
|
---|
89 | int ubInd = Math.min((int) ((f_thre + 1. * agent.stdUtil) * 100) + 1,
|
---|
90 | 100);
|
---|
91 | HashSet<Bid> searchBids = new HashSet<Bid>();
|
---|
92 | for (int i = lbInd; i <= ubInd; i++) {
|
---|
93 | searchBids.addAll(agent.hashBids.get(i));
|
---|
94 | }
|
---|
95 | if (agent.DMC.timeline.getTime() > 0.99 * agent.delta
|
---|
96 | && searchBids.size() < 1) {
|
---|
97 | for (int i = ubInd + 1; i <= 100; i++) {
|
---|
98 | searchBids.addAll(agent.hashBids.get(i));
|
---|
99 | }
|
---|
100 | }
|
---|
101 | MaxOops.log3.println("ubInd = " + ubInd + "lbInd = " + lbInd
|
---|
102 | + "f_thre = " + f_thre + ", bids size =" + searchBids.size());
|
---|
103 | Iterator<Bid> bidIter = searchBids.iterator();
|
---|
104 | Random rand = new Random((long) (f_thre * 10000) % 1001);
|
---|
105 | while (bidIter.hasNext()) {
|
---|
106 | Bid bid = bidIter.next();
|
---|
107 | double sumOfPayoffs = 0.;
|
---|
108 | for (int i = 0; i < agent.numParties; i++) {
|
---|
109 | if (i == agent.numParties - 1) {
|
---|
110 | sumOfPayoffs += myUtilitySpace.getUtility(bid);
|
---|
111 | break;
|
---|
112 | }
|
---|
113 | double sim1 = payoffs[i].getSimilarity(firstBid[i], bid) * 0.3
|
---|
114 | * rand.nextFloat();
|
---|
115 | double sim2 = payoffs[i].getSimilarity(bestBid[i], bid) * 0.2
|
---|
116 | * rand.nextFloat();
|
---|
117 | double sim3 = payoffs[i].getSimilarity(lastBid[i], bid) * 0.1
|
---|
118 | * rand.nextFloat();
|
---|
119 | sumOfPayoffs += payoffs[i].getPayoff(bid)
|
---|
120 | + (sim1 + sim2 + sim3) * rand.nextFloat()
|
---|
121 | * agent.stdUtil * 10;
|
---|
122 | }
|
---|
123 | bidsBySumOfPayoffs.add(new BidDetails(bid, sumOfPayoffs,
|
---|
124 | myUtilitySpace.getUtility(bid)));
|
---|
125 | }
|
---|
126 | if (bidsBySumOfPayoffs.isEmpty()) {
|
---|
127 | return null;
|
---|
128 | }
|
---|
129 | return bidsBySumOfPayoffs.getBestBidDetails().getBid();
|
---|
130 | }
|
---|
131 |
|
---|
132 | public Matrix normalise(Matrix x) {
|
---|
133 | double min = 0, max = 0;
|
---|
134 | double[][] arr = x.getArray();
|
---|
135 | for (double[] vec : arr) {
|
---|
136 | for (double val : vec) {
|
---|
137 | min = Math.min(min, val);
|
---|
138 | max = Math.max(max, val);
|
---|
139 | }
|
---|
140 | }
|
---|
141 | x = x.plus(new Matrix(agent.numIssues, 1, Math.abs(min)));
|
---|
142 | x = x.times(1. / x.norm1());
|
---|
143 | return x;
|
---|
144 | }
|
---|
145 |
|
---|
146 | public Matrix getMatrixFromBids(List<Bid> bids) {
|
---|
147 | int rows = bids.size();
|
---|
148 | Matrix X = new Matrix(rows, agent.numIssues);
|
---|
149 | for (int i = 0; i < rows; i++) {
|
---|
150 | X.setMatrix(new int[] { i }, 0, agent.numIssues - 1,
|
---|
151 | getVectorFromBid(bids.get(i)).transpose());
|
---|
152 | }
|
---|
153 | return X;
|
---|
154 | }
|
---|
155 |
|
---|
156 | public List<Value> getValuesFromBid(Bid bid) {
|
---|
157 | Objective root = agent.domain.getObjectivesRoot();
|
---|
158 | List<Value> values = new ArrayList<Value>();
|
---|
159 | for (Enumeration<Objective> issueEnum = root
|
---|
160 | .getPreorderIssueEnumeration(); issueEnum.hasMoreElements();) {
|
---|
161 | Objective is = (Objective) issueEnum.nextElement();
|
---|
162 | Evaluator eval = (Evaluator) fEvaluators.get(is);
|
---|
163 | EVALUATORTYPE type = eval.getType();
|
---|
164 | switch (type) {
|
---|
165 | case REAL:
|
---|
166 | try {
|
---|
167 | values.add((ValueReal) bid.getValue(is.getNumber()));
|
---|
168 | } catch (Exception e) {
|
---|
169 | // TODO Auto-generated catch block
|
---|
170 | e.printStackTrace();
|
---|
171 | }
|
---|
172 | break;
|
---|
173 | case DISCRETE:
|
---|
174 | try {
|
---|
175 | values.add((ValueDiscrete) bid.getValue(is.getNumber()));
|
---|
176 | } catch (Exception e) {
|
---|
177 | // TODO Auto-generated catch block
|
---|
178 | e.printStackTrace();
|
---|
179 | }
|
---|
180 | break;
|
---|
181 | case INTEGER:
|
---|
182 | values.add((ValueInteger) bid.getValue(is.getNumber()));
|
---|
183 | break;
|
---|
184 | default:
|
---|
185 | break;
|
---|
186 | }
|
---|
187 | }
|
---|
188 | return values;
|
---|
189 | }
|
---|
190 |
|
---|
191 | public Matrix getVectorFromBid(Bid bid) {
|
---|
192 | Objective root = agent.domain.getObjectivesRoot();
|
---|
193 | Matrix x = new Matrix(agent.numIssues, 1);
|
---|
194 | int i = 0;
|
---|
195 | for (Enumeration<Objective> issueEnum = root
|
---|
196 | .getPreorderIssueEnumeration(); issueEnum.hasMoreElements();) {
|
---|
197 | Objective is = (Objective) issueEnum.nextElement();
|
---|
198 | Evaluator eval = (Evaluator) fEvaluators.get(is);
|
---|
199 | double xi = 0;
|
---|
200 | EVALUATORTYPE type = eval.getType();
|
---|
201 | switch (type) {
|
---|
202 | case REAL:
|
---|
203 | EvaluatorReal evalReal = (EvaluatorReal) eval;
|
---|
204 | try {
|
---|
205 | xi = evalReal.getEvaluation(((ValueReal) bid.getValue(is
|
---|
206 | .getNumber())).getValue());
|
---|
207 | } catch (Exception e) {
|
---|
208 | // TODO Auto-generated catch block
|
---|
209 | e.printStackTrace();
|
---|
210 | }
|
---|
211 | break;
|
---|
212 | case DISCRETE:
|
---|
213 | EvaluatorDiscrete evalDis = (EvaluatorDiscrete) eval;
|
---|
214 | try {
|
---|
215 | xi = evalDis.getEvaluation((ValueDiscrete) bid.getValue(is
|
---|
216 | .getNumber()));
|
---|
217 | } catch (Exception e) {
|
---|
218 | // TODO Auto-generated catch block
|
---|
219 | e.printStackTrace();
|
---|
220 | }
|
---|
221 | break;
|
---|
222 | case INTEGER:
|
---|
223 | EvaluatorInteger evalInt = (EvaluatorInteger) eval;
|
---|
224 | xi = evalInt.getEvaluation(((ValueInteger) bid.getValue(is
|
---|
225 | .getNumber())).getValue());
|
---|
226 | break;
|
---|
227 | default:
|
---|
228 | xi = eval.getEvaluation(myUtilitySpace, bid, is.getNumber());
|
---|
229 | break;
|
---|
230 | }
|
---|
231 | x.set(i++, 0, xi);
|
---|
232 | }
|
---|
233 | return x;
|
---|
234 | }
|
---|
235 | }
|
---|
236 |
|
---|
237 | class Payoff {
|
---|
238 |
|
---|
239 | protected final int updateIterationLimit;
|
---|
240 |
|
---|
241 | int opponent;
|
---|
242 | MaxOops agent;
|
---|
243 | Matrix w;
|
---|
244 | AdditiveUtilitySpace myUtilitySpace;
|
---|
245 | OPTComponent mother;
|
---|
246 | List<Bid> minibatchBidList;
|
---|
247 | int minibatchUpdateSize;
|
---|
248 | List<Map<Value, Integer>> freq;
|
---|
249 | List<Map<Value, Double>> eval;
|
---|
250 | double lastAvgPayoff;
|
---|
251 | private int iteration = 0;
|
---|
252 | private Matrix mem = null, g = null, g2 = null;
|
---|
253 |
|
---|
254 | public Payoff(int opponent, MaxOops agent,
|
---|
255 | AdditiveUtilitySpace myUtilitySpace, OPTComponent mother) {
|
---|
256 | agent.params.addParam("OPTComponent.updateIterationLimit", 50);
|
---|
257 | this.updateIterationLimit = (int) agent.params
|
---|
258 | .getParam("OPTComponent.updateIterationLimit");
|
---|
259 | this.opponent = opponent;
|
---|
260 | this.iteration = 0;
|
---|
261 | this.agent = agent;
|
---|
262 | this.myUtilitySpace = myUtilitySpace;
|
---|
263 | this.minibatchBidList = new ArrayList<Bid>();
|
---|
264 | this.minibatchUpdateSize = 10;
|
---|
265 | this.mother = mother;
|
---|
266 | this.lastAvgPayoff = agent.secMaxUtil;
|
---|
267 | this.w = new Matrix(agent.numIssues, 1, 1. / agent.numIssues);
|
---|
268 | this.w = this.w.plus(mother.w).times(0.5);
|
---|
269 | this.freq = new ArrayList<Map<Value, Integer>>();
|
---|
270 | this.eval = new ArrayList<Map<Value, Double>>();
|
---|
271 | Objective root = agent.domain.getObjectivesRoot();
|
---|
272 | for (Enumeration<Objective> issueEnum = root
|
---|
273 | .getPreorderIssueEnumeration(); issueEnum.hasMoreElements();) {
|
---|
274 | Map<Value, Integer> valuesFreq = new HashMap<Value, Integer>();
|
---|
275 | Map<Value, Double> valuesEval = new HashMap<Value, Double>();
|
---|
276 | Objective is = (Objective) issueEnum.nextElement();
|
---|
277 | Evaluator e = (Evaluator) mother.fEvaluators.get(is);
|
---|
278 | EVALUATORTYPE type = e.getType();
|
---|
279 | Double xi = 0.;
|
---|
280 | switch (type) {
|
---|
281 | case REAL:
|
---|
282 | EvaluatorReal evalReal = (EvaluatorReal) e;
|
---|
283 | Double range = evalReal.getUpperBound()
|
---|
284 | - evalReal.getLowerBound();
|
---|
285 | for (Integer vi = 0; vi < 500; vi++) {
|
---|
286 | valuesFreq.put(new ValueInteger(vi), 0);
|
---|
287 | try {
|
---|
288 | Double v = range * vi / 500. + evalReal.getLowerBound();
|
---|
289 | xi = evalReal.getEvaluation(v);
|
---|
290 | } catch (Exception err) {
|
---|
291 | // TODO Auto-generated catch block
|
---|
292 | err.printStackTrace();
|
---|
293 | }
|
---|
294 | valuesEval.put(new ValueInteger(vi), xi);
|
---|
295 | }
|
---|
296 | break;
|
---|
297 | case DISCRETE:
|
---|
298 | EvaluatorDiscrete evalDis = (EvaluatorDiscrete) e;
|
---|
299 | Set<ValueDiscrete> values = evalDis.getValues();
|
---|
300 | for (ValueDiscrete v : values) {
|
---|
301 | valuesFreq.put(v, 0);
|
---|
302 | try {
|
---|
303 | xi = evalDis.getEvaluation(v);
|
---|
304 | } catch (Exception err) {
|
---|
305 | // TODO Auto-generated catch block
|
---|
306 | err.printStackTrace();
|
---|
307 | }
|
---|
308 | valuesEval.put(v, xi);
|
---|
309 | }
|
---|
310 | break;
|
---|
311 | case INTEGER:
|
---|
312 | EvaluatorInteger evalInt = (EvaluatorInteger) e;
|
---|
313 | for (Integer v = evalInt.getLowerBound(); v <= evalInt
|
---|
314 | .getUpperBound(); v++) {
|
---|
315 | valuesFreq.put(new ValueInteger(v), 0);
|
---|
316 | xi = evalInt.getEvaluation(v);
|
---|
317 | valuesEval.put(new ValueInteger(v), xi);
|
---|
318 | }
|
---|
319 | break;
|
---|
320 | default:
|
---|
321 | break;
|
---|
322 | }
|
---|
323 | this.freq.add(valuesFreq);
|
---|
324 | this.eval.add(valuesEval);
|
---|
325 | }
|
---|
326 | }
|
---|
327 |
|
---|
328 | public void updateFrequency(Bid bid) {
|
---|
329 | List<Value> values = mother.getValuesFromBid(bid);
|
---|
330 | Objective root = agent.domain.getObjectivesRoot();
|
---|
331 | int i = 0;
|
---|
332 | for (Enumeration<Objective> issueEnum = root
|
---|
333 | .getPreorderIssueEnumeration(); issueEnum.hasMoreElements();) {
|
---|
334 | Objective is = (Objective) issueEnum.nextElement();
|
---|
335 | Evaluator e = (Evaluator) mother.fEvaluators.get(is);
|
---|
336 | EVALUATORTYPE type = e.getType();
|
---|
337 | switch (type) {
|
---|
338 | case REAL:
|
---|
339 | EvaluatorReal evalReal = (EvaluatorReal) e;
|
---|
340 | Double v = ((ValueReal) values.get(i)).getValue();
|
---|
341 | Double range = evalReal.getUpperBound()
|
---|
342 | - evalReal.getLowerBound();
|
---|
343 | Integer vi = (int) ((v - evalReal.getLowerBound()) * 500. / range);
|
---|
344 | ValueInteger Vi = new ValueInteger(vi);
|
---|
345 | this.freq.get(i).put(Vi, 1 + this.freq.get(i).get(Vi));
|
---|
346 | break;
|
---|
347 | case DISCRETE:
|
---|
348 | if (!this.freq.get(i).containsKey(values.get(i))) {
|
---|
349 | this.freq.get(i).put(values.get(i), 1);
|
---|
350 | } else {
|
---|
351 | this.freq.get(i).put(values.get(i),
|
---|
352 | 1 + this.freq.get(i).get(values.get(i)));
|
---|
353 | }
|
---|
354 | break;
|
---|
355 | case INTEGER:
|
---|
356 | if (!this.freq.get(i).containsKey(values.get(i))) {
|
---|
357 | this.freq.get(i).put(values.get(i), 1);
|
---|
358 | } else {
|
---|
359 | this.freq.get(i).put(values.get(i),
|
---|
360 | 1 + this.freq.get(i).get(values.get(i)));
|
---|
361 | }
|
---|
362 | break;
|
---|
363 | default:
|
---|
364 | break;
|
---|
365 | }
|
---|
366 | i++;
|
---|
367 | }
|
---|
368 | }
|
---|
369 |
|
---|
370 | public void updateEvaluation() {
|
---|
371 | if (iteration >= updateIterationLimit / 2) {
|
---|
372 | return;
|
---|
373 | }
|
---|
374 | for (int i = 0; i < this.freq.size(); i++) {
|
---|
375 | double time = agent.DMC.timeline.getTime();
|
---|
376 | Double maxOfLogFreq = 0.;
|
---|
377 | for (Integer f : this.freq.get(i).values()) {
|
---|
378 | maxOfLogFreq = Math.max(Math.log(f + 1), maxOfLogFreq);
|
---|
379 | }
|
---|
380 | double wt = (0.5 - time) / 3.;
|
---|
381 | for (Value e : this.eval.get(i).keySet()) {
|
---|
382 | Integer f = this.freq.get(i).get(e);
|
---|
383 | Double ori = this.eval.get(i).get(e);
|
---|
384 | this.eval.get(i).put(e,
|
---|
385 | ori * (1 - wt) + wt * (Math.log(f + 1) / maxOfLogFreq));
|
---|
386 | }
|
---|
387 | Double maxOfEvals = 0.;
|
---|
388 | for (Double e : this.eval.get(i).values()) {
|
---|
389 | maxOfEvals = Math.max(e, maxOfEvals);
|
---|
390 | }
|
---|
391 | for (Value e : this.eval.get(i).keySet()) {
|
---|
392 | this.eval.get(i).put(e, this.eval.get(i).get(e) / maxOfEvals);
|
---|
393 | }
|
---|
394 | }
|
---|
395 | }
|
---|
396 |
|
---|
397 | public void initWeights(Bid firstBid) {
|
---|
398 | iteration = 1;
|
---|
399 | this.updateFrequency(firstBid);
|
---|
400 | Matrix tw = mother.normalise(mother.getVectorFromBid(firstBid));
|
---|
401 | double min = 0, max = 0;
|
---|
402 | double[][] arr = tw.getArray();
|
---|
403 | for (double[] vec : arr) {
|
---|
404 | for (double val : vec) {
|
---|
405 | min = Math.min(min, val);
|
---|
406 | max = Math.max(max, val);
|
---|
407 | }
|
---|
408 | }
|
---|
409 | double updateWeight = 1. / (1. + (max - min));
|
---|
410 | this.w = tw.times(updateWeight).plus(this.w.times(1 - updateWeight));
|
---|
411 | }
|
---|
412 |
|
---|
413 | public void updateWeights(Bid newBid) {
|
---|
414 | if (iteration >= updateIterationLimit
|
---|
415 | && agent.DMC.timeline.getTime() > 0.6) {
|
---|
416 | return;
|
---|
417 | }
|
---|
418 | this.updateFrequency(newBid);
|
---|
419 | minibatchBidList.add(newBid);
|
---|
420 | if (minibatchBidList.size() < minibatchUpdateSize) {
|
---|
421 | return;
|
---|
422 | }
|
---|
423 | this.updateEvaluation();
|
---|
424 | iteration += 1;
|
---|
425 | Matrix tw = w.copy();
|
---|
426 | Matrix X = mother.getMatrixFromBids(minibatchBidList);
|
---|
427 | Matrix y = new Matrix(minibatchUpdateSize, 1, lastAvgPayoff);
|
---|
428 | Matrix y_ = X.times(w);
|
---|
429 | Matrix dfdw = new Matrix(agent.numIssues, 1);
|
---|
430 | dfdw = X.transpose().times(y_.minus(y)).times(2. / minibatchUpdateSize);
|
---|
431 | lastAvgPayoff = y_.norm1() / minibatchUpdateSize;
|
---|
432 | minibatchBidList.clear();
|
---|
433 | Matrix ones = new Matrix(agent.numIssues, 1, 1.);
|
---|
434 | Matrix zeros = new Matrix(agent.numIssues, 1);
|
---|
435 | if (mem == null || g == null || g2 == null) {
|
---|
436 | mem = ones.copy();
|
---|
437 | g = zeros.copy();
|
---|
438 | g2 = zeros.copy();
|
---|
439 | }
|
---|
440 | Matrix r = ones.arrayRightDivide(mem.plus(ones));
|
---|
441 | g = g.arrayTimes(ones.minus(r)).plus(r.arrayTimes(dfdw));
|
---|
442 | g2 = g2.arrayTimes(ones.minus(r)).plus(
|
---|
443 | r.arrayTimes(dfdw.arrayTimes(dfdw)));
|
---|
444 | mem = mem.arrayTimes(ones.times(1 - mother.flrate)).plus(ones);
|
---|
445 | Matrix alrate = g.arrayTimes(g).arrayRightDivide(
|
---|
446 | g2.plus(ones.times(1e-13)));
|
---|
447 | for (int i = 0; i < agent.numIssues; i++) {
|
---|
448 | double alrateij = Math.min(alrate.get(i, 0), mother.flrate);
|
---|
449 | alrate.set(i, 0, alrateij / (Math.sqrt(g2.get(i, 0)) + 1e-13));
|
---|
450 | }
|
---|
451 | double avgPayoffDiff = dfdw.norm1();
|
---|
452 | tw = mother.normalise(tw.minus(dfdw.arrayTimes(alrate))).times(
|
---|
453 | avgPayoffDiff);
|
---|
454 | tw = tw.plus(w.times(1. - avgPayoffDiff));
|
---|
455 | double min = 0, max = 0;
|
---|
456 | double[][] arr = tw.getArray();
|
---|
457 | for (double[] vec : arr) {
|
---|
458 | for (double val : vec) {
|
---|
459 | min = Math.min(min, val);
|
---|
460 | max = Math.max(max, val);
|
---|
461 | }
|
---|
462 | }
|
---|
463 | this.w = tw;
|
---|
464 | }
|
---|
465 |
|
---|
466 | public double getPayoff(Bid bid) {
|
---|
467 | double payoff = 0;
|
---|
468 | payoff = w.arrayTimes(getVectorFromBid(bid)).norm1();
|
---|
469 | return payoff;
|
---|
470 | }
|
---|
471 |
|
---|
472 | public double getSimilarity(Bid bid1, Bid bid2) {
|
---|
473 | try {
|
---|
474 | Matrix x1 = getVectorFromBid(bid1);
|
---|
475 | Matrix x2 = getVectorFromBid(bid2);
|
---|
476 | return (x1.arrayTimes(x2)).norm1() * 1. / x1.norm1() / x2.norm1();
|
---|
477 | } catch (Exception err) {
|
---|
478 | return 0;
|
---|
479 | }
|
---|
480 | }
|
---|
481 |
|
---|
482 | public Matrix getVectorFromBid(Bid bid) {
|
---|
483 | Matrix x = new Matrix(agent.numIssues, 1);
|
---|
484 | List<Value> values = mother.getValuesFromBid(bid);
|
---|
485 | int i = 0;
|
---|
486 | Objective root = agent.domain.getObjectivesRoot();
|
---|
487 | for (Enumeration<Objective> issueEnum = root
|
---|
488 | .getPreorderIssueEnumeration(); issueEnum.hasMoreElements();) {
|
---|
489 | Objective is = (Objective) issueEnum.nextElement();
|
---|
490 | Evaluator e = (Evaluator) mother.fEvaluators.get(is);
|
---|
491 | EVALUATORTYPE type = e.getType();
|
---|
492 | switch (type) {
|
---|
493 | case REAL:
|
---|
494 | EvaluatorReal evalReal = (EvaluatorReal) e;
|
---|
495 | Double v = ((ValueReal) values.get(i)).getValue();
|
---|
496 | Double range = evalReal.getUpperBound()
|
---|
497 | - evalReal.getLowerBound();
|
---|
498 | Integer vi = (int) ((v - evalReal.getLowerBound()) * 500. / range);
|
---|
499 | ValueInteger Vi = new ValueInteger(vi);
|
---|
500 | x.set(i, 0, this.eval.get(i).get(Vi));
|
---|
501 | break;
|
---|
502 | case DISCRETE:
|
---|
503 | x.set(i, 0, this.eval.get(i).get(values.get(i)));
|
---|
504 | break;
|
---|
505 | case INTEGER:
|
---|
506 | x.set(i, 0, this.eval.get(i).get(values.get(i)));
|
---|
507 | break;
|
---|
508 | default:
|
---|
509 | break;
|
---|
510 | }
|
---|
511 | i++;
|
---|
512 | }
|
---|
513 | return x;
|
---|
514 | }
|
---|
515 |
|
---|
516 | } |
---|