1 | package agents;
|
---|
2 |
|
---|
3 | import java.util.ArrayList;
|
---|
4 | import java.util.Collections;
|
---|
5 |
|
---|
6 | import genius.core.Agent;
|
---|
7 | import genius.core.Bid;
|
---|
8 | import genius.core.BidIterator;
|
---|
9 | import genius.core.actions.Accept;
|
---|
10 | import genius.core.actions.Action;
|
---|
11 | import genius.core.actions.ActionWithBid;
|
---|
12 | import genius.core.actions.Offer;
|
---|
13 |
|
---|
14 | /**
|
---|
15 | * This agent just offers all bids in decreasing utility order to opponent. The
|
---|
16 | * acceptance criterion is the same as with the SimpleAgent.
|
---|
17 | *
|
---|
18 | * @author W.Pasman
|
---|
19 | *
|
---|
20 | */
|
---|
21 | public class DecUtilAgent extends Agent {
|
---|
22 | private Action actionOfPartner = null;
|
---|
23 | ArrayList<Bid> bids = new ArrayList<Bid>();
|
---|
24 | int nextBidIndex = 0; // what's the next bid from bids to be done.
|
---|
25 |
|
---|
26 | @Override
|
---|
27 | public void init() {
|
---|
28 |
|
---|
29 | BidIterator biter = new BidIterator(utilitySpace.getDomain());
|
---|
30 | while (biter.hasNext())
|
---|
31 | bids.add(biter.next());
|
---|
32 | Collections.sort(bids, new BidComparator(utilitySpace));
|
---|
33 | }
|
---|
34 |
|
---|
35 | public void ReceiveMessage(Action opponentAction) {
|
---|
36 | actionOfPartner = opponentAction;
|
---|
37 | }
|
---|
38 |
|
---|
39 | public Action chooseAction() {
|
---|
40 | Action action = null;
|
---|
41 | try {
|
---|
42 | if (actionOfPartner == null)
|
---|
43 | action = new Offer(getAgentID(), bids.get(nextBidIndex++));
|
---|
44 | if (actionOfPartner instanceof Offer) {
|
---|
45 | action = new Offer(getAgentID(), bids.get(nextBidIndex++));
|
---|
46 | }
|
---|
47 | // Thread.sleep(300); // 3 bids per second is good enough.
|
---|
48 | } catch (Exception e) {
|
---|
49 | System.out.println("Exception in ChooseAction:" + e.getMessage());
|
---|
50 | // best guess if things go wrong.
|
---|
51 | action = new Accept(getAgentID(),
|
---|
52 | ((ActionWithBid) actionOfPartner).getBid());
|
---|
53 | }
|
---|
54 | return action;
|
---|
55 | }
|
---|
56 |
|
---|
57 | /**
|
---|
58 | * This function determines the accept probability for an offer. At t=0 it
|
---|
59 | * will prefer high-utility offers. As t gets closer to 1, it will accept
|
---|
60 | * lower utility offers with increasing probability. it will never accept
|
---|
61 | * offers with utility 0.
|
---|
62 | *
|
---|
63 | * @param u
|
---|
64 | * is the utility
|
---|
65 | * @param t
|
---|
66 | * is the time as fraction of the total available time (t=0 at
|
---|
67 | * start, and t=1 at end time)
|
---|
68 | * @return the probability of an accept at time t
|
---|
69 | * @throws Exception
|
---|
70 | * if you use wrong values for u or t.
|
---|
71 | *
|
---|
72 | */
|
---|
73 | double Paccept(double u, double t1) throws Exception {
|
---|
74 | double t = t1 * t1 * t1; // steeper increase when deadline approaches.
|
---|
75 | if (u < 0 || u > 1.05)
|
---|
76 | throw new Exception("utility " + u + " outside [0,1]");
|
---|
77 | // normalization may be slightly off, therefore we have a broad boundary
|
---|
78 | // up to 1.05
|
---|
79 | if (t < 0 || t > 1)
|
---|
80 | throw new Exception("time " + t + " outside [0,1]");
|
---|
81 | if (u > 1.)
|
---|
82 | u = 1;
|
---|
83 | if (t == 0.5)
|
---|
84 | return u;
|
---|
85 | return (u - 2. * u * t + 2. * (-1. + t + Math.sqrt(sq(-1. + t) + u
|
---|
86 | * (-1. + 2 * t))))
|
---|
87 | / (-1. + 2 * t);
|
---|
88 | }
|
---|
89 |
|
---|
90 | double sq(double x) {
|
---|
91 | return x * x;
|
---|
92 | }
|
---|
93 | } |
---|