source: src/main/java/agents/anac/y2016/syagent/negotiationStrategy.java

Last change on this file was 1, checked in by Wouter Pasman, 6 years ago

Initial import : Genius 9.0.0

File size: 8.2 KB
Line 
1package agents.anac.y2016.syagent;
2
3import genius.core.Bid;
4import genius.core.utility.AbstractUtilitySpace;
5
6public 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}
Note: See TracBrowser for help on using the repository browser.