[127] | 1 | package agents;
|
---|
| 2 |
|
---|
| 3 | import java.io.Serializable;
|
---|
| 4 |
|
---|
| 5 | import genius.core.Agent;
|
---|
| 6 | import genius.core.Bid;
|
---|
| 7 | import genius.core.NegotiationResult;
|
---|
| 8 | import genius.core.actions.Accept;
|
---|
| 9 | import genius.core.actions.Action;
|
---|
| 10 | import genius.core.actions.DefaultAction;
|
---|
| 11 | import genius.core.actions.Offer;
|
---|
| 12 |
|
---|
| 13 | /**
|
---|
| 14 | * This agent is an example of how to createFrom an ANAC2013 agent which learns
|
---|
| 15 | * during the tournament. This agent is a variant of the random agent.
|
---|
| 16 | *
|
---|
| 17 | * @author M. Hendrikx
|
---|
| 18 | */
|
---|
| 19 | public class SimpleANAC2013Agent extends Agent {
|
---|
| 20 |
|
---|
| 21 | /** The minimum utility a bid should have to be accepted or offered. */
|
---|
| 22 | private double MINIMUM_BID_UTILITY;
|
---|
| 23 | /** The opponent's last action. */
|
---|
| 24 | private Bid opponentLastBid;
|
---|
| 25 | /** Bid with the highest possible utility. */
|
---|
| 26 | private Bid maxBid;
|
---|
| 27 |
|
---|
| 28 | public SimpleANAC2013Agent() {
|
---|
| 29 | }
|
---|
| 30 |
|
---|
| 31 | /**
|
---|
| 32 | * Initialize the target utility to MAX(rv, max). Where rv is the
|
---|
| 33 | * reservation value of the preference profile and max is the highest
|
---|
| 34 | * utility received on the current preference profile.
|
---|
| 35 | */
|
---|
| 36 | public void init() {
|
---|
| 37 | Serializable prev = this.loadSessionData();
|
---|
| 38 | if (prev != null) {
|
---|
| 39 | double previousOutcome = (Double) prev;
|
---|
| 40 | MINIMUM_BID_UTILITY = Math.max(Math.max(
|
---|
| 41 | utilitySpace.getReservationValueUndiscounted(),
|
---|
| 42 | previousOutcome), 0.5);
|
---|
| 43 | } else {
|
---|
| 44 | MINIMUM_BID_UTILITY = utilitySpace
|
---|
| 45 | .getReservationValueUndiscounted();
|
---|
| 46 | }
|
---|
| 47 | System.out.println("Minimum bid utility: " + MINIMUM_BID_UTILITY);
|
---|
| 48 | }
|
---|
| 49 |
|
---|
| 50 | @Override
|
---|
| 51 | public String getVersion() {
|
---|
| 52 | return "1.0";
|
---|
| 53 | }
|
---|
| 54 |
|
---|
| 55 | @Override
|
---|
| 56 | public String getName() {
|
---|
| 57 | return "Simple ANAC2013 Agent";
|
---|
| 58 | }
|
---|
| 59 |
|
---|
| 60 | /**
|
---|
| 61 | * Set the target utility for the next match on the same preference profile.
|
---|
| 62 | * If the received utility is higher than the current target, save the
|
---|
| 63 | * received utility as the new target utility.
|
---|
| 64 | */
|
---|
| 65 | public void endSession(NegotiationResult result) {
|
---|
| 66 | if (result.getMyDiscountedUtility() > MINIMUM_BID_UTILITY) {
|
---|
| 67 | saveSessionData(new Double(result.getMyDiscountedUtility()));
|
---|
| 68 | }
|
---|
| 69 | System.out.println(result);
|
---|
| 70 | }
|
---|
| 71 |
|
---|
| 72 | /**
|
---|
| 73 | * Retrieve the bid from the opponent's last action.
|
---|
| 74 | */
|
---|
| 75 | public void ReceiveMessage(Action opponentAction) {
|
---|
| 76 | opponentLastBid = DefaultAction.getBidFromAction(opponentAction);
|
---|
| 77 | }
|
---|
| 78 |
|
---|
| 79 | /**
|
---|
| 80 | * Accept if the utility of the opponent's is higher than the target
|
---|
| 81 | * utility; else return a random bid with a utility at least equal to the
|
---|
| 82 | * target utility.
|
---|
| 83 | */
|
---|
| 84 | public Action chooseAction() {
|
---|
| 85 | if (opponentLastBid != null
|
---|
| 86 | && getUtility(opponentLastBid) >= MINIMUM_BID_UTILITY) {
|
---|
| 87 | return new Accept(getAgentID(), opponentLastBid);
|
---|
| 88 | }
|
---|
| 89 | return getRandomBid(MINIMUM_BID_UTILITY);
|
---|
| 90 | }
|
---|
| 91 |
|
---|
| 92 | /**
|
---|
| 93 | * Return a bid with a utility at least equal to the target utility, or the
|
---|
| 94 | * bid with the highest utility possible if it takes too long to find.
|
---|
| 95 | *
|
---|
| 96 | * @param target
|
---|
| 97 | * @return found bid.
|
---|
| 98 | */
|
---|
| 99 | private Action getRandomBid(double target) {
|
---|
| 100 | Bid bid = null;
|
---|
| 101 | try {
|
---|
| 102 | int loops = 0;
|
---|
| 103 | do {
|
---|
| 104 | bid = utilitySpace.getDomain().getRandomBid(null);
|
---|
| 105 | loops++;
|
---|
| 106 | } while (loops < 100000 && utilitySpace.getUtility(bid) < target);
|
---|
| 107 | if (bid == null) {
|
---|
| 108 | if (maxBid == null) {
|
---|
| 109 | // this is a computationally expensive operation, therefore
|
---|
| 110 | // cache result
|
---|
| 111 | maxBid = utilitySpace.getMaxUtilityBid();
|
---|
| 112 | }
|
---|
| 113 | bid = maxBid;
|
---|
| 114 | }
|
---|
| 115 | } catch (Exception e) {
|
---|
| 116 | e.printStackTrace();
|
---|
| 117 | }
|
---|
| 118 | return new Offer(getAgentID(), bid);
|
---|
| 119 | }
|
---|
[1] | 120 | } |
---|