[2] | 1 | import java.io.IOException;
|
---|
| 2 | import java.util.Collections;
|
---|
| 3 | import java.util.List;
|
---|
| 4 | import java.util.Set;
|
---|
| 5 | import java.util.logging.Level;
|
---|
| 6 | import java.util.stream.Collectors;
|
---|
| 7 |
|
---|
| 8 | import geniusweb.actions.*;
|
---|
| 9 | import geniusweb.boa.InstantiationFailedException;
|
---|
| 10 | import geniusweb.boa.acceptancestrategy.AcceptanceStrategy;
|
---|
| 11 | import geniusweb.boa.acceptancestrategy.TimeDependentAcceptanceStrategy;
|
---|
| 12 | import geniusweb.boa.biddingstrategy.BiddingStrategy;
|
---|
| 13 | import geniusweb.boa.biddingstrategy.TimeDependentBiddingStrategy;
|
---|
| 14 | import geniusweb.inform.*;
|
---|
| 15 | import geniusweb.issuevalue.Bid;
|
---|
| 16 | import geniusweb.opponentmodel.FrequencyOpponentModel;
|
---|
| 17 | import geniusweb.opponentmodel.OpponentModel;
|
---|
| 18 | import geniusweb.party.Capabilities;
|
---|
| 19 | import geniusweb.party.DefaultParty;
|
---|
| 20 | import geniusweb.profile.Profile;
|
---|
| 21 | import geniusweb.profileconnection.ProfileConnectionFactory;
|
---|
| 22 | import geniusweb.profileconnection.ProfileInterface;
|
---|
| 23 | import tudelft.utilities.logging.Reporter;
|
---|
| 24 |
|
---|
| 25 |
|
---|
| 26 | public class DefaultMopacBoa extends DefaultParty {
|
---|
| 27 | private Group5BoaState negoState;
|
---|
| 28 | private ProfileInterface profileint = null;
|
---|
| 29 | private Votes lastVotes;
|
---|
| 30 |
|
---|
| 31 | public DefaultMopacBoa() {
|
---|
| 32 | super();
|
---|
| 33 | negoState = initialState();
|
---|
| 34 | }
|
---|
| 35 |
|
---|
| 36 | public DefaultMopacBoa(Reporter reporter) {
|
---|
| 37 | super(reporter); // for debugging
|
---|
| 38 | negoState = initialState();
|
---|
| 39 | }
|
---|
| 40 |
|
---|
| 41 | @Override
|
---|
| 42 | public Capabilities getCapabilities() {
|
---|
| 43 | return new Capabilities(Collections.singleton("MOPAC"), Collections.singleton(Profile.class));
|
---|
| 44 | }
|
---|
| 45 |
|
---|
| 46 | @Override
|
---|
| 47 | public void notifyChange(Inform info) {
|
---|
| 48 | try {
|
---|
| 49 | if (info instanceof Settings) {
|
---|
| 50 | /*
|
---|
| 51 | * this should be first call. We can not yet create the state
|
---|
| 52 | * because we need to wait for the profile fetch.
|
---|
| 53 | */
|
---|
| 54 | Settings settings = (Settings) info;
|
---|
| 55 | Class<? extends OpponentModel> omClass = getOpponentModel(
|
---|
| 56 | settings);
|
---|
| 57 | BiddingStrategy bidStrat = getBiddingStrategy(settings);
|
---|
| 58 | AcceptanceStrategy acceptStrat = getAccceptanceStrategy(
|
---|
| 59 | settings);
|
---|
| 60 | negoState = negoState.with(settings, bidStrat, acceptStrat,
|
---|
| 61 | omClass);
|
---|
| 62 | this.profileint = ProfileConnectionFactory
|
---|
| 63 | .create(settings.getProfile().getURI(), getReporter());
|
---|
| 64 | return;
|
---|
| 65 | }
|
---|
| 66 |
|
---|
| 67 | // Beyond this point we should have a profile
|
---|
| 68 | if (negoState.getProfile() == null) {
|
---|
| 69 | negoState = negoState.with(this.profileint.getProfile());
|
---|
| 70 | }
|
---|
| 71 |
|
---|
| 72 | if (info instanceof ActionDone) {
|
---|
| 73 | // All actions already have been updated in the voting phase
|
---|
| 74 | // negoState = negoState.with(((ActionDone) info).getAction());
|
---|
| 75 | } else if (info instanceof YourTurn) {
|
---|
| 76 | getConnection().send(getAction());
|
---|
| 77 | // we will receive ActionDone and update state then
|
---|
| 78 | } else if (info instanceof Voting) {
|
---|
| 79 | lastVotes = vote((Voting) info);
|
---|
| 80 | getConnection().send(lastVotes);
|
---|
| 81 | } else if (info instanceof OptIn) {
|
---|
| 82 | getConnection().send(lastVotes);
|
---|
| 83 | } else if (info instanceof Finished) {
|
---|
| 84 | getReporter().log(Level.INFO, "Final outcome:" + info);
|
---|
| 85 | }
|
---|
| 86 | } catch (Exception e) {
|
---|
| 87 | throw new RuntimeException("Failed to handle info " + info, e);
|
---|
| 88 | }
|
---|
| 89 |
|
---|
| 90 | }
|
---|
| 91 |
|
---|
| 92 | /**
|
---|
| 93 | * Factory method to create initial state. Override to insert mock
|
---|
| 94 | *
|
---|
| 95 | * @return initial BoaState
|
---|
| 96 | */
|
---|
| 97 | protected Group5BoaState initialState() {
|
---|
| 98 | return new Group5BoaState(getReporter());
|
---|
| 99 | }
|
---|
| 100 |
|
---|
| 101 | protected Class<? extends OpponentModel> getOpponentModel(Settings settings)
|
---|
| 102 | throws InstantiationFailedException {
|
---|
| 103 | return FrequencyOpponentModel.class;
|
---|
| 104 | }
|
---|
| 105 |
|
---|
| 106 | protected BiddingStrategy getBiddingStrategy(Settings settings)
|
---|
| 107 | throws InstantiationFailedException {
|
---|
| 108 | return new TimeDependentBiddingStrategy();
|
---|
| 109 | }
|
---|
| 110 |
|
---|
| 111 | protected AcceptanceStrategy getAccceptanceStrategy(Settings settings)
|
---|
| 112 | throws InstantiationFailedException {
|
---|
| 113 | return new TimeDependentAcceptanceStrategy();
|
---|
| 114 | }
|
---|
| 115 |
|
---|
| 116 | @Override
|
---|
| 117 | public String getDescription() {
|
---|
| 118 | return "BOA implementation of Group 5.";
|
---|
| 119 | }
|
---|
| 120 |
|
---|
| 121 | /**
|
---|
| 122 | * @return the most recent bid that was offered, or null if no offer has
|
---|
| 123 | * been done yet.
|
---|
| 124 | */
|
---|
| 125 | protected Bid getLastBid() {
|
---|
| 126 | List<Action> actions = negoState.getActionHistory();
|
---|
| 127 | for (int n = actions.size() - 1; n >= 0; n--) {
|
---|
| 128 | Action action = actions.get(n);
|
---|
| 129 | if (action instanceof Offer) {
|
---|
| 130 | return ((Offer) action).getBid();
|
---|
| 131 | }
|
---|
| 132 | }
|
---|
| 133 | return null;
|
---|
| 134 | }
|
---|
| 135 |
|
---|
| 136 | private Action getAction() {
|
---|
| 137 | Bid lastBid = getLastBid();
|
---|
| 138 | if (lastBid != null && negoState.isAcceptable(lastBid)) {
|
---|
| 139 | return new Accept(negoState.getSettings().getID(), lastBid);
|
---|
| 140 | }
|
---|
| 141 | return negoState.getAction();
|
---|
| 142 | }
|
---|
| 143 |
|
---|
| 144 | /**
|
---|
| 145 | * @param voting the {@link Voting} object containing the options
|
---|
| 146 | *
|
---|
| 147 | * @return our next Votes.
|
---|
| 148 | */
|
---|
| 149 | private Votes vote(Voting voting) throws IOException, InstantiationFailedException {
|
---|
| 150 | for (Offer offer : voting.getBids()) {
|
---|
| 151 | negoState = negoState.with(offer);
|
---|
| 152 | }
|
---|
| 153 | Object val = negoState.getSettings().getParameters().get("minPower");
|
---|
| 154 | Integer minpower = (val instanceof Integer) ? (Integer) val : 2;
|
---|
| 155 | val = negoState.getSettings().getParameters().get("maxPower");
|
---|
| 156 | Integer maxpower = (val instanceof Integer) ? (Integer) val
|
---|
| 157 | : Integer.MAX_VALUE;
|
---|
| 158 |
|
---|
| 159 | Set<Vote> votes = voting.getBids().stream().distinct()
|
---|
| 160 | .filter(offer -> negoState.isAcceptable(offer.getBid()))
|
---|
| 161 | .map(offer -> new Vote(negoState.getSettings().getID(), offer.getBid(), minpower, maxpower))
|
---|
| 162 | .collect(Collectors.toSet());
|
---|
| 163 | return new Votes(negoState.getSettings().getID(), votes);
|
---|
| 164 | }
|
---|
| 165 | } |
---|