public class AlternatingMultipleOffersProtocol extends DefaultMultilateralProtocol
Round 1: Each agent makes their own offer. Round 2: Each agent votes (accept/reject) for each offer on the table. If there is one offer that everyone accepts, the negotiation ends with this offer. Otherwise, the process continues until reaching deadline or agreement.
The AMOP protocol is an alternating offers protocol in which all players get the same opportunities. That is, every bid that is made in a round is available to all agents before they vote on these bids. This implemented in the following way: The AMOP protocol has a bidding phase followed by voting phases. In the bidding phase all negotiators put their offer on the table. In the voting phases all participants vote on all of the bids on the negotiation table. If one of the bids on the negotiation table is accepted by all of the parties, then the negotiation ends with this bid. This is an iterative process continuing until reaching an agreement or reaching the deadline. The essential difference with the SAOP protocol is that the players do not override the offers made by others and the agents can take all offers into account before they vote on the proposals.
isAborted
Constructor and Description |
---|
AlternatingMultipleOffersProtocol() |
Modifier and Type | Method and Description |
---|---|
protected Offer |
acceptedOffer(Round votingRound,
Round offerRound)
returns the first offer in the given
Round that everyone
accepted, or null if no such offer. |
protected void |
allActionsAreOffers(Round offerRound)
Checks if all actions are offers.
|
Round |
createRound()
factory function.
|
Turn |
createTurn(NegotiationParty party,
java.lang.Class<? extends Action> allowedAction)
create factory function.
|
Turn |
createTurn(NegotiationParty votingParty,
java.util.Collection<java.lang.Class<? extends Action>> allowedActions)
factory function.
|
java.util.Map<NegotiationParty,java.util.List<NegotiationParty>> |
getActionListeners(java.util.List<NegotiationParty> parties)
Get a map of parties that are listening to each other's response
|
Bid |
getCurrentAgreement(Session session,
java.util.List<NegotiationParty> parties)
Gets the current agreement if any.
|
int |
getNumberOfAgreeingParties(Session session,
java.util.List<NegotiationParty> parties)
Gets the maximum number of vote this protocol found.
|
Round |
getRoundStructure(java.util.List<NegotiationParty> parties,
Session session)
Get the round structure used by this algorithm.
|
boolean |
isFinished(Session session,
java.util.List<NegotiationParty> parties)
Check if the protocol is done or still busy.
|
protected boolean |
isVotingRound(Session session)
Returns whether this is a voting round.
|
protected int |
nrOfVotes(int numOffers,
java.util.List<Turn> turns,
int offerNumber) |
afterSession, applyAction, beforeSession, checkOffer, endNegotiation, endNegotiation, exclude, includeOnly, listenToAll, listenToNone
public Round getRoundStructure(java.util.List<NegotiationParty> parties, Session session)
Round 1: Each agent makes their own offer. Round 2: Each agent votes (accept/reject) for each offer on the table.
getRoundStructure
in interface MultilateralProtocol
getRoundStructure
in class DefaultMultilateralProtocol
parties
- The parties currently participatingsession
- The complete session historypublic boolean isFinished(Session session, java.util.List<NegotiationParty> parties)
MultilateralProtocol
SessionManager
will not start a new
Round
after the current one. It will however finish all the turns
described in the
MultilateralProtocol.getRoundStructure(java.util.List, genius.core.session.Session)
method.isFinished
in interface MultilateralProtocol
isFinished
in class DefaultMultilateralProtocol
session
- the current state of this sessionparties
- all the parties involved in the negotiationpublic Bid getCurrentAgreement(Session session, java.util.List<NegotiationParty> parties)
Round
s containing offer, votes, offer, votes, etc in this order.
An agreement consists an Offer
that was Accept
ed by all
the votes. See also acceptedOffer(Round, Round)
.getCurrentAgreement
in interface MultilateralProtocol
getCurrentAgreement
in class DefaultMultilateralProtocol
session
- The complete session history up to this pointparties
- The parties involved in the current negotiationprotected Offer acceptedOffer(Round votingRound, Round offerRound)
Round
that everyone
accepted, or null if no such offer.votingRound
- the round with the voting (Accept
or Reject
)
actions. The turns in votingRound must contain the following:
(N is the number of turns in the offer round)
vote(party1,offer1), vote(party2, offer1), ..., vote(partyN, offer1), vote(party1, offer2), ......, vote(party1, offerN), ... , vote(partyN, offerN)
We only consider offers that ALL N parties have voted on.offerRound
- the round with the offers (one for each party is expected).java.lang.IllegalArgumentException
- if the offerRound contains Action
(s) not extending
Offer
protected int nrOfVotes(int numOffers, java.util.List<Turn> turns, int offerNumber)
numOffers
- the number of offers on the table (in each turn)turns
- all the voting turnsofferNumber
- the offer number that is being checked.Accept
s for given offer numberprotected void allActionsAreOffers(Round offerRound)
offerRound
- java.lang.IllegalArgumentException
- if not.protected boolean isVotingRound(Session session)
session
- the current state of this sessionpublic int getNumberOfAgreeingParties(Session session, java.util.List<NegotiationParty> parties)
getNumberOfAgreeingParties
in interface MultilateralProtocol
getNumberOfAgreeingParties
in class DefaultMultilateralProtocol
session
- the current state of this sessionparties
- The parties currently participatingpublic java.util.Map<NegotiationParty,java.util.List<NegotiationParty>> getActionListeners(java.util.List<NegotiationParty> parties)
DefaultMultilateralProtocol
getActionListeners
in interface MultilateralProtocol
getActionListeners
in class DefaultMultilateralProtocol
parties
- The parties involved in the current negotiationNegotiationParty
that is responding to
a NegotiationParty.chooseAction(java.util.List)
event,
and the value is a list of NegotiationParty
that are
listening to that key party's response.public Turn createTurn(NegotiationParty votingParty, java.util.Collection<java.lang.Class<? extends Action>> allowedActions)
votingParty
- allowedActions
- list of allowed action classesTurn
with given actions as possible actions.public Turn createTurn(NegotiationParty party, java.lang.Class<? extends Action> allowedAction)
party
- allowedAction
- the class of action that is possible.Turn
with given action as possible actions.public Round createRound()