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 | } |
---|