[1] | 1 | package agents.anac.y2014.E2Agent;
|
---|
| 2 |
|
---|
| 3 | import java.io.Serializable;
|
---|
| 4 | import java.util.ArrayList;
|
---|
| 5 | import java.util.Collections;
|
---|
| 6 | import java.util.List;
|
---|
| 7 | import java.util.Random;
|
---|
| 8 |
|
---|
| 9 | import agents.anac.y2014.E2Agent.myUtility.AgentKStorategy;
|
---|
| 10 | import agents.anac.y2014.E2Agent.myUtility.BidStorage;
|
---|
| 11 | import agents.anac.y2014.E2Agent.myUtility.BidStorageComparator;
|
---|
| 12 | import agents.anac.y2014.E2Agent.myUtility.BidStorageList;
|
---|
| 13 | import agents.anac.y2014.E2Agent.myUtility.IAgentKStorategyComponent;
|
---|
| 14 | import agents.anac.y2014.E2Agent.myUtility.Parameters;
|
---|
| 15 | import agents.anac.y2014.E2Agent.myUtility.SessionData;
|
---|
| 16 | import agents.anac.y2014.E2Agent.myUtility.SimulatedAnealing;
|
---|
| 17 | import agents.anac.y2014.E2Agent.myUtility.SummaryStatistics;
|
---|
| 18 | import genius.core.Agent;
|
---|
| 19 | import genius.core.Bid;
|
---|
| 20 | import genius.core.NegotiationResult;
|
---|
| 21 | import genius.core.actions.Accept;
|
---|
| 22 | import genius.core.actions.Action;
|
---|
| 23 | import genius.core.actions.ActionWithBid;
|
---|
| 24 | import genius.core.actions.Offer;
|
---|
| 25 | import genius.core.issue.Issue;
|
---|
| 26 | import genius.core.issue.IssueInteger;
|
---|
| 27 | import genius.core.issue.ValueInteger;
|
---|
| 28 | import genius.core.utility.AbstractUtilitySpace;
|
---|
| 29 | import genius.core.utility.Bound;
|
---|
| 30 |
|
---|
| 31 | public class AnacSampleAgent extends Agent {
|
---|
| 32 | private Action actionOfPartner = null;
|
---|
| 33 | private static int SAMPLE_NUMBER = 3; // �得�るサンプル数
|
---|
| 34 | private static int SA_K_MAX = 10000; // 焼����法�ループ数
|
---|
| 35 | private AbstractUtilitySpace nonlinear = null; // �線形効用空間
|
---|
| 36 | // private ArrayList<BidStorage> partnerBidHistory = null; //
|
---|
| 37 | // 相手ã�®Bidå±¥æ´
|
---|
| 38 | private BidStorageList partnerBidHistory = null;
|
---|
| 39 | private ArrayList<BidStorage> candidateBids = null; // Bid候補
|
---|
| 40 | private List<Issue> issues = null; // 効用空間�全��論点
|
---|
| 41 | private Random randomnr = null;
|
---|
| 42 | private SimulatedAnealing simulatedAnealing = null;
|
---|
| 43 | private double discountFactor = 0;
|
---|
| 44 | private double reservationValue = 0;
|
---|
| 45 | private AgentKStorategy agentKStorategy = null;
|
---|
| 46 | private SessionData sessionData = null;
|
---|
| 47 | private double time = 0;
|
---|
| 48 | private double worstUtility = 1.0;
|
---|
| 49 | private Parameters param;
|
---|
| 50 | private BidStorage bestBid;
|
---|
| 51 |
|
---|
| 52 | @Override
|
---|
| 53 | public void init() {
|
---|
| 54 | Serializable s = loadSessionData();
|
---|
| 55 | if (s != null && sessionNr != 0) {
|
---|
| 56 |
|
---|
| 57 | sessionData = (SessionData) s;
|
---|
| 58 | } else {
|
---|
| 59 | // System.out.println("######################################################################################################################################################");
|
---|
| 60 | sessionData = new SessionData(sessionsTotal);
|
---|
| 61 | }
|
---|
| 62 |
|
---|
| 63 | param = sessionData.getParamters(reservationValue, discountFactor);
|
---|
| 64 | // System.out.println(param);
|
---|
| 65 |
|
---|
| 66 | randomnr = new Random();
|
---|
| 67 | nonlinear = (AbstractUtilitySpace) utilitySpace.copy();
|
---|
| 68 | issues = utilitySpace.getDomain().getIssues();
|
---|
| 69 | discountFactor = utilitySpace.getDiscountFactor();
|
---|
| 70 | reservationValue = utilitySpace.getReservationValue();
|
---|
| 71 | agentKStorategy = new AgentKStorategy(randomnr,
|
---|
| 72 | new AgentKStorategyComponentImpl());
|
---|
| 73 |
|
---|
| 74 | partnerBidHistory = new BidStorageList();
|
---|
| 75 | bestBid = new BidStorage(null, 0, 0);
|
---|
| 76 |
|
---|
| 77 | try {
|
---|
| 78 | simulatedAnealing = new SimulatedAnealing(utilitySpace);
|
---|
| 79 |
|
---|
| 80 | candidateBids = searchOptimumBids(SAMPLE_NUMBER);
|
---|
| 81 | // 効用値�ソート
|
---|
| 82 | Collections.sort(candidateBids, new BidStorageComparator());
|
---|
| 83 | Collections.reverse(candidateBids); // é™�é †ã�«å¤‰æ›´
|
---|
| 84 |
|
---|
| 85 | // System.out.println(candidateBids);
|
---|
| 86 | } catch (Exception e) {
|
---|
| 87 | e.printStackTrace();
|
---|
| 88 | candidateBids = null;
|
---|
| 89 | }
|
---|
| 90 | }
|
---|
| 91 |
|
---|
| 92 | /**
|
---|
| 93 | * 最��Bidを探索
|
---|
| 94 | */
|
---|
| 95 | private ArrayList<BidStorage> searchOptimumBids(int sampleNr)
|
---|
| 96 | throws Exception {
|
---|
| 97 | ArrayList<BidStorage> bids = new ArrayList<BidStorage>();
|
---|
| 98 | for (int index = 0; index < sampleNr; ++index) {
|
---|
| 99 | Bid startBid = utilitySpace.getDomain().getRandomBid(null);
|
---|
| 100 | // 焼����法�よる最�解探索
|
---|
| 101 | BidStorage optimumBid = simulatedAnealing.run(startBid, 1.0,
|
---|
| 102 | SA_K_MAX);
|
---|
| 103 | // Bid候補追åŠ
|
---|
| 104 | bids.add(optimumBid);
|
---|
| 105 | }
|
---|
| 106 | return bids;
|
---|
| 107 | }
|
---|
| 108 |
|
---|
| 109 | /**
|
---|
| 110 | * 自分�行動�択
|
---|
| 111 | */
|
---|
| 112 | @Override
|
---|
| 113 | public Action chooseAction() {
|
---|
| 114 | Action action = null;
|
---|
| 115 | try {
|
---|
| 116 | // 一番始��Bid
|
---|
| 117 | if (actionOfPartner == null) {
|
---|
| 118 | BidStorage myBidStorage = candidateBids.get(0);
|
---|
| 119 | action = generateOffer(myBidStorage.getBid());
|
---|
| 120 | }
|
---|
| 121 | if (actionOfPartner instanceof Offer) { // 相手ã�ŒOfferã�—ã�¦ã��ã�Ÿå ´å�ˆ
|
---|
| 122 | time = timeline.getTime();
|
---|
| 123 | double tau = 1;
|
---|
| 124 |
|
---|
| 125 | // 相手�Bidを記憶
|
---|
| 126 | Bid partnerBid = ((Offer) actionOfPartner).getBid();
|
---|
| 127 | BidStorage partnerBidStorage = new BidStorage(partnerBid,
|
---|
| 128 | utilitySpace.getUtility(partnerBid), time);
|
---|
| 129 | partnerBidHistory.addBidStorage(partnerBidStorage);
|
---|
| 130 | SummaryStatistics stat = partnerBidHistory
|
---|
| 131 | .getSummaryStatistics();
|
---|
| 132 | // BidStorage bestBid = partnerBidHistory.getBestBidStorage();
|
---|
| 133 | // System.out.println(stat);
|
---|
| 134 | BidStorage myBidStorage = null;
|
---|
| 135 | double targetUtility = 1.0;
|
---|
| 136 |
|
---|
| 137 | // 自分����最も良�相手�Bid
|
---|
| 138 | if (bestBid.getUtility() < partnerBidStorage.getUtility()) {
|
---|
| 139 | bestBid = partnerBidStorage;
|
---|
| 140 | }
|
---|
| 141 |
|
---|
| 142 | if (discountFactor > 0.9) {
|
---|
| 143 | targetUtility = agentKStorategy.fintarget(time,
|
---|
| 144 | stat.getAve(), stat.getVar(), tau);
|
---|
| 145 | } else {
|
---|
| 146 | targetUtility = fintarget2(time, stat, param);
|
---|
| 147 | }
|
---|
| 148 |
|
---|
| 149 | myBidStorage = search2(partnerBid, targetUtility);
|
---|
| 150 | if (myBidStorage == null) {
|
---|
| 151 | // 指定��効用値を���Bidを検索
|
---|
| 152 | myBidStorage = searchBidWithApproximateUtlity(partnerBid,
|
---|
| 153 | targetUtility);
|
---|
| 154 | if (myBidStorage == null) {
|
---|
| 155 | myBidStorage = candidateBids.get(0);
|
---|
| 156 | }
|
---|
| 157 | }
|
---|
| 158 |
|
---|
| 159 | double myUtility = myBidStorage.getUtility();
|
---|
| 160 |
|
---|
| 161 | if (// worstUtility <= partnerBidStorage.getUtility() ||
|
---|
| 162 | isAcceptable(time, partnerBidStorage.getUtility(),
|
---|
| 163 | stat.getAve(), stat.getVar(), tau)) {
|
---|
| 164 | // System.out.println("Accept");
|
---|
| 165 | action = new Accept(getAgentID(), partnerBid);
|
---|
| 166 | } else {
|
---|
| 167 | if (targetUtility < bestBid.getUtility()) {
|
---|
| 168 | // 目標効用値よりも高�値を相手�既�Offer����ら�れをOffer
|
---|
| 169 | action = generateOffer(bestBid.getBid());
|
---|
| 170 | // System.out.printf("bestUtility: %f.5 ",
|
---|
| 171 | // bestBid.getUtility());
|
---|
| 172 | } else {
|
---|
| 173 | action = generateOffer(myBidStorage.getBid());
|
---|
| 174 | }
|
---|
| 175 |
|
---|
| 176 | // 自身�最も悪�Bidを記憶
|
---|
| 177 | if ((targetUtility - myUtility) < 0.05
|
---|
| 178 | && myUtility < worstUtility) {
|
---|
| 179 | worstUtility = myUtility;
|
---|
| 180 | }
|
---|
| 181 | // 目標���り�も離れ�bid�最大Bid�置��る
|
---|
| 182 | if (Math.abs(targetUtility - myUtility) > 0.1) {
|
---|
| 183 | action = generateOffer(candidateBids.get(0).getBid());
|
---|
| 184 | }
|
---|
| 185 | /*
|
---|
| 186 | * if(sessionNr>0 && time > 0.999 && (reservationValue *
|
---|
| 187 | * discountFactor) * 1.5 < partnerBidStorage.getUtility()) {
|
---|
| 188 | * System.out.println("Limit"); action = new
|
---|
| 189 | * Accept(getAgentID()); }
|
---|
| 190 | */
|
---|
| 191 | }
|
---|
| 192 | }
|
---|
| 193 | } catch (Exception e) { // 例外発生時�相手���案を��る
|
---|
| 194 | e.printStackTrace();
|
---|
| 195 | // System.out.println("Exception in ChooseAction:"+e.getMessage());
|
---|
| 196 | // best guess if things go wrong.
|
---|
| 197 | action = new Accept(getAgentID(),
|
---|
| 198 | ((ActionWithBid) actionOfPartner).getBid());
|
---|
| 199 | }
|
---|
| 200 | return action;
|
---|
| 201 | }
|
---|
| 202 |
|
---|
| 203 | private BidStorage search2(Bid bid, double targetUtil) throws Exception {
|
---|
| 204 | double min = 1;
|
---|
| 205 | BidStorage ret = null;
|
---|
| 206 |
|
---|
| 207 | for (int i = 0; i < issues.size(); ++i) {
|
---|
| 208 | IssueInteger lIssueInteger = (IssueInteger) issues.get(i);
|
---|
| 209 | int issueIndexMin = lIssueInteger.getLowerBound();
|
---|
| 210 | int issueIndexMax = lIssueInteger.getUpperBound();
|
---|
| 211 |
|
---|
| 212 | for (int j = issueIndexMin; j <= issueIndexMax; ++j) {
|
---|
| 213 | Bid neighbourBid = new Bid(bid);
|
---|
| 214 | neighbourBid = neighbourBid.putValue(i + 1,
|
---|
| 215 | new ValueInteger(j));
|
---|
| 216 | double u = utilitySpace.getUtility(neighbourBid);
|
---|
| 217 | if (/* Math.abs(u-targetUtil) < min && */u > targetUtil) {
|
---|
| 218 | min = u;
|
---|
| 219 | ret = new BidStorage(neighbourBid, u, -1);
|
---|
| 220 | System.out.println(ret);
|
---|
| 221 | }
|
---|
| 222 | }
|
---|
| 223 | }
|
---|
| 224 |
|
---|
| 225 | return ret;
|
---|
| 226 | }
|
---|
| 227 |
|
---|
| 228 | /**
|
---|
| 229 | * 相手���案を��る�
|
---|
| 230 | */
|
---|
| 231 | private boolean isAcceptable(double time, double u, double myu, double var,
|
---|
| 232 | double tau) throws Exception {
|
---|
| 233 | // 相手�効用値�時間�0~1�値を得る
|
---|
| 234 | double p = agentKStorategy.pAccept(time, u, myu, var, tau);
|
---|
| 235 | if (p < 0.1) {
|
---|
| 236 | return false;
|
---|
| 237 | }
|
---|
| 238 |
|
---|
| 239 | // System.out.printf(" P: %f.5\n", p);
|
---|
| 240 | return p > Math.random();
|
---|
| 241 | }
|
---|
| 242 |
|
---|
| 243 | private double fintarget2(double time, SummaryStatistics stat,
|
---|
| 244 | Parameters param) {
|
---|
| 245 | double ret = 1;
|
---|
| 246 | double target = agentKStorategy.fintarget(time, stat.getAve(),
|
---|
| 247 | stat.getVar(), 1);
|
---|
| 248 | if (Double.isNaN(target)) {
|
---|
| 249 | target = 1.0;
|
---|
| 250 | }
|
---|
| 251 | double co = 0;
|
---|
| 252 | if (target > param.utility) {
|
---|
| 253 | co = 0.8;
|
---|
| 254 | if (param.time - time > 0) {
|
---|
| 255 | co *= (1 - Math.pow((param.time - time) / param.time,
|
---|
| 256 | param.alpha));
|
---|
| 257 | }
|
---|
| 258 | }
|
---|
| 259 | ret = co * param.utility + (1 - co) * target;
|
---|
| 260 | // System.out.printf("%.4f ",ret);
|
---|
| 261 | return ret;
|
---|
| 262 | }
|
---|
| 263 |
|
---|
| 264 | private double fintarget(double time, SummaryStatistics stat,
|
---|
| 265 | Parameters param) {
|
---|
| 266 | double ret = 1;
|
---|
| 267 | double param_t = param.time * 0.85;
|
---|
| 268 | double e = agentKStorategy.emax(stat.getAve(), stat.getVar());
|
---|
| 269 |
|
---|
| 270 | if (time < param_t) {
|
---|
| 271 | ret = 1 - ((1 - param.utility)
|
---|
| 272 | * Math.pow(time / param_t, 1 / param.alpha));
|
---|
| 273 | } else {
|
---|
| 274 | /*
|
---|
| 275 | * double t = (time - param_t) / (1 - param_t); double ave =
|
---|
| 276 | * stat.getAve() / param.utility; double var = stat.getVar() /
|
---|
| 277 | * Math.pow(param.utility,2); double target =
|
---|
| 278 | * agentKStorategy.fintarget(t, ave, var, 1); ret = target /
|
---|
| 279 | * param.utility;
|
---|
| 280 | */
|
---|
| 281 |
|
---|
| 282 | if (e > param.utility || Double.isNaN(e)) {
|
---|
| 283 | e = param.utility;
|
---|
| 284 | }
|
---|
| 285 | ret = param.utility - (param.utility - e)
|
---|
| 286 | * Math.pow((time - param_t) / (1 - param_t), param.beta);
|
---|
| 287 | if (Double.isNaN(ret)) {
|
---|
| 288 | ret = 1.0;
|
---|
| 289 | }
|
---|
| 290 | }
|
---|
| 291 |
|
---|
| 292 | // System.out.printf("%.4f ",ret);
|
---|
| 293 | return ret;
|
---|
| 294 | }
|
---|
| 295 |
|
---|
| 296 | private BidStorage searchBidWithApproximateUtlity(Bid startBid, double u)
|
---|
| 297 | throws Exception {
|
---|
| 298 | // Bid startBid = utilitySpace.getDomain().getRandomBid();
|
---|
| 299 | // 焼����法�よる最�解探索
|
---|
| 300 | BidStorage optimumBid = null;
|
---|
| 301 | try {
|
---|
| 302 | optimumBid = simulatedAnealing.run(startBid, u, SA_K_MAX);
|
---|
| 303 | } catch (Exception e) {
|
---|
| 304 | return null;
|
---|
| 305 | }
|
---|
| 306 | return optimumBid;
|
---|
| 307 | }
|
---|
| 308 |
|
---|
| 309 | private ArrayList<Bound> searchConstraint(Bid bid) {
|
---|
| 310 | ArrayList<Bound> constraint = new ArrayList<Bound>();
|
---|
| 311 | double u = getUtility(bid);
|
---|
| 312 | return constraint;
|
---|
| 313 | }
|
---|
| 314 |
|
---|
| 315 | @Override
|
---|
| 316 | public void endSession(NegotiationResult result) {
|
---|
| 317 | // System.out.printf("\n");
|
---|
| 318 | try {
|
---|
| 319 | sessionData.save(sessionNr, partnerBidHistory, result,
|
---|
| 320 | utilitySpace.getUtility(result.getLastBid()),
|
---|
| 321 | timeline.getTime());
|
---|
| 322 | } catch (Exception e) {
|
---|
| 323 | // TODO Auto-generated catch block
|
---|
| 324 | e.printStackTrace();
|
---|
| 325 | }
|
---|
| 326 | saveSessionData(sessionData);
|
---|
| 327 | }
|
---|
| 328 |
|
---|
| 329 | @Override
|
---|
| 330 | public void ReceiveMessage(Action opponentAction) {
|
---|
| 331 | actionOfPartner = opponentAction;
|
---|
| 332 | }
|
---|
| 333 |
|
---|
| 334 | private Offer generateOffer(Bid bid) {
|
---|
| 335 | return new Offer(getAgentID(), bid);
|
---|
| 336 | }
|
---|
| 337 |
|
---|
| 338 | @Override
|
---|
| 339 | public String getVersion() {
|
---|
| 340 | return "5.0";
|
---|
| 341 | }
|
---|
| 342 |
|
---|
| 343 | @Override
|
---|
| 344 | public String getName() {
|
---|
| 345 | return "Anac Sample Agent";
|
---|
| 346 | }
|
---|
| 347 |
|
---|
| 348 | class AgentKStorategyComponentImpl implements IAgentKStorategyComponent {
|
---|
| 349 | @Override
|
---|
| 350 | public double g(double t) {
|
---|
| 351 | return param.g;
|
---|
| 352 | }
|
---|
| 353 | }
|
---|
| 354 |
|
---|
| 355 | @Override
|
---|
| 356 | public String getDescription() {
|
---|
| 357 | return "ANAC2014 compatible with non-linear utility spaces";
|
---|
| 358 | }
|
---|
| 359 | }
|
---|