source: src/main/java/agents/anac/y2015/TUDMixedStrategyAgent/AgentUtils.java

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

#41 ROLL BACK of rev.126 . So this version is equal to rev. 125

File size: 4.3 KB
Line 
1package agents.anac.y2015.TUDMixedStrategyAgent;
2
3import java.util.ArrayList;
4import java.util.Arrays;
5import java.util.HashMap;
6import java.util.List;
7
8import genius.core.AgentID;
9import genius.core.Bid;
10import genius.core.BidHistory;
11import genius.core.issue.Issue;
12import genius.core.issue.Value;
13import genius.core.issue.ValueDiscrete;
14import genius.core.utility.EvaluatorDiscrete;
15
16public class AgentUtils {
17
18 AgentID agent;
19 BidHistory bidHistory;
20 ArrayList<EvaluatorDiscrete> issueList;
21 int nIssues;
22 int[] issueIds;
23
24 public AgentUtils(AgentID agent, BidHistory bidHistory, int nIssues) {
25 super();
26 this.agent = agent;
27 this.bidHistory = bidHistory;
28 this.nIssues = nIssues;
29 issueIds = new int[nIssues];
30 issueList = new ArrayList<EvaluatorDiscrete>();
31 for (int i = 0; i < nIssues; i++) {
32 issueList.add(new EvaluatorDiscrete());
33 }
34 }
35
36 // Calculates the utility of this bid for the Agent
37 public double getAgentUtil(Bid bid) {
38 double utility = 0;
39 // This HashMap connects the issues IDs to its values
40 HashMap<Integer, Value> bidValuesHashMap = bid.getValues();
41 for (int i = 0; i < nIssues; i++) {
42 double weight = issueList.get(i).getWeight();
43 ValueDiscrete VD = (ValueDiscrete) bidValuesHashMap
44 .get(issueIds[i]);
45 if (issueList.get(i).getValues().contains(VD))
46 utility = utility + issueList.get(i).getDoubleValue(VD)
47 * weight;
48 }
49 return utility;
50 }
51
52 // based on the most recent bids received recalculates the issue and value
53 // weights
54 public void recalculateUtilFunction() {
55 List<Issue> bidIssueList = bidHistory.getHistory().get(0).getBid()
56 .getIssues();
57 for (int i = 0; i < bidIssueList.size(); i++) {
58 issueIds[i] = bidIssueList.get(i).getNumber();
59 }
60
61 double[] bidWeights = calculateBidWeights();
62 int[] nChanges = calculateNChanges();
63
64 for (int i = 0; i < nIssues; i++) {
65 issueList.get(i).clear();
66 // First the weight of each issue
67 issueList.get(i).setWeight(calculateIssueWeight(i, nChanges));
68 ArrayList<ValueDiscrete> valueList = new ArrayList<ValueDiscrete>();
69 double[] valueEvaluation = new double[100]; // random large number,
70 // just so we don't have
71 // to use a List
72 for (int j = 0; j < bidHistory.getHistory().size(); j++) {
73 ValueDiscrete currentValue = (ValueDiscrete) bidHistory
74 .getHistory().get(j).getBid().getValues()
75 .get(bidIssueList.get(i).getNumber());
76 if (!valueList.contains(currentValue)) {
77 valueList.add(currentValue);
78 }
79 valueEvaluation[(valueList.indexOf(currentValue))] = valueEvaluation[valueList
80 .indexOf(currentValue)] + bidWeights[j];
81 }
82 int k = 0;
83 do {
84 try {
85 issueList.get(i).setEvaluationDouble(valueList.get(k),
86 valueEvaluation[k]);
87 } catch (Exception e) {
88 e.printStackTrace();
89 }
90 k++;
91 } while (valueEvaluation[k] != 0);
92 }
93 }
94
95 // Returns the number of changes in values for each issue through the entire
96 // bid history
97 private int[] calculateNChanges() {
98 int[] nChanges = new int[nIssues];
99 Arrays.fill(nChanges, 1);
100 Value oldValue = null;
101 for (int i = 0; i < nIssues; i++) {
102 for (int j = 0; j < bidHistory.getHistory().size(); j++) {
103 try {
104 if (oldValue != null
105 && !oldValue.equals(bidHistory.getHistory().get(j)
106 .getBid().getValue(issueIds[i]))) {
107 nChanges[i]++;
108 }
109 oldValue = bidHistory.getHistory().get(j).getBid()
110 .getValue(issueIds[i]);
111 } catch (Exception e) {
112 e.printStackTrace();
113 }
114
115 }
116 oldValue = null;
117 }
118 return nChanges;
119 }
120
121 // Calculates Issue i weight, based on the number of changes
122 private double calculateIssueWeight(int i, int[] nChanges) {
123 double weight = 0;
124 for (int j = 0; j < nIssues; j++) {
125 weight = weight + 1 / nChanges[j];
126 }
127 return 1 / nChanges[i] * 1 / weight;
128 }
129
130 // Gives a weight to each bid we received, the first bids are worth much
131 // more than the last ones
132 private double[] calculateBidWeights() {
133 int N = bidHistory.getHistory().size();
134 double factor = 0;
135 for (int i = 1; i <= N; i++) {
136 factor = factor + 1 / i;
137 }
138 double[] bidWeights = new double[N];
139 for (int i = 1; i <= N; i++) {
140 bidWeights[i - 1] = 1 / i * 1 / factor;
141 }
142 return bidWeights;
143 }
144
145}
Note: See TracBrowser for help on using the repository browser.