Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 连接4个极大极小算法:一个用于循环_Python_Algorithm_Artificial Intelligence - Fatal编程技术网

Python 连接4个极大极小算法:一个用于循环

Python 连接4个极大极小算法:一个用于循环,python,algorithm,artificial-intelligence,Python,Algorithm,Artificial Intelligence,我试图用python编写minimax算法,其中有一个for循环是的,我知道维基百科说min和max播放器通常是分开处理的,我使用变量turn来跟踪min或max播放器当前是否在探索选项。然而,我认为,目前当轮到O玩家时,代码错误地计算了X,当轮到X玩家时,代码错误地计算了O 以下是来源p12: 您可能想知道的事情: b是列表的列表;0表示可用空间 evaluate用于检查默认情况下的胜利,以及为特定玩家的棋盘打分。我们查找棋盘上单元格值所在的位置。 makeMove返回放置工件的列的行,用于后

我试图用python编写minimax算法,其中有一个for循环是的,我知道维基百科说min和max播放器通常是分开处理的,我使用变量turn来跟踪min或max播放器当前是否在探索选项。然而,我认为,目前当轮到O玩家时,代码错误地计算了X,当轮到X玩家时,代码错误地计算了O

以下是来源p12:

您可能想知道的事情:

b是列表的列表;0表示可用空间 evaluate用于检查默认情况下的胜利,以及为特定玩家的棋盘打分。我们查找棋盘上单元格值所在的位置。 makeMove返回放置工件的列的行,用于后续移除 任何帮助都将不胜感激。如果有什么不清楚的地方,请告诉我

def minMax(b, turn, depth=0):

    player, piece  = None, None
    best,   move   = None, -1

    if turn % 2 == 0 : # even player is max player
        player, piece = 'max', 'X'
        best, move    = -1000, -1
    else :             
        player, piece = 'min', 'O'
        best, move    = 1000, -1

    if boardFull(b) or depth == MAX_DEPTH:
        return evaluate(b, False, piece)

    for col in range(N_COLS):
        if possibleMove(b, col) :

            row   = makeMove(b, col, piece)
            turn += 1  # now the other player's turn
            score = minMax(b, turn, depth+1)

            if player == 'max':
                if score > best:
                    best, move = score, col
            else:
                if score < best:
                    best, move = score, col

            reset(b, row, col)

    return move
每次你发现一个可能的移动而不是撤销它时,你都在增加回合数。因此,当控件返回到给定的minMax调用时,turn比以前大1。然后,下一次当你的程序发现一个可能的移动时,它会再次增加圈数。这将导致下一次调用minMax时选择错误的玩家作为当前玩家。总的来说,我相信这将导致董事会在大约一半的时间里被评估为错误的球员。您可以通过添加1来打开对minMax的递归调用,而不是通过更改存储在变量中的值来解决此问题:

        row   = makeMove(b, col, piece)
        score = minMax(b, turn+1, depth+1) 
编辑:深入研究您的代码,我发现了一些其他问题:

最大深度设置为1。这将不允许人工智能看到自己的下一步行动,而是迫使其仅根据妨碍其他玩家的方式做出决定。 如果minMax达到最大深度或获胜条件,则返回分数,否则返回移动。这会中断分数向递归树的传播。 这并不重要,但需要记住:你的棋盘评估函数只考虑给定玩家的最长字符串的长度,忽略其他玩家的表现以及可能使一个位置优于另一个位置的任何其他因素。这主要意味着你的AI不会很聪明。 编辑2:问题的很大一部分在于您跟踪最小值和最大值的方式是在您的评估函数中。你检查每件作品是否都赢了。然后根据当前玩家是谁来计算该棋盘的分数,但有一个最小玩家和一个最大玩家的意义在于,你不需要知道当前玩家是谁来评估棋盘。如果max赢了,分数是无穷大的。如果min赢了,分数是-无穷大。 def evaluateb,件号:

if evaluate_aux(b, True, 'X'):
   return 100000

if evaluate_aux(b, True, 'O'):
   return -100000

return evaluate_aux(b, False, piece)
总的来说,我认为您可以做很多事情来使代码更干净、更易于阅读,这将使检测错误变得更容易。例如,若你们说X总是最大的,Y总是最小的,那个么你们就不需要费心去追踪玩家和棋子。此外,让evaluate_aux有时返回布尔值,有时返回int值是令人困惑的。您可以让它计算一行中每个片段的数量,例如,使用连续的X计数正,连续的Os计数负,并将分数相加;评价函数不应该是从一个玩家的角度或另一个玩家的角度。显然,你仍然需要检查那里的胜利条件。这也将涉及第3点。
可能会有更多的问题,但正如我所说的,这段代码不是特别容易通过。如果您修复了我已经找到的东西并将其清理干净,我可以再看一眼。

您能澄清一下这些列是什么吗?另外,这是在更改回合更新后发生的吗?最后,你能发布其余的评估功能吗?例如,“best”来自哪里?@seaotternerd:您可以查看大约200行的完整代码。我想这会回答你所有的问题,但是如果你还有更多的问题,请告诉我。@hovaflow-好的,我编辑了我的答案。我认为这包括很多问题,但可能还有更多的问题被这些问题掩盖了。我不同意这样的说法,即你不必知道谁是目前的球员来评估董事会。如果现在的球员是O,而X刚刚获胜,我们不需要向O报告吗?我现在正在为tic-tac-toe编写代码,希望这将更容易调试/提供建议。我也将试着谈谈你关于冗长的一些观点。评估函数将更加清晰。你完全正确,O需要知道X是否刚刚获胜。但是,经典地说,在这个实现中,向O传达这一点的方式是为董事会分配无穷大或10000分。这也是你和X沟通的方式,X刚刚赢了。相反,如果棋盘得分为-infinity或-10000,则表明两名玩家都认为O刚刚获胜。我们的想法是想出一个棋盘得分
这表明当前棋盘设置支持哪个玩家,以及支持多少。分数越高意味着最大X,在这种情况下表现越好,分数越低意味着最小O表现越好。是的,我同意。我会在今晚东部时间6点前为你链接tic-tac-toe的代码。我遇到了一个新的算法,negamax,我认为它更符合我正在尝试的精神。代码不到100行,如果您有时间,我将非常感谢您的关注。非常感谢。你已经澄清了很多困惑。如果逻辑正确,适应更复杂的Connect 4游戏应该不会太难。需要改变的是评估,检查胜利。。。。同样,我非常感谢您的关注:
if evaluate_aux(b, True, 'X'):
   return 100000

if evaluate_aux(b, True, 'O'):
   return -100000

return evaluate_aux(b, False, piece)