package geniusweb.blingbling; import java.math.BigInteger; import java.util.HashMap; import java.util.Map; import geniusweb.issuevalue.Bid; import geniusweb.issuevalue.Value; import geniusweb.issuevalue.DiscreteValueSet; import geniusweb.issuevalue.ValueSet; // //Old represent is the orignial SFM model. public class IssueTracker { private String issue; private int numValues; private int seenValues = 0; private Map valueTrackers = new HashMap(); private Value maxValue = null; private DiscreteValueSet valueset = null; private int maxValueCount = 0; private double weight = 0.0; public IssueTracker(String issuename, ValueSet valueset) { // if (valueset instanceof DiscreteValueSet) // throw new RuntimeException("Opponent model is designed for discrete issues only"); this.issue = issuename; this.valueset = (DiscreteValueSet) valueset; this.numValues = Integer.valueOf(this.valueset.size().toString());//transfer biginteger to int } public void registerValue(Value value, int bidsReceived) {//bidsReceived指的是收到的bid的总长度。 // create value tracker if needed if (valueTrackers.get(value) == null) { valueTrackers.put(value, new ValueTracker()); seenValues++; } // register max offered value with count int valueCount = valueTrackers.get(value).incrementGet(); if (valueCount > maxValueCount) { maxValueCount = valueCount; maxValue = value; } // update issue weight if (numValues > 1) { double equalShares = ((double) bidsReceived / (double) numValues); weight = ((double) maxValueCount - equalShares) / ((double) bidsReceived - equalShares); } // update all value evaluations for (ValueTracker valueTracker : valueTrackers.values()) valueTracker.updateEvaluation(maxValueCount, weight); } public double getEvaluationOld(Value value) {//原SFM的eval return (valueTrackers.get(value) == null) ? 0.0 : ((double) valueTrackers.get(value).getCount() / (double) maxValueCount); } public double getEvaluation(Value value) { return (valueTrackers.get(value) == null) ? 0.0 : valueTrackers.get(value).getEvaluation(); } public double getWeight() { return weight; } public double getOldWeight(int bidsReceived) { return (bidsReceived == 0) ? 0.0 : (double) maxValueCount / (double) bidsReceived; } public Value getMaxValue() { return maxValue; } public String toString() { return issue.toString() + ":\n" + valueTrackers.toString() + "\n"; } }