source: src/main/java/agents/anac/y2010/AgentK/Agent_K.java@ 126

Last change on this file since 126 was 126, checked in by Aron Hammond, 6 years ago

Added function to calculate opposition to MultiLateralAnalysis.java

Moved code to add RLBOA listeners to RLBOAUtils is misc package

Added input for strategyParameters to SessionPanel (gui)

!! close SessionInfo after tournament; this caused /tmp/ to fill up with GeniusData files

Our own package:

  • Added opponents and strategies that are mentioned in the report
  • Change class hierarchy, agents can now extend from RLBOAagentBilateral to inherit RL functionality.
  • States extend from AbstractState
File size: 6.8 KB
Line 
1package agents.anac.y2010.AgentK;
2
3import java.util.ArrayList;
4import java.util.HashMap;
5import java.util.List;
6import java.util.Random;
7
8import genius.core.Agent;
9import genius.core.Bid;
10import genius.core.actions.Accept;
11import genius.core.actions.Action;
12import genius.core.actions.ActionWithBid;
13import genius.core.actions.Offer;
14import genius.core.issue.Issue;
15import genius.core.issue.IssueDiscrete;
16import genius.core.issue.IssueInteger;
17import genius.core.issue.IssueReal;
18import genius.core.issue.Value;
19import genius.core.issue.ValueInteger;
20import genius.core.issue.ValueReal;
21
22/**
23 * ANAC2010 competitor AgentK.
24 */
25public class Agent_K extends Agent {
26
27 private Action partner = null;
28 private HashMap<Bid, Double> offeredBidMap;
29 private double target;
30 private double bidTarget;
31 private double sum;
32 private double sum2;
33 private int rounds;
34 private double tremor;
35 private final boolean TEST_EQUIVALENCE = false;
36 private Random random100;
37 private Random random200;
38 private Random random300;
39 private Random random400;
40
41 @Override
42 public void init() {
43 offeredBidMap = new HashMap<Bid, Double>();
44 target = 1.0;
45 bidTarget = 1.0;
46 sum = 0.0;
47 sum2 = 0.0;
48 rounds = 0;
49 tremor = 2.0;
50
51 if (TEST_EQUIVALENCE) {
52 random100 = new Random(100);
53 random200 = new Random(200);
54 random300 = new Random(300);
55 random400 = new Random(400);
56 } else {
57 random100 = new Random();
58 random200 = new Random();
59 random300 = new Random();
60 random400 = new Random();
61 }
62 }
63
64 @Override
65 public String getVersion() {
66 return "0.314";
67 }
68
69 @Override
70 public String getName() {
71 return "Agent_K";
72 }
73
74 @Override
75 public void ReceiveMessage(Action opponentAction) {
76 partner = opponentAction;
77 }
78
79 @Override
80 public Action chooseAction() {
81 Action action = null;
82 try {
83 if (partner == null) {
84 action = selectBid();
85 }
86 if (partner instanceof Offer) {
87 Bid offeredBid = ((Offer) partner).getBid();
88
89 double p = acceptProbability(offeredBid);
90
91 if (p > random100.nextDouble()) {
92 action = new Accept(getAgentID(), offeredBid);
93 } else {
94 action = selectBid();
95 }
96 }
97 } catch (Exception e) {
98 action = new Accept(getAgentID(),
99 ((ActionWithBid) partner).getBid());
100 }
101 return action;
102 }
103
104 private Action selectBid() {
105 Bid nextBid = null;
106
107 ArrayList<Bid> bidTemp = new ArrayList<Bid>();
108
109 for (Bid bid : offeredBidMap.keySet()) {
110 if (offeredBidMap.get(bid) > target) {
111 bidTemp.add(bid);
112 }
113 }
114
115 int size = bidTemp.size();
116 if (size > 0) {
117 int sindex = (int) Math.floor(random200.nextDouble() * size);
118 nextBid = bidTemp.get(sindex);
119 } else {
120 double searchUtil = 0.0;
121 try {
122 int loop = 0;
123 while (searchUtil < bidTarget) {
124 if (loop > 500) {
125 bidTarget -= 0.01;
126 loop = 0;
127 }
128 nextBid = searchBid();
129 searchUtil = utilitySpace.getUtility(nextBid);
130 loop++;
131 }
132 } catch (Exception e) {
133 }
134 }
135
136 if (nextBid == null) {
137 return (new Accept(getAgentID(),
138 ((ActionWithBid) partner).getBid()));
139 }
140 return (new Offer(getAgentID(), nextBid));
141 }
142
143 private Bid searchBid() throws Exception {
144 HashMap<Integer, Value> values = new HashMap<Integer, Value>();
145 List<Issue> issues = utilitySpace.getDomain().getIssues();
146
147 Bid bid = null;
148
149 for (Issue lIssue : issues) {
150 switch (lIssue.getType()) {
151 case DISCRETE:
152 IssueDiscrete lIssueDiscrete = (IssueDiscrete) lIssue;
153 int optionIndex = random300
154 .nextInt(lIssueDiscrete.getNumberOfValues());
155 values.put(lIssue.getNumber(),
156 lIssueDiscrete.getValue(optionIndex));
157 break;
158 case REAL:
159 IssueReal lIssueReal = (IssueReal) lIssue;
160 int optionInd = random300.nextInt(
161 lIssueReal.getNumberOfDiscretizationSteps() - 1);
162 values.put(lIssueReal.getNumber(),
163 new ValueReal(lIssueReal.getLowerBound() + (lIssueReal
164 .getUpperBound() - lIssueReal.getLowerBound())
165 * (optionInd) / (lIssueReal
166 .getNumberOfDiscretizationSteps())));
167 break;
168 case INTEGER:
169 IssueInteger lIssueInteger = (IssueInteger) lIssue;
170 int optionIndex2 = lIssueInteger.getLowerBound()
171 + random300.nextInt(lIssueInteger.getUpperBound()
172 - lIssueInteger.getLowerBound());
173 values.put(lIssueInteger.getNumber(),
174 new ValueInteger(optionIndex2));
175 break;
176 default:
177 throw new Exception("issue type " + lIssue.getType()
178 + " not supported by SimpleAgent2");
179 }
180 }
181 bid = new Bid(utilitySpace.getDomain(), values);
182 return bid;
183 }
184
185 double acceptProbability(Bid offeredBid) throws Exception {
186
187 double offeredUtility = utilitySpace.getUtility(offeredBid);
188 offeredBidMap.put(offeredBid, offeredUtility);
189
190 sum += offeredUtility;
191 sum2 += offeredUtility * offeredUtility;
192 rounds++;
193
194 double mean = sum / rounds;
195
196 double variance = (sum2 / rounds) - (mean * mean);
197
198 double deviation = Math.sqrt(variance * 12);
199 if (Double.isNaN(deviation)) {
200 deviation = 0.0;
201 }
202
203 // double time = ((new Date()).getTime() - startTime.getTime()) // get
204 // passed time in ms
205 // / (1000. * totalTime); // divide by 1000 * totalTime to get
206 // normalized time between 0 and 1
207 double time = timeline.getTime();
208 double t = time * time * time;
209
210 if (offeredUtility < 0 || offeredUtility > 1.05) {
211 throw new Exception("utility " + offeredUtility + " outside [0,1]");
212 }
213
214 if (t < 0 || t > 1) {
215 throw new Exception("time " + t + " outside [0,1]");
216 }
217
218 if (offeredUtility > 1.) {
219 offeredUtility = 1;
220 }
221 double estimateMax = mean + ((1 - mean) * deviation);
222
223 double alpha = 1 + tremor + (10 * mean) - (2 * tremor * mean);
224 double beta = alpha + (random400.nextDouble() * tremor) - (tremor / 2);
225
226 double preTarget = 1 - (Math.pow(time, alpha) * (1 - estimateMax));
227 double preTarget2 = 1 - (Math.pow(time, beta) * (1 - estimateMax));
228
229 double ratio = (deviation + 0.1) / (1 - preTarget);
230 if (Double.isNaN(ratio) || ratio > 2.0) {
231 ratio = 2.0;
232 }
233
234 double ratio2 = (deviation + 0.1) / (1 - preTarget2);
235 if (Double.isNaN(ratio2) || ratio2 > 2.0) {
236 ratio2 = 2.0;
237 }
238
239 target = ratio * preTarget + 1 - ratio;
240 bidTarget = ratio2 * preTarget2 + 1 - ratio2;
241
242 double m = t * (-300) + 400;
243 if (target > estimateMax) {
244 double r = target - estimateMax;
245 double f = 1 / (r * r);
246 if (f > m || Double.isNaN(f))
247 f = m;
248 double app = r * f / m;
249 target = target - app;
250 } else {
251 target = estimateMax;
252 }
253
254 if (bidTarget > estimateMax) {
255 double r = bidTarget - estimateMax;
256 double f = 1 / (r * r);
257 if (f > m || Double.isNaN(f))
258 f = m;
259 double app = r * f / m;
260 bidTarget = bidTarget - app;
261 } else {
262 bidTarget = estimateMax;
263 }
264
265 double utilityEvaluation = offeredUtility - estimateMax;
266 double satisfy = offeredUtility - target;
267
268 double p = (Math.pow(time, alpha) / 5) + utilityEvaluation + satisfy;
269 if (p < 0.1) {
270 p = 0.0;
271 }
272 return p;
273 }
274
275 @Override
276 public String getDescription() {
277 return "ANAC2010";
278 }
279
280}
Note: See TracBrowser for help on using the repository browser.