这是美元博弈游戏理论上的KOTH挑战。其中,一美元被卖给出价最高的人。出价以5美分递增,失败者也支付出价。他们的想法是,为了减少损失,两家公司都将竞标战争升级到远远超过一美元的价值。
希望您的机器人比这更聪明。
您将通过扩展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
引发异常。如果发生这种情况,抛出异常的漫游器将支付其先前的出价,而其他漫游器则免费获取美元。- 两种漫游器都无法支付最高的出价。如果发生这种情况,则两个漫游器都将支付其出价(失败者将支付其先前的出价),而获胜者将获得一美元。
- 两个机器人的出价都超过了$ 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
s 神秘。异常导致另一个漫游器突破了500ms的限制。 - 机器人无法访问运行程序包,除非要扩展
DollarBidder
类。 - 所有方法都应在500毫秒或更短的时间内返回。
- 机器人不需要是确定性的。
- 您的出价并没有必须是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
随机增量出价