私が作成したゲームについて非常に簡単な質問があります (これは宿題ではありません): ペイオフを最大化するには、次のメソッドに何を含める必要がありますか:
private static boolean goForBiggerResource() {
return ... // I must fill this
};
繰り返しますが、これは宿題ではないことを強調します。ここで何が行われているのかを理解しようとしています。
「戦略」は些細なことです: true または false の 2 つの選択肢しかありません。
「ゲーム」自体は非常にシンプルです。
P1 R1 R2 P2
R5
P3 R3 R4 P4
4 人のプレーヤー (P1、P2、P3、および P4) と 5 つのリソース (R1、R2、R3、R4 はすべて 1 の価値があり、R5 は 2 の価値がある) があります。
各プレイヤーには、正確に 2 つのオプションがあります: 1 を与える開始位置に近く、プレイヤーが確実に取得できるリソースを探す (他のプレイヤーが最初にそのリソースに到達することはできません)または、プレイヤーは次のリソースを取得しようとすることができます:は 2 の価値があります... しかし、他のプレイヤーもそれを選ぶかもしれません。
2 人以上のプレイヤーがより大きなリソース (2 分の 1) を求めた場合、それらは同時により大きなリソースに到達し、ランダムに 1 人のプレイヤーだけがそれを手に入れ、他のプレイヤーはそれを手に入れます。そのリソースは 0 になります (1 のリソースに戻ることはできません)。
各プレイヤーは同じ戦略をプレイします (メソッドgoForBiggerResource () で定義されたもの)
プレイヤーは戦略に同意するために互いに「話す」ことはできません
ゲームは100万回実行されます
したがって、基本的には、利益を最大化する方法で、true または false を返すメソッドgoForBiggerResource()を埋めたいと考えています。
ソリューションをテストできるコードは次のとおりです。
private static final int NB_PLAYERS = 4;
private static final int NB_ITERATIONS = 1000000;
public static void main(String[] args) {
double totalProfit = 0.0d;
for (int i = 0; i < NB_ITERATIONS; i++) {
int nbGoingForExpensive = 0;
for (int j = 0; j < NB_PLAYERS; j++) {
if ( goForBiggerResource() ) {
nbGoingForExpensive++;
} else {
totalProfit++;
}
}
totalProfit += nbGoingForExpensive > 0 ? 2 : 0;
}
double payoff = totalProfit / (NB_ITERATIONS * NB_PLAYERS);
System.out.println( "Payoff per player: " + payoff );
}
たとえば、次の解決策を提案するとします。
private static boolean goForBiggerResource() {
return true;
};
その後、4 人のプレイヤー全員がより大きなリソースを求めます。そのうちの1つだけがランダムに取得されます。100 万回以上の反復では、プレーヤーごとの平均ペイオフは 2/4 になり、0.5 となり、プログラムは次のように出力します。
プレイヤーあたりのペイオフ: 0.5
私の質問は非常に単純です。平均利益を最大化するには、メソッドgoForBiggerResource() (true または false を返す) に何を入れるべきですか? またその理由は何ですか?