Trading Phase¶
After the Registration Phase there is the trading phase, where the actual competition takes place.
At this point, every participant should have received from the controller agent the data of the game.
In the following sections, we will see how an agent can play the game and improve its score. In particular:
what is the initial state of an agent.
what is a transaction;
how a transaction can be submitted to the controller agent;
how to negotiate with other trading agents.
Game data¶
As we said, every agent that registered to the competition will eventually receive their endowment in order to devise a strategy and to start playing.
More precisely, the GameData
contains the following information:
money
(integer): the money amount available to the TAC agent.endowment
(list of integers): the endowment for every good.utility_params
(list of floats): the utility parameters for every good.nb_agents
(integer): the number of agents in the competition.nb_goods
(integer): the number of goods in the competition.tx_fee
(float): the transaction fee for every trade.agent_pbk_to_name
(dictionary[string, string]): mapping the public key of each agent to its name.good_pbk_to_name
(dictionary[string, string]): mapping the public key of each good to its name.
Note
- An agent is not aware of:
the endowment of any other participant
the utility_params of any other participant
Example¶
Example: Let agent_1
and agent_2
be participants of a TAC game.
Assume that there are two types of good: good_1
and good_2
.
This table describes the holdings of the agents. That is, how many instances of goods the agents hold:
good_1 |
good_2 |
|
agent_1 |
1 |
2 |
agent_2 |
4 |
1 |
This table shows the utility parameters for every good, for every agent.
good_1 |
good_2 |
|
agent_1 |
80.0 |
20.0 |
agent_2 |
30.0 |
70.0 |
And this table shows the balance of every agent, that is, how much money they have.
money |
|
agent_1 |
200 |
agent_2 |
100 |
The scores for an agent can be computed in this way:
Where \(M\) is the money amount left, \(u_i\) is the utility parameter for good \(i\), and \(q_i\) is the quantity of good \(i\), and if \(q_i > 0\)
else
In the example:
agent_1
score: \(200 + (80.0 \cdot f(1) + 20.0 \cdot f(2)) = 213.86\)agent_2
score: \(100 + (30.0 \cdot f(4) + 70.0 \cdot f(1)) = 141.59\)
TAC Transaction¶
A transaction in the TAC competition is an exchange of good instances and money between a buyer and a seller agent.
The message that represents a transaction request to the controller agent
is TACMessage
of type TRANSACTION
. It contains these fields:
transaction_id
(string): a string that uniquely identifies a transaction.buyer
(bool): whether the sender of the transaction request is the buyer of the transaction. in other words,True
if the sender agent, in this transaction, takes the role of a buyer;False
otherwise (it is the seller).counterparty
(string): the public key of the counterparty agent in the transaction.amount
(integer): the amount of money involved in the transaction (i.e. the price).quantities_by_good_pbk
: a map from good public keys to the number of instances traded. If a good public key is not contained in the set of all good public keys, we assume that the quantity involved in the transaction is 0.
Transaction example¶
Borrowing the example in the previous section, a transaction in that scenario might be:
agent_1
is the buyer, whereas theagent_2
is the seller- the
quantities_by_good_pbk
field contains the following map: good_1
->1
good_2
->0
that is, the buyer is interested in only
1
quantity of the good with public keygood_1
.- the
the amount is
10
.
Submit a transaction¶
In order to submit a transaction, both parties must submit a transaction request to the controller agent, using the
TACMessage
of type TRANSACTION
.
Once the controller receives two matching and valid transaction requests from both parties, the transaction is settled, which implies:
The controller agent updates the good holdings and money balances of both the buyer agent and the seller agent.
The controller sends a
TACMessage
of typeTRANSACTION_CONFIRMATION
to the buyer and the seller.
Invalid transaction¶
- A transaction is valid if:
the buyer has enough balance to pay the transaction amount, and
the seller has at least the good quantities to sell declared in the transaction.
As soon as the controller agents receives an invalid transaction request, he will reply with
a TACMessage
of type TAC_ERROR
.
Negotiation with other agents¶
One of the OEF features is the support for (a subset of) the FIPA protocol, that is well-suited for handling negotiations.
Hence, the trading agents can negotiate with each other by using the FIPA Protocol. API exposed by the SDK.
Handle unexpected disconnection¶
A trading agent can request from the controller agent her current state in the game with the TACMessage
of type GET_STATE_UPDATE
.