1 | package agents.anac.y2015.pokerface;
|
---|
2 |
|
---|
3 | import java.util.ArrayList;
|
---|
4 | import java.util.Collections;
|
---|
5 | import java.util.Comparator;
|
---|
6 | import java.util.HashMap;
|
---|
7 | import java.util.List;
|
---|
8 | import java.util.Map;
|
---|
9 | import java.util.Map.Entry;
|
---|
10 |
|
---|
11 | import genius.core.Bid;
|
---|
12 | import genius.core.issue.Issue;
|
---|
13 | import genius.core.issue.Value;
|
---|
14 | import genius.core.utility.AdditiveUtilitySpace;
|
---|
15 | import genius.core.utility.Evaluator;
|
---|
16 |
|
---|
17 | import java.util.Set;
|
---|
18 | import java.util.TreeMap;
|
---|
19 | import java.util.TreeSet;
|
---|
20 |
|
---|
21 | public class OpponentBidLists {
|
---|
22 |
|
---|
23 | private List<Object> senders;
|
---|
24 | // map: Sender -> ("<issue_id,issue_value>" -> count)
|
---|
25 | private Map<Object, Map<Pair<Integer, Value>, Integer>> map;
|
---|
26 | private boolean single_list;
|
---|
27 | private AdditiveUtilitySpace utilitySpace;
|
---|
28 |
|
---|
29 | public OpponentBidLists(AdditiveUtilitySpace utilitySpace, boolean single_list) {
|
---|
30 | senders = new ArrayList<Object>();
|
---|
31 | map = new HashMap<Object, Map<Pair<Integer, Value>, Integer>>();
|
---|
32 | this.single_list = single_list;
|
---|
33 | this.utilitySpace = utilitySpace;
|
---|
34 | if (single_list) {
|
---|
35 | Map<Pair<Integer, Value>, Integer> bid_list = new TreeMap<Pair<Integer, Value>, Integer>(
|
---|
36 | new MapComparator());
|
---|
37 | map.put(this, bid_list);
|
---|
38 | }
|
---|
39 | }
|
---|
40 |
|
---|
41 | private boolean hasSender(Object sender) {
|
---|
42 | return (senders.indexOf(sender) != -1);
|
---|
43 | }
|
---|
44 |
|
---|
45 | private void addSender(Object sender) {
|
---|
46 | if (!single_list) {
|
---|
47 | Map<Pair<Integer, Value>, Integer> bid_list = new TreeMap<Pair<Integer, Value>, Integer>(
|
---|
48 | new MapComparator());
|
---|
49 | map.put(sender, bid_list);
|
---|
50 | }
|
---|
51 | senders.add(sender);
|
---|
52 | }
|
---|
53 |
|
---|
54 | public List<Object> getSenders() {
|
---|
55 | return senders;
|
---|
56 | }
|
---|
57 |
|
---|
58 | public void insertBid(Object sender, Bid bid) {
|
---|
59 | if (!hasSender(sender)) {
|
---|
60 | addSender(sender);
|
---|
61 | }
|
---|
62 | Map<Pair<Integer, Value>, Integer> issue_value_counts;
|
---|
63 | if (single_list) {
|
---|
64 | issue_value_counts = map.get(this);
|
---|
65 | } else {
|
---|
66 | issue_value_counts = map.get(sender);
|
---|
67 | }
|
---|
68 |
|
---|
69 | List<Issue> issues = bid.getIssues();
|
---|
70 | Map<Integer, Value> values = bid.getValues();
|
---|
71 |
|
---|
72 | for (int j = 0; j < values.size(); j++) {
|
---|
73 | Integer issue_id = issues.get(j).getNumber();
|
---|
74 | Value value_id = values.get(j + 1);
|
---|
75 | Pair<Integer, Value> pair = new Pair<Integer, Value>(issue_id,
|
---|
76 | value_id);
|
---|
77 | Integer current_count = issue_value_counts.get(pair);
|
---|
78 | if (current_count == null)
|
---|
79 | issue_value_counts.put(pair, 1);
|
---|
80 | else
|
---|
81 | issue_value_counts.put(pair, current_count++);
|
---|
82 | }
|
---|
83 | }
|
---|
84 |
|
---|
85 | public Map<Pair<Integer, Value>, Integer> getBids(Object sender) {
|
---|
86 | if (single_list) {
|
---|
87 | return map.get(this);
|
---|
88 | } else {
|
---|
89 | return map.get(sender);
|
---|
90 | }
|
---|
91 | }
|
---|
92 |
|
---|
93 | public List<Entry<Pair<Integer, Value>, Integer>> getMostFrequentIssueValues(
|
---|
94 | Object sender) {
|
---|
95 | Map<Pair<Integer, Value>, Integer> issue_value_counts = map.get(sender);
|
---|
96 | if (sender == null || map.get(sender) == null)
|
---|
97 | return new ArrayList<Entry<Pair<Integer, Value>, Integer>>(0);
|
---|
98 | Set<Entry<Pair<Integer, Value>, Integer>> pull_through = new TreeSet<Entry<Pair<Integer, Value>, Integer>>(
|
---|
99 | new Comparator<Entry<Pair<Integer, Value>, Integer>>() {
|
---|
100 | public int compare(Entry<Pair<Integer, Value>, Integer> e1,
|
---|
101 | Entry<Pair<Integer, Value>, Integer> e2) {
|
---|
102 | return e1.getValue().compareTo(e2.getValue());
|
---|
103 | }
|
---|
104 | });
|
---|
105 | pull_through.addAll(issue_value_counts.entrySet());
|
---|
106 | return new ArrayList<Entry<Pair<Integer, Value>, Integer>>(pull_through);
|
---|
107 | }
|
---|
108 |
|
---|
109 | public List<Entry<Pair<Integer, Value>, Double>> weightIssueValues(
|
---|
110 | List<Entry<Pair<Integer, Value>, Integer>> sorted_list) {
|
---|
111 | Map<Pair<Integer, Value>, Double> map = new HashMap<Pair<Integer, Value>, Double>();
|
---|
112 | for (Entry<Pair<Integer, Value>, Integer> entry : sorted_list) {
|
---|
113 | double value = (double) entry.getValue();
|
---|
114 | int issue_id = entry.getKey().getInteger();
|
---|
115 | Evaluator evaluator = utilitySpace.getEvaluator(issue_id);
|
---|
116 | double weight = evaluator.getWeight();
|
---|
117 | double evaluation;
|
---|
118 | try {
|
---|
119 | Bid temp = utilitySpace.getMaxUtilityBid();
|
---|
120 | temp = temp.putValue(issue_id, entry.getKey().getValue());
|
---|
121 | evaluation = evaluator.getEvaluation(utilitySpace, temp,
|
---|
122 | issue_id);
|
---|
123 | } catch (Exception e) {
|
---|
124 | evaluation = 1.0;
|
---|
125 | }
|
---|
126 | map.put(entry.getKey(), value * weight * evaluation);
|
---|
127 | }
|
---|
128 | List<Entry<Pair<Integer, Value>, Double>> weighted_list = new ArrayList<Entry<Pair<Integer, Value>, Double>>(
|
---|
129 | ((Map<Pair<Integer, Value>, Double>) map).entrySet());
|
---|
130 | Collections.sort(weighted_list,
|
---|
131 | new Comparator<Entry<Pair<Integer, Value>, Double>>() {
|
---|
132 | public int compare(Entry<Pair<Integer, Value>, Double> o1,
|
---|
133 | Entry<Pair<Integer, Value>, Double> o2) {
|
---|
134 | return o1.getValue().compareTo(o2.getValue());
|
---|
135 | }
|
---|
136 | });
|
---|
137 | return weighted_list;
|
---|
138 | }
|
---|
139 |
|
---|
140 | private class MapComparator implements Comparator<Pair<Integer, Value>> {
|
---|
141 | public MapComparator() {
|
---|
142 | }
|
---|
143 |
|
---|
144 | public int compare(Pair<Integer, Value> p1, Pair<Integer, Value> p2) {
|
---|
145 | return (p1.getInteger() + p1.getValue().toString()).compareTo(p2
|
---|
146 | .getInteger() + p2.getValue().toString());
|
---|
147 | }
|
---|
148 | }
|
---|
149 | } |
---|