[341] | 1 | package agents.anac.y2018.ponpokorampage;
|
---|
| 2 |
|
---|
[343] | 3 | import java.util.List;
|
---|
[341] | 4 |
|
---|
[343] | 5 | import java.util.ArrayList;
|
---|
| 6 | import java.util.Collections;
|
---|
[341] | 7 | import java.util.Comparator;
|
---|
[343] | 8 | import java.util.HashMap;
|
---|
| 9 | import java.util.HashSet;
|
---|
| 10 | import java.util.Map;
|
---|
| 11 | import java.util.Random;
|
---|
| 12 | import java.util.Set;
|
---|
[341] | 13 |
|
---|
[343] | 14 | import genius.core.AgentID;
|
---|
| 15 | import genius.core.Bid;
|
---|
| 16 | import genius.core.Domain;
|
---|
| 17 | import genius.core.actions.Accept;
|
---|
| 18 | import genius.core.actions.Action;
|
---|
| 19 | import genius.core.actions.EndNegotiation;
|
---|
| 20 | import genius.core.actions.Offer;
|
---|
| 21 | import genius.core.parties.AbstractNegotiationParty;
|
---|
| 22 | import genius.core.parties.NegotiationInfo;
|
---|
| 23 | import genius.core.utility.UtilitySpace;
|
---|
[341] | 24 |
|
---|
[343] | 25 |
|
---|
[341] | 26 | public class PonPokoRampage extends AbstractNegotiationParty {
|
---|
| 27 |
|
---|
| 28 | private Bid lastReceivedBid = null;
|
---|
| 29 | private Domain domain = null;
|
---|
| 30 |
|
---|
| 31 | private Map<String, List<Bid>> hoge;
|
---|
| 32 | private Map<String, Boolean> hardliner;
|
---|
| 33 |
|
---|
| 34 | private List<BidInfo> lBids;
|
---|
| 35 |
|
---|
| 36 | private double threshold_low = 0.99;
|
---|
| 37 | private double threshold_high = 1.0;
|
---|
| 38 |
|
---|
| 39 | private final int PATTERN_SIZE = 5;
|
---|
| 40 | private int pattern = 0;
|
---|
| 41 | // PrintStream out;
|
---|
| 42 | private int count = 0;
|
---|
| 43 |
|
---|
| 44 | @Override
|
---|
| 45 | public void init(NegotiationInfo info) {
|
---|
| 46 |
|
---|
| 47 | // try {
|
---|
| 48 | // out = new PrintStream("C:\\debug.log");
|
---|
| 49 | // }catch (Exception e){
|
---|
| 50 | //
|
---|
| 51 | // }
|
---|
| 52 |
|
---|
| 53 | super.init(info);
|
---|
| 54 | this.domain = info.getUtilitySpace().getDomain();
|
---|
| 55 |
|
---|
| 56 | // long a = System.currentTimeMillis();
|
---|
| 57 | lBids = new ArrayList<>(AgentTool.generateRandomBids(this.domain, 30000, this.rand, this.utilitySpace ) );
|
---|
| 58 | Collections.sort(lBids, new BidInfoComp().reversed() );
|
---|
| 59 | // out.println(System.currentTimeMillis() -a);
|
---|
| 60 | hoge = new HashMap<>();
|
---|
| 61 | hardliner = new HashMap<>();
|
---|
| 62 |
|
---|
| 63 |
|
---|
| 64 | pattern = rand.nextInt(PATTERN_SIZE);
|
---|
| 65 | }
|
---|
| 66 |
|
---|
| 67 | @Override
|
---|
| 68 | public Action chooseAction(List<Class<? extends Action>> validActions) {
|
---|
| 69 | count++;
|
---|
| 70 | long a = System.currentTimeMillis();
|
---|
| 71 |
|
---|
| 72 | if (utilitySpace.getReservationValue() >= 0.9){
|
---|
| 73 | return new EndNegotiation(getPartyId());
|
---|
| 74 | }
|
---|
| 75 |
|
---|
| 76 | if (count % 200 == 199){
|
---|
| 77 | hoge.forEach( (k ,v) -> {
|
---|
| 78 | //out.println((new HashSet<>(v)).size());
|
---|
| 79 | if( (new HashSet<>(v)).size() < 20 * getTimeLine().getTime()){
|
---|
| 80 | hardliner.put(k,Boolean.TRUE);
|
---|
| 81 | }
|
---|
| 82 | else {
|
---|
| 83 | hardliner.put(k, Boolean.FALSE);
|
---|
| 84 | }
|
---|
| 85 | });
|
---|
| 86 | }
|
---|
| 87 |
|
---|
| 88 | //譲歩度合いの設定
|
---|
| 89 | if (pattern == 0) {
|
---|
| 90 | threshold_high = 1 - 0.1 * timeline.getTime();
|
---|
| 91 | threshold_low = 1 - 0.2 * timeline.getTime() - 0.1 * Math.abs(Math.sin(this.timeline.getTime() * 16));
|
---|
| 92 | }
|
---|
| 93 | else if (pattern == 1){
|
---|
| 94 | threshold_high = 1;
|
---|
| 95 | threshold_low = 1 - 0.22 * timeline.getTime();
|
---|
| 96 | }
|
---|
| 97 | else if (pattern == 2){
|
---|
| 98 | threshold_high = 1 - 0.1 * timeline.getTime();
|
---|
| 99 | threshold_low = 1 - 0.1 * timeline.getTime() - 0.15 * Math.abs(Math.sin(this.timeline.getTime() * 32));
|
---|
| 100 | }
|
---|
| 101 | else if (pattern == 3){
|
---|
| 102 | threshold_high = 1 - 0.05 * timeline.getTime();
|
---|
| 103 | threshold_low = 1 - 0.2 * timeline.getTime();
|
---|
| 104 | if (timeline.getTime() > 0.98){
|
---|
| 105 | threshold_low = 1 - 0.3 * timeline.getTime();
|
---|
| 106 | }
|
---|
| 107 | }else if (pattern == 4){
|
---|
| 108 | threshold_high = 1 - 0.15 * this.timeline.getTime() * Math.abs(Math.sin(this.timeline.getTime() * 32));
|
---|
| 109 | threshold_low = 1 - 0.25 * this.timeline.getTime() * Math.abs(Math.sin(this.timeline.getTime() * 32));
|
---|
| 110 | }
|
---|
| 111 | else {
|
---|
| 112 | System.out.println("pattern error");
|
---|
| 113 | threshold_high = 1 - 0.1 * timeline.getTime();
|
---|
| 114 | threshold_low = 1 - 0.2 * Math.abs(Math.sin(this.timeline.getTime() * 64));
|
---|
| 115 | }
|
---|
| 116 |
|
---|
| 117 | if (hardliner.containsValue(Boolean.TRUE)){
|
---|
| 118 | threshold_low += 0.05;
|
---|
| 119 | }
|
---|
| 120 |
|
---|
| 121 | //Accept判定
|
---|
| 122 | if ( lastReceivedBid != null) {
|
---|
| 123 | if (getUtility(lastReceivedBid) > threshold_low ){
|
---|
| 124 | return new Accept(getPartyId(), lastReceivedBid);
|
---|
| 125 | }
|
---|
| 126 | }
|
---|
| 127 |
|
---|
| 128 | //Offerするbidの選択
|
---|
| 129 | Bid bid = null;
|
---|
| 130 | while (bid == null){
|
---|
| 131 | bid = AgentTool.selectBidfromList(this.lBids, this.threshold_high, this.threshold_low);
|
---|
| 132 | if (bid == null) {
|
---|
| 133 | threshold_low -= 0.001;
|
---|
| 134 | }
|
---|
| 135 | }
|
---|
| 136 | return new Offer(getPartyId(), bid);
|
---|
| 137 | }
|
---|
| 138 |
|
---|
| 139 | @Override
|
---|
| 140 | public void receiveMessage(AgentID sender, Action action) {
|
---|
| 141 | super.receiveMessage(sender, action);
|
---|
| 142 | if (action instanceof Offer) {
|
---|
| 143 | lastReceivedBid = ((Offer) action).getBid();
|
---|
| 144 | if (hoge.containsKey(sender.getName())){
|
---|
| 145 | hoge.get(sender.getName()).add(((Offer) action).getBid());
|
---|
| 146 | }else {
|
---|
| 147 | hoge.put(sender.getName(), new ArrayList<>());
|
---|
| 148 | hoge.get(sender.getName()).add( ((Offer) action).getBid());
|
---|
| 149 | }
|
---|
| 150 | }
|
---|
| 151 | }
|
---|
| 152 |
|
---|
[345] | 153 | @Override
|
---|
| 154 | public String getDescription() {
|
---|
| 155 | return "ANAC2018";
|
---|
| 156 | }
|
---|
[341] | 157 |
|
---|
| 158 | }
|
---|
| 159 |
|
---|
| 160 | class AgentTool{
|
---|
| 161 |
|
---|
| 162 | private static Random random = new Random();
|
---|
| 163 |
|
---|
| 164 | public static Bid selectBidfromList( List<BidInfo> bidInfoList, double higerutil, double lowwerutil){
|
---|
| 165 | List<BidInfo> bidInfos = new ArrayList<>();
|
---|
| 166 | bidInfoList.forEach(bidInfo -> {
|
---|
| 167 | if (bidInfo.getutil() <= higerutil && bidInfo.getutil() >= lowwerutil){
|
---|
| 168 | bidInfos.add(bidInfo);
|
---|
| 169 | }
|
---|
| 170 | });
|
---|
| 171 | if (bidInfos.size() == 0){
|
---|
| 172 | return null;
|
---|
| 173 | }
|
---|
| 174 | else {
|
---|
| 175 | return bidInfos.get(random.nextInt(bidInfos.size())).getBid();
|
---|
| 176 | }
|
---|
| 177 | }
|
---|
| 178 |
|
---|
| 179 | public static Set<BidInfo> generateRandomBids(Domain d, int numberOfBids, Random random, UtilitySpace utilitySpace){
|
---|
| 180 | Set<BidInfo> randombids = new HashSet<>();
|
---|
| 181 | for (int i = 0; i < numberOfBids; i++){
|
---|
| 182 | Bid b = d.getRandomBid(random);
|
---|
| 183 | randombids.add(new BidInfo(b, utilitySpace.getUtility(b)));
|
---|
| 184 | }
|
---|
| 185 | return randombids;
|
---|
| 186 | }
|
---|
| 187 |
|
---|
| 188 | }
|
---|
| 189 |
|
---|
| 190 |
|
---|
| 191 | //bidとその効用を保存するクラス
|
---|
| 192 | class BidInfo{
|
---|
| 193 | Bid bid;
|
---|
| 194 | double util;
|
---|
| 195 | public BidInfo( Bid b ){
|
---|
| 196 | this.bid = b;
|
---|
| 197 | util = 0.0;
|
---|
| 198 | }
|
---|
| 199 | public BidInfo( Bid b , double u){
|
---|
| 200 | this.bid = b;
|
---|
| 201 | util = u;
|
---|
| 202 | }
|
---|
| 203 |
|
---|
| 204 | public void setutil(double u){
|
---|
| 205 | util = u;
|
---|
| 206 | }
|
---|
| 207 |
|
---|
| 208 | public Bid getBid(){
|
---|
| 209 | return bid;
|
---|
| 210 | }
|
---|
| 211 |
|
---|
| 212 | public double getutil(){
|
---|
| 213 | return util;
|
---|
| 214 | }
|
---|
| 215 |
|
---|
| 216 |
|
---|
| 217 | @Override
|
---|
| 218 | public int hashCode() {
|
---|
| 219 | return bid.hashCode();
|
---|
| 220 | }
|
---|
| 221 |
|
---|
| 222 | public boolean equals(BidInfo bidInfo) {
|
---|
| 223 | return bid.equals(bidInfo.getBid());
|
---|
| 224 | }
|
---|
| 225 |
|
---|
| 226 | @Override
|
---|
| 227 | public boolean equals(Object obj){
|
---|
| 228 | if ( obj == null){
|
---|
| 229 | return false;
|
---|
| 230 | }
|
---|
| 231 | if ( obj instanceof BidInfo){
|
---|
| 232 | return ((BidInfo)obj).getBid().equals(bid);
|
---|
| 233 | }else {
|
---|
| 234 | return false;
|
---|
| 235 | }
|
---|
| 236 | }
|
---|
| 237 |
|
---|
| 238 | }
|
---|
| 239 |
|
---|
| 240 | final class BidInfoComp implements Comparator<BidInfo> {
|
---|
| 241 | BidInfoComp(){
|
---|
| 242 | super();
|
---|
| 243 | }
|
---|
| 244 | @Override
|
---|
| 245 | public int compare(BidInfo o1, BidInfo o2) {
|
---|
| 246 | return Double.compare(o1.getutil(), o2.getutil());
|
---|
| 247 | }
|
---|
| 248 | }
|
---|