source: src/main/java/agents/anac/y2018/agent33/etc/NegoStrategy.java@ 345

Last change on this file since 345 was 343, checked in by Tim Baarslag, 4 years ago

Fixed all errors in all 2018 agents

File size: 7.7 KB
Line 
1package agents.anac.y2018.agent33.etc;
2
3import java.util.ArrayList;
4
5import genius.core.Bid;
6import genius.core.parties.NegotiationInfo;
7
8
9public class NegoStrategy {
10 private NegotiationInfo info;
11 private boolean isPrinting = false; // デバッグ用
12 private boolean isPrinting_Strategy = true;
13
14 private NegoStats negoStats; // 交渉情報
15 private NegoHistory negoHistory;
16 private double rv = 0.0; // 留保価格
17 private double df = 0.0; // 割引効用
18
19
20 public NegoStrategy(NegotiationInfo info, boolean isPrinting, NegoStats negoStats, NegoHistory negoHistory){
21 this.info = info;
22 this.isPrinting = isPrinting;
23
24 this.negoStats = negoStats;
25 this.negoHistory = negoHistory;
26 rv = info.getUtilitySpace().getReservationValueUndiscounted();
27 df = info.getUtilitySpace().getDiscountFactor();
28
29 if(this.isPrinting){
30 System.out.println("[isPrinting] NegoStrategy: success");
31 }
32 if(isPrinting_Strategy){
33 System.out.println("[isPrint_Strategy] rv = " + rv);
34 System.out.println("[isPrint_Strategy] df = " + df);
35 }
36 }
37
38 // 受容判定
39 public boolean selectAccept(Bid offeredBid, double time) {
40 try {
41 if(info.getUtilitySpace().getUtility(offeredBid) >= getThreshold(time)){
42 return true;
43 } else {
44 return false;
45 }
46 } catch (Exception e) {
47 System.out.println("[Exception_Strategy] 受容判定に失敗しました");
48 e.printStackTrace();
49 return false;
50 }
51 }
52
53 // 交渉終了判定
54 public boolean selectEndNegotiation(double time) {
55 // 割引効用が設定されているかどうか (ANAC 2017では設定されない方針)
56 if(1.0 - df < 1e-7){
57 return false;
58 } else {
59 if (rv > getThreshold(time)){
60 return true;
61 } else {
62 return false;
63 }
64 }
65
66 }
67
68 /**
69 * 統計情報を元に相手の変位幅を推定 (二分割一様分布を利用)
70 * @param m 平均効用値
71 * @param sd 標準偏差
72 * @return
73 */
74 public double calWidth(double m, double sd){
75 if(m > 0.1 && m < 0.9){
76 return Math.sqrt(3.0 / (m - m*m)) * sd;
77 } else {
78 return Math.sqrt(12) * sd;
79 }
80 }
81
82 // 閾値を返す
83 public double getThreshold(double time) {
84 double threshold = 1.0;//相手からのbidを判断する譲歩関数
85 //double alpha = 3.0;//-----3
86 //double alpha = 3.5;
87 //double alpha = 4.0;//
88 //double alpha = 4.3;
89 //double alpha = 4.9;//---2
90 double alpha = 4.5;//---1
91 //double alpha = 4.2;
92
93 // 交渉相手全員に対してemaxを計算し,最小となるものを探す
94 ArrayList<Object> rivals = negoStats.getRivals();
95 double emax = 1.0;
96 for(Object sender: rivals){
97 double m = negoStats.getRivalMean(sender);
98 double sd = negoStats.getRivalSD(sender);
99
100 // emax = Math.min(emax, m + (1 - m)*calWidth(m, sd));
101 // negoStats.getRivalMax(sender) より今sessionにおける最大効用値を採用
102 emax = Math.min(emax, Math.max(negoStats.getRivalMax(sender), m + (1 - m)*calWidth(m, sd)));
103 emax = Math.max(emax, rv); // 留保価格より小さい場合は,rvを採用する.
104 }
105
106 // 割引効用が設定されているかどうか (ANAC 2017では設定されない方針)
107 if(1.0 - df < 1e-7){
108 threshold = Math.min(threshold, 1 - (1 - emax) * Math.pow(time, alpha));
109 } else {
110
111 //2018/5/18 Farma2016
112 //threshold = Math.max(1 - (1 - df) * Math.log(1 + (Math.E - 1) * time), emax);
113
114 //Farma2017
115 //threshold = Math.max(threshold - time, emax);
116
117 //threshold1
118 //threshold = Math.max(1 - Math.E * df * Math.log(1 + Math.E * time), emax);
119
120 //threshold2
121 //threshold = Math.max(1 - (1 - df) * Math.log(1 + Math.pow((Math.E - 1),alpha) * time), emax);
122
123 //threshold3------2.alpha 4.5
124 //threshold = Math.max(1 - (1 - df) * Math.log(Math.E - 1.9 + Math.pow((Math.E - 1),alpha) * time), emax);
125
126
127 //threshold4------1
128
129 System.out.println("df:" + df);
130 System.out.println("emax:" + emax);
131 if(Math.abs((df - (1 - df))) > 4.0){
132 if(df > 0.5) {
133 threshold = Math.max(df - (1 - df) * Math.log(Math.E - 1.9 + Math.pow((Math.E - 1.0),alpha) * time), emax);
134 }
135 if(df <= 0.5) {
136 threshold = Math.max((1 - df) - df * Math.log(Math.E - 1.9 +Math.pow((Math.E - 1.2),alpha) * time), emax);//1.9
137 }
138
139 }
140
141 else {
142 threshold = Math.max(1 - (1 - df) * Math.log(Math.E - 1.9 + Math.pow((Math.E - 1),alpha) * time), emax);
143 }
144
145 //threshold5
146 /*
147 if(df > 0.5) {
148 threshold = df - (1 - df) * Math.log(Math.E - 1.9 + Math.pow((Math.E - 1.0),alpha) * time);
149 }
150 if(df <= 0.5) {
151 threshold = df - (1 - df) * alpha * Math.log(Math.E - 1.9 +Math.pow((Math.E - 1.0),alpha) * time);//1.9
152 }
153 }
154 */
155 }
156 // 交渉決裂寸前では、過去の提案で最大のものまで譲歩する
157 if(time > 0.95){
158 for(Object sender: rivals) {
159 threshold = Math.min(threshold, negoStats.getRivalMax(sender));
160 }
161 threshold = Math.max(threshold, rv);
162 }
163
164 if(isPrinting_Strategy){
165 System.out.println("[isPrint_Strategy] threshold = " + threshold
166 + " | time: " + time
167 + ", emax: " + emax);
168 }
169
170 return threshold;
171 }
172
173
174 /**
175 * 2018/5/27
176 * bid探索用閾値を返す
177 */
178 public double getThresholdForBidSearch(double time) {
179 double threshold = 1.0;//相手からのbidを判断する譲歩関数
180 double alpha = 3.0;
181
182 // 交渉相手全員に対してemaxを計算し,最小となるものを探す
183 ArrayList<Object> rivals = negoStats.getRivals();
184 double emax = 1.0;
185 for(Object sender: rivals){
186 double m = negoStats.getRivalMean(sender);
187 double sd = negoStats.getRivalSD(sender);
188
189 // emax = Math.min(emax, m + (1 - m)*calWidth(m, sd));
190 // negoStats.getRivalMax(sender) より今sessionにおける最大効用値を採用
191 emax = Math.min(emax, Math.max(negoStats.getRivalMax(sender), m + (1 - m)*calWidth(m, sd)));
192 emax = Math.max(emax, rv); // 留保価格より小さい場合は,rvを採用する.
193 }
194
195
196 threshold = 1 - (1 - emax) * Math.pow(time, alpha);
197
198 //2018/5/18 Farma2016
199 //threshold = Math.max(1 - (1 - df) * Math.log(1 + (Math.E - 1) * time), emax);
200
201 //Farma2017
202 //threshold = Math.max(threshold - time, emax);
203
204 //threshold1
205 //threshold = Math.max(1 - Math.E * df * Math.log(1 + Math.E * time), emax);
206
207 //threshold2
208
209
210
211
212 // 交渉決裂寸前では、過去の提案で最大のものまで譲歩する
213 if(time > 0.99){
214 for(Object sender: rivals) {
215 threshold = Math.min(threshold, negoStats.getRivalMax(sender));
216 }
217 threshold = Math.max(threshold, rv);
218 }
219
220 if(isPrinting_Strategy){
221 System.out.println("[isPrint_Strategy] threshold = " + threshold
222 + " | time: " + time
223 + ", emax: " + emax);
224 }
225
226 return threshold;
227 }
228}
Note: See TracBrowser for help on using the repository browser.