이것은 게임 이론에서 달러 지폐 경매 게임에 대한 KOTH 도전입니다 . 그것에서, 달러는 최고 입찰자에게 판매되고 있습니다. 입찰가는 5 ¢ 단위로 올라가고 패자는 입찰을합니다. 아이디어는 두 선수 모두 손실을 줄이기 위해 1 달러 이상의 가치로 입찰 전쟁을 확대하는 것입니다.
봇이 그보다 똑똑해지기를 바랍니다.
net.ramenchef.dollarauction.DollarBidder
수업 을 확장하여이 게임을 할 수있는 봇을 만들게됩니다 . nextBid
다른 봇의 이전 입찰가가 주어지면 봇의 다음 입찰가를 반환 하는 메소드를 구현해야합니다 . 필요한 newAuction
경우이 방법을 사용 하여 상대 봇 클래스와 함께 각 경매에 대해 재설정 할 수도 있습니다 .
public abstract class DollarBidder {
/**
* Used by the runner to keep track of scores.
*/
long score = 0;
/**
* (Optional) Prepare for the next auction.
*
* @param opponent The class of the opponent's bot.
*/
public void newAuction(Class<? extends DollarBidder> opponent) {}
/**
* Bid on the dollar. Bidding ends if the bid is
* not enough to top the previous bid or both bids
* exceed $100.
*
* @param opponentsBid How much money, in cents,
* that the opponent bid in the previous round. If
* this is the first round in the auction, it will
* be 0.
* @return How much money to bid in this round, in
* cents.
*/
public abstract int nextBid(int opponentsBid);
}
입찰은 다음 중 하나가 발생할 때까지 진행됩니다.
nextBid
예외가 발생합니다. 이 경우 예외를 발생시킨 봇은 이전 입찰을 지불하고 다른 봇은 무료로 달러를받습니다.- 봇은 이전 입찰가보다 높은 금액을 지불하지 않습니다. 이 경우 두 봇 모두 입찰에 참여하고 (패자가 이전 입찰에 지불) 승자는 1 달러를받습니다.
- 두 봇 모두 $ 100 이상 입찰합니다. 이 경우 두 봇은 100 달러를 지불하고 어느 봇도 달러를받지 않습니다.
각 봇 조합에 대해 2 개의 경매가 진행됩니다. 봇은 경매에서 얻은 총 수익으로 점수가 매겨집니다. 가장 높은 점수가 이깁니다.
예
GreedyBot
import net.ramenchef.dollarauction.DollarBidder;
public class GreedyBot extends DollarBidder {
@Override
public int nextBid(int opponentsBid) {
return opponentsBid + 5;
}
}
OnlyWinningMove
import net.ramenchef.dollarauction.DollarBidder;
public class OnlyWinningMove extends DollarBidder {
@Override
public int nextBid(int opponentsBid) {
return 0;
}
}
AnalystBot
분석적으로 생각되는 봇을위한 템플릿으로 이것을 사용하지 마십시오. 사용하는 ImprovedAnalystBot
대신.
import net.ramenchef.dollarauction.DollarBidder;
// yes, this is a poor implementation, but I'm not
// going to waste my time perfecting it
public class AnalystBot extends DollarBidder {
private DollarBidder enemy;
@Override
public void newAuction(Class<? extends DollarBidder> opponent) {
try {
enemy = opponent.newInstance();
enemy.newAuction(this.getClass());
} catch (ReflectiveOperationException e) {
enemy = null;
}
}
@Override
public int nextBid(int opponentsBid) {
if (enemy == null)
return 0;
return enemy.nextBid(95) >= 100 ? 0 : 95;
}
}
AnalystKiller
import net.ramenchef.dollarauction.DollarBidder;
public class AnalystKiller extends DollarBidder {
private static int instances = 0;
private final boolean tainted;
public AnalystKiller() {
this.tainted = instances++ != 0;
}
@Override
public int nextBid(int opponentsBid) {
if (tainted)
throw new RuntimeException("A mysterious error occurred! >:)");
return 0;
}
}
추가 규칙
- 표준 허점 은 금지되어 있습니다.
- 다른 봇을 방해하는 것은 허용되지만 필드 / 방법 가시성을 변경하려고 시도하면 신비로운 결과를 초래할 수 있습니다
SecurityException
. 예외로 인해 다른 봇이 500ms 제한을 위반합니다. - 봇은
DollarBidder
클래스 를 확장하지 않으면 러너 패키지에 액세스 할 수 없습니다 . - 모든 방법은 500ms 이하로 반환해야합니다.
- 봇은 결정론적일 필요는 없습니다.
- 입찰가는 5 ¢의 배수 일 필요 는 없습니다 .
- $ 1 = 100 ¢
- 결과는 2018 년 4 월 24 일에 게시됩니다.
결과
MTargetedBot: $14.30
BuzzardBot: $9.83
BluffBot: $9.40
RiskRewardBot: $9.35
SecretBot: $8.50
LuckyDiceBot: $7.28
CounterBot: $6.05
MBot: $5.40
StackTraceObfuscaterBot: $5.20
EvilBot: $4.80
MarginalBot: $4.60
TargetValueBot: $4.59
InflationBot: $4.27
UpTo200: $4.20
InsiderTradingBot: $1.90
MimicBot: $1.50
BorkBorkBot: $1.22
DeterrentBot: $0.95
MarginalerBot: $0.00
RandBot: $-4.45
BreakEvenAsap: $-7.00
AnalystOptimizer: $-13.95
DeterredBot: $-1997.06
ScoreOverflowBot: $-21474844.15
MirrorBot: $-21475836.25
MTargetedBot
$ 14.30의 이익을 축하합니다 !
LuckyDiceBot
예를 들어 2-12
무작위로 증분하여 입찰하는 등 코드를 검증 할 수있는 코드가 없습니다 .