source: src/main/java/parties/in4010/q12015/group9/OpponentModeling.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: 5.6 KB
Line 
1package parties.in4010.q12015.group9;
2
3import java.util.HashMap;
4import java.util.Map.Entry;
5
6import genius.core.BidHistory;
7import genius.core.Domain;
8import genius.core.actions.Action;
9import genius.core.bidding.BidDetails;
10import genius.core.issue.Issue;
11import genius.core.issue.IssueDiscrete;
12import genius.core.issue.Objective;
13import genius.core.issue.ValueDiscrete;
14import genius.core.utility.AdditiveUtilitySpace;
15import genius.core.utility.Evaluator;
16import genius.core.utility.EvaluatorDiscrete;
17
18public class OpponentModeling {
19 private HashMap<Object, AdditiveUtilitySpace> opponentUtilities;// Object is
20 // other
21 // agent objects
22 // used to identify
23 // them,
24 // utilityspaces are
25 // current estimates
26 private Domain currentDomain;
27 private AdditiveUtilitySpace ourUtility;
28 private double learnCoef = 0.2;
29 private int learnValueAddition = 1;
30 private int amountOfIssues;
31
32 public OpponentModeling(AdditiveUtilitySpace ownUtility) {
33 ourUtility = ownUtility;
34 currentDomain = ourUtility.getDomain();
35 opponentUtilities = new HashMap<Object, AdditiveUtilitySpace>();
36 }
37
38 // Simple getter
39 public HashMap<Object, AdditiveUtilitySpace> getOpponentUtilities() {
40 return opponentUtilities;
41 }
42
43 // Determines the difference between bids given the opponent's prevoius
44 // Utility Space
45 private HashMap<Integer, Integer> determineDifference(
46 AdditiveUtilitySpace thisSpace, BidDetails first, BidDetails second) {
47
48 HashMap<Integer, Integer> diff = new HashMap<Integer, Integer>();
49 try {
50 for (Issue i : thisSpace.getDomain().getIssues()) {
51 diff.put(i.getNumber(), (((ValueDiscrete) first.getBid()
52 .getValue(i.getNumber())).equals((ValueDiscrete) second
53 .getBid().getValue(i.getNumber()))) ? 0 : 1);
54 }
55 } catch (Exception ex) {
56 ex.printStackTrace();
57 }
58
59 return diff;
60 }
61
62 // This is called whenever a message is received
63 public void updateModel(Object agent, Action action,
64 HashMap<Object, BidHistory> previousBidsMap) {
65 if (!opponentUtilities.containsKey(agent)) {
66 createNewModel(agent);
67 }
68 AdditiveUtilitySpace updatedSpace = opponentUtilities.get(agent);
69 // updating Utility space, both for accepting actions and new offer
70 // actions, will probably want to split those completely
71 if (previousBidsMap.get(agent).size() < 2) {
72 return;
73 }
74 int numberOfUnchanged = 0;
75 BidDetails oppBid = previousBidsMap.get(agent).getHistory()
76 .get(previousBidsMap.get(agent).size() - 1);
77 BidDetails prevOppBid = previousBidsMap.get(agent).getHistory()
78 .get(previousBidsMap.get(agent).size() - 2);
79 HashMap<Integer, Integer> lastDiffSet = determineDifference(
80 updatedSpace, prevOppBid, oppBid);
81
82 // count the number of changes in value
83 for (Integer i : lastDiffSet.keySet()) {
84 if (lastDiffSet.get(i) == 0)
85 numberOfUnchanged++;
86 }
87 // This is the value to be added to weights of unchanged issues before
88 // normalization.
89 // Also the value that is taken as the minimum possible weight,
90 // (therefore defining the maximum possible also).
91 double goldenValue = learnCoef / (double) amountOfIssues;
92 // The total sum of weights before normalization.
93 double totalSum = 1D + goldenValue * (double) numberOfUnchanged;
94 // The maximum possible weight
95 double maximumWeight = 1D - ((double) amountOfIssues) * goldenValue
96 / totalSum;
97
98 // re-weighing issues while making sure that the sum remains 1
99 for (Integer i : lastDiffSet.keySet()) {
100 if (lastDiffSet.get(i) == 0
101 && updatedSpace.getWeight(i) < maximumWeight)
102 updatedSpace.setWeight(updatedSpace.getDomain()
103 .getObjectivesRoot().getObjective(i),
104 (updatedSpace.getWeight(i) + goldenValue) / totalSum);
105 else
106 updatedSpace.setWeight(updatedSpace.getDomain()
107 .getObjectivesRoot().getObjective(i),
108 updatedSpace.getWeight(i) / totalSum);
109 }
110 // Then for each issue value that has been offered last time, a constant
111 // value is added to its corresponding ValueDiscrete.
112 try {
113 for (Entry<Objective, Evaluator> e : updatedSpace.getEvaluators()) {
114 // cast issue to discrete and retrieve value. Next, add constant
115 // learnValueAddition to the current preference of the value to
116 // make
117 // it more important
118 ((EvaluatorDiscrete) e.getValue())
119 .setEvaluation(
120 oppBid.getBid().getValue(
121 ((IssueDiscrete) e.getKey())
122 .getNumber()),
123 (learnValueAddition + ((EvaluatorDiscrete) e
124 .getValue())
125 .getEvaluationNotNormalized(((ValueDiscrete) oppBid
126 .getBid().getValue(
127 ((IssueDiscrete) e
128 .getKey())
129 .getNumber())))));
130 }
131 } catch (Exception ex) {
132 ex.printStackTrace();
133 }
134 opponentUtilities.put(agent, updatedSpace);
135 }
136
137 // creates standard UtilitySpace model given no current information
138 private void createNewModel(Object agent) {
139 // UtilitySpace newUtilitySpace = new UtilitySpace(currentDomain);
140 AdditiveUtilitySpace newUtilitySpace = new AdditiveUtilitySpace(
141 ourUtility);
142 // set all issue weights to be equal and evaluations 1)
143 amountOfIssues = newUtilitySpace.getDomain().getIssues().size();
144 double commonWeight = 1D / (double) amountOfIssues;
145
146 // initialize the weights
147 for (Entry<Objective, Evaluator> e : newUtilitySpace.getEvaluators()) {
148 // set the issue weights
149 newUtilitySpace.unlock(e.getKey());
150 e.getValue().setWeight(commonWeight);
151 try {
152 // set all value weights to one (they are normalized when
153 // calculating the utility)
154 for (ValueDiscrete vd : ((IssueDiscrete) e.getKey())
155 .getValues())
156 ((EvaluatorDiscrete) e.getValue()).setEvaluation(vd, 1);
157 } catch (Exception ex) {
158 ex.printStackTrace();
159 }
160 }
161
162 opponentUtilities.put(agent, newUtilitySpace);
163 }
164
165}
Note: See TracBrowser for help on using the repository browser.