次のゲームをシミュレートしようとしています: ゲームは 2 人のプレーヤーでプレイされます。頂点と辺を持つグラフがあるとします。ターンごとに 1 つのエッジを削除できます。頂点を分離するとポイントが得られ、別のエッジを削除できます。エッジがなくなるまでプレイし、その時点で最も多くのポイントを持つプレイヤーがゲームに勝ちます。
グラフを配列で表します。これは、別のプログラムによって生成された別のファイルから読み取ったものです。たとえば、次のようなものです。
0 1 1 0
1 0 1 1
1 1 0 0
0 1 0 0
プレイヤー 1 は 4/0 で勝つことができますが、プレイヤー 2 も勝つことができます。最良の結果はプレイヤー 1 の 1/3 です。
編集: 「プレイヤーは 4/0 でどのように勝つことができますか?」:
A--B--D
| /
c
A--B--D
|
C
A B--D
|
C
ご覧のように、真ん中の端が取り除かれると、最初のプレーヤーは 4 ポイントを獲得します。それ以外の場合、他のプレーヤーは 4 ポイントを獲得します。
私は各プレイヤーにとって最良の結果を得ることができますが、他のプレイヤーは毎ターン自分の最良のターンを選択しません。私はそれを試すのに多くの時間を費やしましたが、いつも同じ問題が発生します。
編集: 私は今、これを解決するのにかなり近づいていると思います (また、私は常に考えてきました)、ターンごとに 2 つのスコアを保存する必要があるだけです。現在のプレーヤーのスコアが受け入れられます。そうすれば、プレイヤーが 4/0 の動きを無視できるようになるはずです..
編集:私は提案を実装しようとしましたが、残念ながら私は再び立ち往生しています. 高すぎる奇妙な出力が得られるか、関数は単に答えとして -2 を返しますが、他の大きなグラフでは機能しません。私はそれを修正するために多くのことを試みましたが、うまくいきません。以下のコードは私が今試しているものですが、残念ながらどちらも機能しません:
int Matrix::getTurn (bool** array) {
if (edges == 0)
return 0;
for (int i=0; i<edges; i++) {
for (int j=0; j<edges; j++) {
if (array[i][j] == true) {
array[i][j] = false;
array[j][i] = false;
score = getScore (array, i, j);
if (score > 0)
score += getTurn (array);
else score -= getTurn (array);
if (score > maxScore)
maxScore = score;
array[i][j] = true;
array[j][i] = true;
}
}
}
return maxScore;
}
maxScore と score はクラスのメンバー変数です。誰か修正が必要な部分を指摘してもらえませんか?
別の編集、まだ機能していませんが、エラーがまったく表示されません。それは1を出力し続けます、それはmaxScoreを変更しなかったようです... Takkenは残っているエッジの数です。配列の境界を使用してみましたが、違いはありません..
int Matrix::berekenZet (bool** array) {
if (takken == 0)
return 0;
int maxScore = 0, score = 0;
for (int i=0; i<takken; i++) {
for (int j=0; j<takken; j++) {
if (array[i][j] == true) {
array[i][j] = false;
array[j][i] = false;
takken -= 1;
score = berekenScore (array, i, j);
if (score > 0)
score += berekenZet (array);
else score -= berekenZet (array);
if (score > maxScore)
maxScore = score;
array[i][j] = true;
array[j][i] = true;
takken += 1;
score = 0;
}
}
}
return maxScore;
}
前もって感謝します。