1 | package parties.in4010.q12015.group8;
|
---|
2 |
|
---|
3 | import java.util.HashMap;
|
---|
4 | import java.util.List;
|
---|
5 |
|
---|
6 | import genius.core.Bid;
|
---|
7 | import genius.core.issue.Issue;
|
---|
8 | import genius.core.issue.IssueDiscrete;
|
---|
9 | import genius.core.issue.Value;
|
---|
10 | import genius.core.issue.ValueDiscrete;
|
---|
11 | import genius.core.utility.AdditiveUtilitySpace;
|
---|
12 |
|
---|
13 | public 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 | }
|
---|