source: boa/src/main/java/geniusweb/boa/biddingstrategy/ExtendedUtilSpace.java

Last change on this file was 52, checked in by ruud, 14 months ago

Fixed small issues in domaineditor.

File size: 2.9 KB
Line 
1package geniusweb.boa.biddingstrategy;
2
3import java.math.BigDecimal;
4import java.math.BigInteger;
5import java.util.Collections;
6import java.util.LinkedList;
7
8import geniusweb.bidspace.BidsWithUtility;
9import geniusweb.bidspace.Interval;
10import geniusweb.bidspace.IssueInfo;
11import geniusweb.issuevalue.Bid;
12import geniusweb.issuevalue.Value;
13import geniusweb.profile.utilityspace.LinearAdditive;
14import tudelft.utilities.immutablelist.ImmutableList;
15
16/**
17 * Inner class for TimeDependentParty, made public for testing purposes. This
18 * class may change in the future, use at your own risk. Copy of
19 * geniusweb.exampleparties.timedependentparty
20 *
21 */
22public class ExtendedUtilSpace {
23 private LinearAdditive utilspace;
24 private BigDecimal tolerance; // utility tolerance for a bid.
25 private BidsWithUtility bidutils;
26 // min and max achievable utility
27 private BigDecimal minUtil;
28 private BigDecimal maxUtil;
29
30 public ExtendedUtilSpace(LinearAdditive space) {
31 this.utilspace = space;
32 bidutils = new BidsWithUtility(utilspace);
33 computeMinMax();
34 this.tolerance = computeTolerance();
35
36 }
37
38 /**
39 * Computes the fields minutil and maxUtil.
40 * <p>
41 * TODO this is simplistic, very expensive method and may cause us to run
42 * out of time on large domains.
43 * <p>
44 * Assumes that utilspace and bidutils have been set properly.
45 */
46 private void computeMinMax() {
47 Interval range = bidutils.getRange();
48 this.minUtil = range.getMin();
49 this.maxUtil = range.getMax();
50
51 Bid rvbid = utilspace.getReservationBid();
52 if (rvbid != null) {
53 BigDecimal rv = utilspace.getUtility(rvbid);
54 if (rv.compareTo(minUtil) > 0)
55 minUtil = rv;
56 }
57 }
58
59 /**
60 * Tolerance is the Interval we need when searching bids. When we are close
61 * to the maximum utility, this value has to be the distance between the
62 * best and one-but-best utility.
63 *
64 * @return the minimum tolerance required, which is the minimum difference
65 * between the weighted utility of the best and one-but-best issue
66 * value.
67 */
68 protected BigDecimal computeTolerance() {
69 BigDecimal tolerance = BigDecimal.ONE;
70 for (IssueInfo iss : bidutils.getInfo()) {
71 if (iss.getValues().size().compareTo(BigInteger.ONE) > 0) {
72 // we have at least 2 values.
73 LinkedList<BigDecimal> values = new LinkedList<BigDecimal>();
74 for (Value val : iss.getValues()) {
75 values.add(iss.getWeightedUtil(val));
76 }
77 Collections.sort(values);
78 Collections.reverse(values);
79 tolerance = tolerance
80 .min(values.get(0).subtract(values.get(1)));
81 }
82 }
83 return tolerance;
84 }
85
86 public BigDecimal getMin() {
87 return minUtil;
88 }
89
90 public BigDecimal getMax() {
91 return maxUtil;
92 }
93
94 /**
95 * @param utilityGoal the intended utilty
96 * @return bids with utility inside [utilitygoal-tolerance, utilitygoal]
97 */
98 public ImmutableList<Bid> getBids(BigDecimal utilityGoal) {
99 return bidutils.getBids(
100 new Interval(utilityGoal.subtract(tolerance), utilityGoal));
101 }
102
103}
Note: See TracBrowser for help on using the repository browser.