У меня проблема с внедрением простой NegaMax в моей шахматной программе.NegaMax не работает должным образом
Согласно нескольким веб-сайтов negamax должен выглядеть следующим образом в моем коде:
int Position::negaMax(int curr_depth, int depth) {
cd = curr_depth-1;
if (curr_depth==depth) return evaluate();
int max = -500000;
calc_moves(true);
doBackup(cd);
for (int i=0;i<mvSize[cd];i++) {
move_figure(mvD[cd][i][0],mvD[cd][i][1],mvD[cd][i][2],mvI[cd][i][0],mvI[cd][i][1]);
int score = -negaMax(curr_depth+1,depth);
cd--; undoMove(cd);
if (curr_depth==1)
cout << "Move: " << getMoveString(i) << ", Score: " << score << endl;
if (score>max)
max=score;
}
return max;
}
Но с этим кодом, я получаю этот выход:
Move: a2a3, Score: 0
Move: a2a4, Score: 0
Move: b2b3, Score: 0
Move: b2b4, Score: 0
Move: c2c3, Score: 0
Move: c2c4, Score: 0
Move: d2d3, Score: 0
Move: d2d4, Score: 0
Move: e2e3, Score: 0
Move: e2e4, Score: 0
Move: f2f3, Score: 0
Move: f2f4, Score: 0
Move: g2g3, Score: 0
Move: g2g4, Score: 0
Move: h2h3, Score: 0
Move: h2h4, Score: 0
Move: b1a3, Score: 0
Move: b1c3, Score: 0
Move: g1h3, Score: 0
Move: g1f3, Score: 0
score: 0
Это не может быть правильным, если я negaMax для ply3 из исходного положения.
Если я удаляю знак минуса перед вызовом рекурсивной функции, я получаю более лучший результат. Но, на мой взгляд, это не может быть правильно, потому что без знака минус в приведенном выше коде я только максимизирую счет для одного игрока, но не для обоих.
Move: a2a3, Score: 0
Move: a2a4, Score: 30
Move: b2b3, Score: 0
Move: b2b4, Score: 30
Move: c2c3, Score: 0
Move: c2c4, Score: 30
Move: d2d3, Score: 295
Move: d2d4, Score: 295
Move: e2e3, Score: 295
Move: e2e4, Score: 295
Move: f2f3, Score: 0
Move: f2f4, Score: 30
Move: g2g3, Score: 0
Move: g2g4, Score: 30
Move: h2h3, Score: 0
Move: h2h4, Score: 30
Move: b1a3, Score: 30
Move: b1c3, Score: 30
Move: g1h3, Score: 30
Move: g1f3, Score: 30
score: 295
Я пытался реализовать различные версии MinMax, NegaMax и AlphaBeta. Но я всегда получаю оценку 0. Я был бы очень благодарен за любые намеки.
Большое спасибо за ваш совет. Я использовал этот метод, чтобы отобразить текущие ситуации в кармане самого глубокого слоя с некоторыми оценками моей функции оценки и признал, что была небольшая ошибка. Не могу понять, почему он работал на одного игрока без знака минус, но теперь максимизация, похоже, работает для обоих игроков. – Peter
Не беспокойтесь, рад, что это помогло. Иногда самые тонкие ошибки могут вызвать, казалось бы, несвязанные проблемы, особенно в чем-то вроде шахматного движка! –