1 | package agents.anac.y2016.syagent;
|
---|
2 |
|
---|
3 | import genius.core.Bid;
|
---|
4 | import genius.core.utility.AbstractUtilitySpace;
|
---|
5 |
|
---|
6 | public class negotiationStrategy {
|
---|
7 | private AbstractUtilitySpace utilitySpace;
|
---|
8 | private negotiationInfo negotiationInfo;
|
---|
9 | private double rv = 0.0; // 留保価格
|
---|
10 | private double df = 1.0; // 割引係数
|
---|
11 | private boolean rvFlag = false; // 留保価格 rv が存在する(true)か存在しないか(false)を表すフラグ
|
---|
12 | private boolean dfFlag = false; // 割引があるか(df != 1.0 なら true)ないか(df == 1.0
|
---|
13 | // ならfalse)を表すフラグ
|
---|
14 | private double endNegoTime = 1.0; // endNegotiation するべき時間を取得
|
---|
15 | private double styleChangeTime = 0.6;// 妥協をやめて、強気になり始める時間
|
---|
16 |
|
---|
17 | private boolean isPrinting = false; // 本番用
|
---|
18 |
|
---|
19 | // private boolean isPrinting = true; // デバッグ用
|
---|
20 |
|
---|
21 | public negotiationStrategy(AbstractUtilitySpace utilitySpace,
|
---|
22 | negotiationInfo negotiationInfo, boolean isPrinting) {
|
---|
23 | this.utilitySpace = utilitySpace;
|
---|
24 | this.negotiationInfo = negotiationInfo;
|
---|
25 | this.isPrinting = isPrinting;
|
---|
26 | this.rv = utilitySpace.getReservationValue();
|
---|
27 | this.df = utilitySpace.getDiscountFactor();
|
---|
28 | this.rvFlag = negotiationInfo.setRvFlag();
|
---|
29 | this.dfFlag = negotiationInfo.setDfFlag();
|
---|
30 | this.endNegoTime = getEndNegotiationTime(); // endNegotiation するべき時間を取得
|
---|
31 | this.styleChangeTime = getStyleChangeTime(endNegoTime);// 妥協をやめて、強気になり始める時間
|
---|
32 |
|
---|
33 | }
|
---|
34 |
|
---|
35 | // 受容判定
|
---|
36 | public boolean selectAccept(Bid offeredBid, double time) {
|
---|
37 | try {
|
---|
38 | if (utilitySpace.getUtility(offeredBid) >= getThreshold(time)) {
|
---|
39 | return true;
|
---|
40 | } else {
|
---|
41 | return false;
|
---|
42 | }
|
---|
43 | } catch (Exception e) {
|
---|
44 | System.out.println("受容判定に失敗しました");
|
---|
45 | e.printStackTrace();
|
---|
46 | return false;
|
---|
47 | }
|
---|
48 | }
|
---|
49 |
|
---|
50 | // 交渉終了判定
|
---|
51 | public boolean selectEndNegotiation(double time) {
|
---|
52 | if (df == 0)
|
---|
53 | return true; //
|
---|
54 | double discountedRv = utilitySpace
|
---|
55 | .getReservationValueWithDiscount(time);// 割引後の留保価格
|
---|
56 | if (discountedRv >= getThreshold(time)
|
---|
57 | || (Math.pow(df, time) < 0.5 && rvFlag)) {
|
---|
58 | return true;
|
---|
59 | } else {
|
---|
60 | return false;
|
---|
61 | }
|
---|
62 | } // End of selectEndNegotiation
|
---|
63 |
|
---|
64 | /*
|
---|
65 | * // 閾値を返す public double getThreshold(double time) { double threshold =
|
---|
66 | * 1.0; double yamada = getYamada();// styleChangeTime まで
|
---|
67 | * thresholdをいい感じにする係数 yamada if(rvFlag && dfFlag){// 留保価格 - あり 割引 - あり
|
---|
68 | *
|
---|
69 | * }else if(rvFlag && !dfFlag){// 留保価格 - あり 割引 - なし
|
---|
70 | *
|
---|
71 | * }else if(!rvFlag && dfFlag){// 留保価格 - なし 割引 - あり
|
---|
72 | *
|
---|
73 | * }else if(!rvFlag && !dfFlag){// 留保価格 - なし 割引 - なし
|
---|
74 | *
|
---|
75 | * }
|
---|
76 | *
|
---|
77 | *
|
---|
78 | * return threshold; }
|
---|
79 | *
|
---|
80 | * private double getYamada() {// FIXME double styleChangeTime =
|
---|
81 | * getStyleChangeTime(); double lastUtilityTarget = (df + rv * df)/2; double
|
---|
82 | * yamada = 0.0; return yamada; }
|
---|
83 | *
|
---|
84 | * // 妥協をやめて、強気になり始める時間 private double getStyleChangeTime() {// FIXME
|
---|
85 | * if(dfFlag) return df; else return 0.6; }
|
---|
86 | */
|
---|
87 |
|
---|
88 | /* 以下,ルール間違えてるやつ */
|
---|
89 | /*
|
---|
90 | * // 交渉終了判定 public boolean selectEndNegotiation(double time) { if (!rvFlag)
|
---|
91 | * return false; // rv = 0.0 の時はendNegotiation する必要がない //
|
---|
92 | * 割引後の効用が留保価格を下回るとき交渉を放棄 double discountedMaxUtility = Math.pow(df, time);
|
---|
93 | * if (discountedUtility <= rv && discountedMaxUtility <= rv) { return true;
|
---|
94 | * } else { return false; }
|
---|
95 | *
|
---|
96 | * }else{ return false; }
|
---|
97 | *
|
---|
98 | * } // End of selectEndNegotiation
|
---|
99 | */
|
---|
100 | // 閾値を返す
|
---|
101 | public double getThreshold(double time) {
|
---|
102 | double threshold = 1.0;
|
---|
103 | if (df == 0.0) {
|
---|
104 | return 0.0;
|
---|
105 | }
|
---|
106 | if (isPrinting) {
|
---|
107 | System.out.println("rv : " + rv);
|
---|
108 | System.out.println("df : " + df);
|
---|
109 | System.out.println("rvFlag : " + rvFlag);
|
---|
110 | System.out.println("dfFlag : " + dfFlag);
|
---|
111 | System.out.println("endNegoTime : " + endNegoTime);
|
---|
112 | System.out.println("styleChangeTime : " + styleChangeTime);
|
---|
113 | }
|
---|
114 |
|
---|
115 | if (rvFlag) {// 留保価格 - あり
|
---|
116 | if (dfFlag) { // 留保価格 - あり 割引 - あり
|
---|
117 | double yamada = getYamada(styleChangeTime); // styleChangeTime
|
---|
118 | // まで
|
---|
119 | // thresholdをいい感じにする係数
|
---|
120 | // yamada
|
---|
121 | double minthreshold = 1.0 + (Math.log(1 - styleChangeTime))
|
---|
122 | * yamada; // 閾値の下限
|
---|
123 | double shotaro = getShotaro(minthreshold);// styleChangeTime から
|
---|
124 | // endNegoTimeまで
|
---|
125 | // thresholdをいい感じにする係数
|
---|
126 | // shotaro
|
---|
127 |
|
---|
128 | if (time <= styleChangeTime) {
|
---|
129 | threshold = 1.0 + (Math.log(1.0 - time) * yamada);
|
---|
130 | } else if (time < endNegoTime) {
|
---|
131 | threshold = minthreshold
|
---|
132 | - (Math.log(1.0 + styleChangeTime - time))
|
---|
133 | * shotaro;
|
---|
134 | }
|
---|
135 |
|
---|
136 | } else { // 留保価格 - あり 割引 - なし
|
---|
137 | double minthreshold = 1.0 + (Math.log(1 - styleChangeTime)) / 4.7; // 閾値の下限
|
---|
138 |
|
---|
139 | if (time <= styleChangeTime) {
|
---|
140 | threshold = 1.0 + (Math.log(1.0 - time) / 4.7);
|
---|
141 | } else if (time < endNegoTime) {
|
---|
142 | threshold = minthreshold
|
---|
143 | - (Math.log(1.0 + styleChangeTime - time)) / 3.0;
|
---|
144 | }
|
---|
145 | }
|
---|
146 |
|
---|
147 | } else {
|
---|
148 | if (dfFlag) { // 留保価格 - なし 割引 - あり
|
---|
149 | double convertTime = time % df;
|
---|
150 | double yamada = getYamada(styleChangeTime); // styleChangeTime
|
---|
151 | // まで
|
---|
152 | // thresholdをいい感じにする係数
|
---|
153 | // yamada
|
---|
154 | if (convertTime <= styleChangeTime) {
|
---|
155 | threshold = 1.0 + (Math.log(1.0 - convertTime) * yamada);
|
---|
156 | }
|
---|
157 | } else { // 留保価格 - なし 割引 - なし
|
---|
158 | threshold = 1.0 - 0.1 * (1.0 + Math.sin(Math.PI
|
---|
159 | * (6.0 * time - 0.5)));
|
---|
160 | }
|
---|
161 | }
|
---|
162 |
|
---|
163 | if (time > 0.985) {
|
---|
164 | threshold = negotiationInfo.getMyBidAverage();// 一応合意できるように最後にテキトーに下げる
|
---|
165 | }
|
---|
166 | if (isPrinting) {
|
---|
167 | System.out.println("time: " + time);
|
---|
168 | System.out.println("threshold: " + threshold);
|
---|
169 | System.out.println(":::::::::::::::::::::::::::::::::::::::::::");
|
---|
170 |
|
---|
171 | }
|
---|
172 |
|
---|
173 | double minthreshold = 1.0 + (Math.log(0.4)) / 4.7; // 閾値の下限
|
---|
174 |
|
---|
175 | if (time <= 0.6) {
|
---|
176 | threshold = 1.0 + (Math.log(1.0 - time) / 4.7);
|
---|
177 | } else {
|
---|
178 | threshold = minthreshold - (Math.log(1.6 - time)) / 3.0;
|
---|
179 | }
|
---|
180 |
|
---|
181 | return threshold;
|
---|
182 | }
|
---|
183 |
|
---|
184 | private double getShotaro(double minthreshold) {
|
---|
185 |
|
---|
186 | // minthreshold - (Math.log(1.0+styleChangeTime-endNegoTime)) * shotaro
|
---|
187 | // = 1.0 となればいいので以下で shotaro を計算
|
---|
188 | double shotaro = (minthreshold - 1.0)
|
---|
189 | / (Math.log(1.0 + styleChangeTime - endNegoTime));
|
---|
190 | return shotaro;
|
---|
191 | }
|
---|
192 |
|
---|
193 | private double getYamada(double styleChangeTime) {
|
---|
194 | // minthreshold (= rv) = (1.0 + (Math.log(1-styleChangeTime)) * yamada)
|
---|
195 | // * Math.pow(df,styleChangeTime) とするので以下で yamada を計算
|
---|
196 | double yamada = (rv / Math.pow(df, styleChangeTime) - 1.0)
|
---|
197 | / (Math.log(1 - styleChangeTime));
|
---|
198 | if (!rvFlag) {
|
---|
199 | yamada = (0.7 / Math.pow(df, styleChangeTime) - 1.0)
|
---|
200 | / (Math.log(1 - styleChangeTime)); // テキトーに rv = 0.7 として
|
---|
201 | // yamada を計算
|
---|
202 | }
|
---|
203 | return yamada;
|
---|
204 | }
|
---|
205 |
|
---|
206 | // 妥協をやめて、強気になり始める時間を求めるメソッド
|
---|
207 | // 割引が大きいほど早く threshold を低くする必要がある -> df によって変化させる
|
---|
208 | // 自分のさじ加減だけど。
|
---|
209 | private double getStyleChangeTime(double endNegoTime) {
|
---|
210 | if (endNegoTime == 1.0) {
|
---|
211 | if (rvFlag)
|
---|
212 | return 0.6; // テキトー
|
---|
213 | else
|
---|
214 | return df;
|
---|
215 | } else {
|
---|
216 | return df * endNegoTime; // ここもテキトー
|
---|
217 | }
|
---|
218 | }
|
---|
219 |
|
---|
220 | /*
|
---|
221 | * endNegotiation するべき時間を計算するメソッド(留保価格と自分の提案の割引後の効用から) discountedUtility =
|
---|
222 | * Utility * pow(df,time) より、自分が maxUtility(=1.0) で offer した時
|
---|
223 | * discountedUtility = pow(df,time) んで、 rv > discountedUtility となる time に
|
---|
224 | * endNegotiation その time を計算するメソッド
|
---|
225 | */
|
---|
226 | private double getEndNegotiationTime() {
|
---|
227 | if (df != 0.0) {
|
---|
228 | if (rv > df && rvFlag) { // 0.0 < endNegoTime < 1.0 となる場合
|
---|
229 | return Math.log(rv) / Math.log(df);
|
---|
230 | } else { // endNegotiation する必要がない場合
|
---|
231 | return 1.0;
|
---|
232 | }
|
---|
233 | } else { // df == 0.0 の時
|
---|
234 | return 0.0;
|
---|
235 | }
|
---|
236 | }
|
---|
237 |
|
---|
238 | }
|
---|