これは、ゲーム理論におけるドル札オークションゲームの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
例外をスローします。これが発生した場合、例外をスローしたボットは以前の入札を支払い、他のボットは無料でドルを受け取ります。- どちらのボットも、前回の入札単価を上回る金額を支払いません。これが発生した場合、両方のボットが入札を支払い(敗者は以前の入札を支払います)、勝者は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
s が発生します。例外は、別のボットが500ミリ秒の制限を破ることです。 - ボットは、
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
ランダムに...