我一直在用一种极小极大算法制作一个曼卡拉机器人.它对第一个比特有效,但它通常只给出一个空格上的输出.有谁知道如何解决这个问题,让它发挥得很好?
以下是我的代码:
let final;
function increment(board, ltif, player, re) {
let a = 0;
for(let i = 0; i < board[ltif]; i++) {
if((player && (ltif+i+a+1)%14 == 13) || (!player && (ltif+i+a+1)%14 == 6)) {
a += 1;
}
board[(ltif + i + a + 1)%14] += 1;
}
const bltif = board[ltif];
board[ltif] = 0;
let ans;
board[(bltif + ltif + a)%14] == 1 || (bltif + ltif + a)%14 == 6 || (bltif + ltif + a)%14 == 13 ? ans = board : ans = increment(board, (bltif + ltif + a)%14, player);
if(((bltif + ltif + a)%14 == 6 || (bltif + ltif + a)%14 == 13) && !re) {
ans = 2;;
}
if(board[(bltif + ltif + a)%14] == 1 && !re) {
ans = 3;
}
return ans;
}
function minimax(board, depth, player) {
if(board[6] > 24) {
return 15;
}else if(board[13] > 24) {
return -15;
}else if(board[6] == 24 && board[13] == 24) {
return 0;
}else if(depth === 0) {
return Math.floor((board[6]-board[13])/2);
}
let avail = board.map((element, index) => (element !== 0 && ((index < 6 && player)|| (index < 13 && index > 6 && !player)) ? index : -1)).filter(element => element !== -1);
if(player) {
let maxEval = [-Infinity];
for(let i = 0; i < avail.length; i++) {
let tboard = increment(board.slice(), avail[i], player, false);
let Eval;
if(tboard == 2) {
Eval = 13;
tboard = increment(board.slice(), avail[i], player, true);
}else if(tboard == 3) {
Eval = -13;
tboard = increment(board.slice(), avail[i], player, true);
}else{
Eval = minimax(tboard, depth - 1, false);
}
maxEval = [Math.max(Eval, maxEval[0]),avail[i],tboard];
}
final = [maxEval[1], maxEval[2]];
return maxEval[0];
}else{
let minEval = +Infinity;
for(let i = 0; i < avail.length; i++) {
let tboard = increment(board.slice(), avail[i], player, false);
let Eval;
if(tboard == 2) {
Eval = 13;
tboard = increment(board.slice(), avail[i], player, true);
}else if(tboard == 3) {
Eval = -13;
tboard = increment(board.slice(), avail[i], player, true);
}else{
Eval = minimax(tboard, depth - 1, false);
}
minEval = Math.min(Eval, minEval);
}
return minEval;
}
}
minimax([
5, 0, 5, 5, 5, 0,
3, 5, 5, 0, 5, 5,
5, 0
], 9, true);
console.log(final);
它用完了一个基于文本的编辑器,所以这就是为什么输出到控制台,它只判断一个电路板,然后你必须输入另一个.另外,我只是想澄清一下,这是雪崩版的曼卡拉.
我没有太多使用极小极大算法的经验,所以如果有人对这个问题有任何见解,那将是非常有帮助的.
其中一个例子是,当给定董事会状态时:
[5, 0, 5, 5, 5, 0, 3, 5, 5, 0, 5, 5, 5, 0]
...它告诉我将数组第四个点上的一个从右边移到第五个点,这给出了以下输出:
[5, 0, 5, 5, 0, 1, 4, 6, 6, 1, 5, 5, 5, 0]
还有更好的可能的移动(比如索引2),我不知道为什么算法 Select 这个.此外,我正在使用的Minimax算法没有使用阿尔法-贝塔修剪,这是有意的,而且不仅仅是代码中的错误.