source: src/main/java/genius/core/uncertainty/AdditiveUtilitySpaceFactory.java

Last change on this file was 181, checked in by Tim Baarslag, 6 years ago

Extended UncertaintyAgentExample

File size: 3.9 KB
Line 
1package genius.core.uncertainty;
2
3import java.util.List;
4
5import java.util.ArrayList;
6import java.util.HashMap;
7import java.util.Map;
8
9import genius.core.Bid;
10import genius.core.Domain;
11import genius.core.issue.Issue;
12import genius.core.issue.IssueDiscrete;
13import genius.core.issue.Objective;
14import genius.core.issue.ValueDiscrete;
15import genius.core.utility.AdditiveUtilitySpace;
16import genius.core.utility.Evaluator;
17import genius.core.utility.EvaluatorDiscrete;
18
19/**
20 * Service class for building an additive utility space of the form:
21 * u(x_1, ..., x_n) = w_1 * e_1(x_1) + ... + w_n * e_n(x_n)
22 */
23public class AdditiveUtilitySpaceFactory
24{
25 private AdditiveUtilitySpace u;
26
27 /**
28 * Generates an simple Utility Space on the domain, with equal weights and zero values.
29 * Everything is zero-filled to already have all keys contained in the utility maps.
30 */
31 public AdditiveUtilitySpaceFactory(Domain d)
32 {
33 List<Issue> issues = d.getIssues();
34 int noIssues = issues.size();
35 Map<Objective, Evaluator> evaluatorMap = new HashMap<Objective, Evaluator>();
36 for (Issue i : issues) {
37 IssueDiscrete issue = (IssueDiscrete) i;
38 EvaluatorDiscrete evaluator = new EvaluatorDiscrete();
39 evaluator.setWeight(1.0 / noIssues);
40 for (ValueDiscrete value : issue.getValues()) {
41 evaluator.setEvaluationDouble(value, 0.0);
42 }
43 evaluatorMap.put(issue, evaluator);
44 }
45
46 u = new AdditiveUtilitySpace(d, evaluatorMap);
47 }
48
49 /**
50 * Sets w_i := weight
51 */
52 public void setWeight(Issue i, double weight)
53 {
54 EvaluatorDiscrete evaluator = (EvaluatorDiscrete) u.getEvaluator(i);
55 evaluator.setWeight(weight);
56 }
57
58 /**
59 * Sets e_i(v) := value
60 */
61 public void setUtility(Issue i, ValueDiscrete v, double value)
62 {
63 EvaluatorDiscrete evaluator = (EvaluatorDiscrete) u.getEvaluator(i);
64 if (evaluator == null)
65 {
66 evaluator = new EvaluatorDiscrete();
67 u.addEvaluator(i, evaluator);
68 }
69 evaluator.setEvaluationDouble(v, value);
70 }
71
72 public double getUtility(Issue i, ValueDiscrete v)
73 {
74 EvaluatorDiscrete evaluator = (EvaluatorDiscrete) u.getEvaluator(i);
75 return evaluator.getDoubleValue(v);
76 }
77
78 /**
79 * A simple heuristic for estimating a discrete {@link AdditiveUtilitySpace} from a {@link BidRanking}.
80 * Gives 0 points to all values occurring in the lowest ranked bid,
81 * then 1 point to all values occurring in the second lowest bid, and so on.
82 */
83 public void estimateUsingBidRanks(BidRanking r)
84 {
85 double points = 0;
86 for (Bid b : r.getBidOrder())
87 {
88 List<Issue> issues = b.getIssues();
89 for (Issue i : issues)
90 {
91 int no = i.getNumber();
92 ValueDiscrete v = (ValueDiscrete) b.getValue(no);
93 double oldUtil = getUtility(i, v);
94 setUtility(i, v, oldUtil + points);
95 }
96 points += 1;
97 }
98 normalizeWeightsByMaxValues();
99 }
100
101 private void normalizeWeightsByMaxValues()
102 {
103 for (Issue i : getIssues())
104 {
105 EvaluatorDiscrete evaluator = (EvaluatorDiscrete) u.getEvaluator(i);
106 evaluator.normalizeAll();
107 }
108 scaleAllValuesFrom0To1();
109 u.normalizeWeights();
110 }
111
112 public void scaleAllValuesFrom0To1()
113 {
114 for (Issue i : getIssues())
115 {
116 EvaluatorDiscrete evaluator = (EvaluatorDiscrete) u.getEvaluator(i);
117 evaluator.scaleAllValuesFrom0To1();
118 }
119 }
120
121 public void normalizeWeights()
122 {
123 u.normalizeWeights();
124 }
125
126 /**
127 * Returns the utility space that has been created.
128 */
129 public AdditiveUtilitySpace getUtilitySpace()
130 {
131 return u;
132 }
133
134 /**
135 * In this class, we can assume all issues are of the type {@link IssueDiscrete}.
136 * @return all issues in the domain.
137 */
138 public List<IssueDiscrete> getIssues()
139 {
140 List<IssueDiscrete> issues = new ArrayList<>();
141 for (Issue i : getDomain().getIssues())
142 {
143 IssueDiscrete issue = (IssueDiscrete) i;
144 issues.add(issue);
145 }
146 return issues;
147 }
148
149 public Domain getDomain() {
150 return u.getDomain();
151 }
152
153}
Note: See TracBrowser for help on using the repository browser.