source: src/main/java/parties/in4010/q12015/group8/OpponentModel.java@ 127

Last change on this file since 127 was 1, checked in by Wouter Pasman, 6 years ago

Initial import : Genius 9.0.0

File size: 4.9 KB
Line 
1package parties.in4010.q12015.group8;
2
3import java.util.HashMap;
4import java.util.List;
5
6import genius.core.Bid;
7import genius.core.issue.Issue;
8import genius.core.issue.IssueDiscrete;
9import genius.core.issue.Value;
10import genius.core.issue.ValueDiscrete;
11import genius.core.utility.AdditiveUtilitySpace;
12
13public class OpponentModel {
14 private static final double FREQUENCY_THRESHOLD = 0.95;
15 private static final double ACCURACY_THRESHOLD = 0.8;
16 private static final double NEGLIGIBLE_WEIGHT_THRESHOLD = 0.05;
17
18 private HashMap<Issue, HashMap<Value, Double>> frequencies = new HashMap<Issue, HashMap<Value, Double>>();
19 private HashMap<Issue, Double> weights = new HashMap<Issue, Double>();
20 private double totalBids = 0.0;
21 private Bid previousBid = null;
22 private int updatedIssues = 0;
23 private AdditiveUtilitySpace utilitySpace;
24
25 /**
26 * Create OppentModel for current utility space
27 *
28 * @param utilitySpace
29 */
30 public OpponentModel(AdditiveUtilitySpace utilitySpace) {
31 this.utilitySpace = utilitySpace;
32 for (Issue issue : utilitySpace.getDomain().getIssues()) {
33 List<ValueDiscrete> values = ((IssueDiscrete) issue).getValues();
34 HashMap<Value, Double> valueMap = new HashMap<Value, Double>();
35
36 for (Value value : values) {
37 valueMap.put(value, 0.0);
38 }
39
40 frequencies.put(issue, valueMap);
41 weights.put(issue, 1.0 / utilitySpace.getDomain().getIssues()
42 .size());
43 }
44 }
45
46 public void updateOpponentModel(Bid bid) {
47 totalBids += 1.0;
48 for (int issueIndex = 0; issueIndex < bid.getIssues().size(); issueIndex++) {
49 // Update frequency values
50 updateFrequency(bid, issueIndex);
51 // Update issue weights
52 updateWeights(bid, issueIndex);
53 }
54
55 for (int issueIndex = 0; issueIndex < bid.getIssues().size(); issueIndex++) {
56 double issueWeight = weights.get(bid.getIssues().get(issueIndex));
57 issueWeight = issueWeight / (1 + (0.1 * updatedIssues));
58 weights.put(bid.getIssues().get(issueIndex), issueWeight);
59 }
60 previousBid = bid;
61 updatedIssues = 0;
62
63 // To test / check values of all weights and frequencies.
64 /*
65 * for (Issue issue : utilitySpace.getDomain().getIssues()) {
66 * List<ValueDiscrete> values = ((IssueDiscrete)issue).getValues(); for
67 * (Value value : values) { System.out.println("Frequencies:" + value +
68 * " " + getFrequency(issue, value)); }
69 *
70 * System.out.println("Weight:" + issue.toString() + " " +
71 * getWeight(issue)); } System.out.println(totalBids);
72 */
73 }
74
75 public void updateFrequency(Bid bid, int issueIndex) {
76 Issue curIssue = bid.getIssues().get(issueIndex);
77 Value issueValue = findValue(bid, issueIndex);
78 // Update evals : Get the Map with values of the issue and their
79 // respective evals
80 HashMap<Value, Double> valueMap = frequencies.get(curIssue);
81 valueMap.put(issueValue, (valueMap.get(issueValue) + 1.0));
82 frequencies.put(curIssue, valueMap);
83 }
84
85 public void updateWeights(Bid bid, int issueIndex) {
86 if (previousBid != null) {
87 Issue curIssue = bid.getIssues().get(issueIndex);
88 Value issueValue = findValue(bid, issueIndex);
89 Value oldIssueValue = findValue(previousBid, issueIndex);
90 if (issueValue.equals(oldIssueValue)) {
91 double issueWeight = weights.get(curIssue);
92 issueWeight += 0.1;
93 weights.put(curIssue, issueWeight);
94 updatedIssues += 1;
95 }
96 }
97 }
98
99 /**
100 * Checks if this opponent model is accurate.
101 *
102 * @return
103 */
104 public boolean isAccurate() {
105 double accurate = 0;
106
107 for (Issue issue : utilitySpace.getDomain().getIssues()) {
108 List<ValueDiscrete> values = ((IssueDiscrete) issue).getValues();
109 for (Value value : values) {
110 if (getFrequency(issue, value) >= FREQUENCY_THRESHOLD) {
111 accurate++;
112 break; // we think that this issue is accurate enough
113 }
114 }
115 }
116
117 return (accurate / utilitySpace.getDomain().getIssues().size()) > ACCURACY_THRESHOLD;
118 }
119
120 /**
121 * Returns dangerous bids based on the current frequency analysis. Watch out
122 * that this is only accurate after a couple of rounds.
123 *
124 * @return
125 */
126 public boolean isDangerousBid(Bid bid) {
127
128 boolean dangerous = true;
129 for (Issue issue : bid.getIssues()) {
130 if (getWeight(issue) < NEGLIGIBLE_WEIGHT_THRESHOLD)
131 continue; // could be dangerous because doesn't matter
132
133 try {
134 if (getFrequency(issue, bid.getValue(issue.getNumber())) < FREQUENCY_THRESHOLD) {
135 dangerous = false;
136 }
137 } catch (Exception e) {
138 // TODO Auto-generated catch block
139 e.printStackTrace();
140 dangerous = false;
141 }
142 }
143
144 return dangerous;
145 }
146
147 /**
148 * @param bid
149 * @param issueIndex
150 * @return the picked value for given issue idnumber
151 */
152 private Value findValue(Bid bid, int issueIndex) {
153 Value issueValue = null;
154 try {
155 issueValue = bid.getValue(issueIndex + 1);
156 } catch (Exception e) {
157 e.printStackTrace();
158 }
159 return issueValue;
160 }
161
162 public double getWeight(Issue issue) {
163 return weights.get(issue);
164 }
165
166 public double getFrequency(Issue issue, Value value) {
167 return frequencies.get(issue).get(value) / totalBids;
168 }
169
170}
Note: See TracBrowser for help on using the repository browser.