1 | /**
|
---|
2 | * OptimalBidder: using the optimal stopping rule (cutoffs) for bidding.
|
---|
3 | * B_{j+1} = 1/2 + 1/2 B_j^2
|
---|
4 | * @author rafik
|
---|
5 | ************************************************************************************************************************************/
|
---|
6 |
|
---|
7 | package agents;
|
---|
8 |
|
---|
9 | import java.util.HashMap;
|
---|
10 |
|
---|
11 | import genius.core.issue.ISSUETYPE;
|
---|
12 | import genius.core.issue.IssueDiscrete;
|
---|
13 | import genius.core.issue.Value;
|
---|
14 | import genius.core.issue.ValueDiscrete;
|
---|
15 | import genius.core.utility.AdditiveUtilitySpace;
|
---|
16 | import genius.core.utility.Evaluator;
|
---|
17 | import genius.core.utility.EvaluatorDiscrete;
|
---|
18 |
|
---|
19 | public class OptimalBidderSimpleU extends OptimalBidderU {
|
---|
20 | private static double rvB;
|
---|
21 |
|
---|
22 | public void init() {
|
---|
23 | partitions = 1000;
|
---|
24 | super.init();
|
---|
25 | }
|
---|
26 |
|
---|
27 | @Override
|
---|
28 | public String getName() {
|
---|
29 | return "OptimalBidderSimpleU";
|
---|
30 | }
|
---|
31 |
|
---|
32 | /**
|
---|
33 | * computation of the bid for round j as in prop 4.3
|
---|
34 | *
|
---|
35 | * @param round
|
---|
36 | * j
|
---|
37 | * @return bid value
|
---|
38 | **/
|
---|
39 | @Override
|
---|
40 | public double bid(int j) {
|
---|
41 | if (j == 1)
|
---|
42 | return 0.5 + 0.5 * rvB;
|
---|
43 | else
|
---|
44 | return 0.5 + 0.5 * Math.pow(bid(j - 1), 2);
|
---|
45 | }
|
---|
46 |
|
---|
47 | /**
|
---|
48 | * reservation value: if the reservation value is already set (<> -1.0)
|
---|
49 | * simply return it, otherwise get it from the utility space
|
---|
50 | *
|
---|
51 | * @param double
|
---|
52 | * @return double
|
---|
53 | * @throws Exception
|
---|
54 | **/
|
---|
55 | @Override
|
---|
56 | public double getReservationValue(double arg) throws Exception {
|
---|
57 | boolean flag = true;
|
---|
58 | double rv = 0.0;
|
---|
59 |
|
---|
60 | if (arg == -1.0) // first time // TODO rmeove the -1, rv, etc.
|
---|
61 | {
|
---|
62 | if (pie.getType().equals(ISSUETYPE.DISCRETE)) // get/set rvB...
|
---|
63 | {
|
---|
64 | IssueDiscrete discrete_pie = (IssueDiscrete) pie;
|
---|
65 | int nvalues = discrete_pie.getNumberOfValues();
|
---|
66 | print(" nvalues = " + nvalues);
|
---|
67 | values = new HashMap<Integer, Value>(nvalues);
|
---|
68 |
|
---|
69 | for (int i = 0; i < nvalues; i++) {
|
---|
70 | ValueDiscrete value = discrete_pie.getValue(i);
|
---|
71 | Evaluator evaluator = ((AdditiveUtilitySpace) utilitySpace)
|
---|
72 | .getEvaluator(pie.getNumber());
|
---|
73 | Integer evaluation = ((EvaluatorDiscrete) evaluator)
|
---|
74 | .getValue((ValueDiscrete) value);
|
---|
75 | values.put(i, value);
|
---|
76 |
|
---|
77 | if (evaluation != 0 && flag) // reaching rvB
|
---|
78 | {
|
---|
79 | rv = (double) i / partitions; // rvB normalized
|
---|
80 | utilitySpace.setReservationValue(rv); // TODO no need
|
---|
81 | // for this,
|
---|
82 | // remove it.
|
---|
83 | flag = false;
|
---|
84 | print(" rvB = " + rv);
|
---|
85 | }
|
---|
86 | }
|
---|
87 | return rv;
|
---|
88 | } else {
|
---|
89 | throw new Exception("Type " + pie.getType()
|
---|
90 | + " not supported by " + getName());
|
---|
91 | }
|
---|
92 | } else {
|
---|
93 | return arg;
|
---|
94 | }
|
---|
95 | }
|
---|
96 |
|
---|
97 | /**
|
---|
98 | * U_{j+1} : utility cutoffs
|
---|
99 | *
|
---|
100 | * @param int
|
---|
101 | * @return double
|
---|
102 | * @throws Exception
|
---|
103 | **/
|
---|
104 |
|
---|
105 | @Override
|
---|
106 | public double utility(int j) {
|
---|
107 | return (Math.pow(bid(j), 2) - rvB) / (1 - rvB);
|
---|
108 | }
|
---|
109 |
|
---|
110 | } // end |
---|