- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你能解释一下为什么我的 AI 可以正常播放,直到玩家在第六或第七列连续 3 个,然后我的 AI 拒绝阻止他。另一个问题是当我的 AI 可以在 1 步中获胜,但他宁愿选择更长的游戏。谁能帮帮我。
返回获胜着法的值
def utility(board):
if terminal(board):
if winning_move(board, X):
return 1000000
elif winning_move(board, O):
return -10000
else:
return 0
计算depth=0时position的得分
def compute_score(block, board, col, row):
score = 0
if block.count(X) == 4 and block.count("-") == 0:
score += 100000
elif block.count(X) == 3 and block.count("-") == 1:
score += 10
elif block.count(X) == 2 and block.count("-") == 2:
score += 3
if block.count(O) == 4 and block.count("-") == 0:
score -= 1000000
elif block.count(O) == 3 and block.count("-") == 1:
score -= 6
elif block.count(O) == 2 and block.count("-") == 2:
score -= 2
return score
赋予每一个可能的“四 block ”值(value)
def score_position(board):
score = 0
mid_section = []
#increases score because playing in middle is usually good move
for col in range(5):
mid_section.append(board[col][x // 2])
score += mid_section.count(X) * 3
#claculates score of all horizontal 4 in a rows
for row in range(y):
for col in range(x - 3):
block = board[col: col + 4]
score += compute_score(block, board, col, row)
#claculates score of all vertical 4 in a rows
for col in range(x):
for row in range(y - 3):
block = [board[row][col], board[row + 1][col], board[row + 2][col], board[row + 3][col]]
score += compute_score(block, board, col, row)
#claculates score of all diagonals from left bottom to right top 4 in a rows
for row in range(y - 3):
for col in range(x - 3):
block = [board[row][col], board[row + 1][col + 1], board[row + 2][col + 2], board[row + 3][col + 3]]
score += compute_score(block, board, col, row)
#claculates score of all diagonals from right bottom to left top 4 in a rows
for row in range(y - 3):
for col in range(x - 1, 2, -1):
block = [board[row][col], board[row + 1][col - 1], board[row + 2][col - 2], board[row + 3][col - 3]]
score += compute_score(block, board, col, row)
return score
minimax 算法(如果您想了解更多关于此算法的信息,请观看此视频 - https://www.youtube.com/watch?v=l-hh51ncgDI)
def minimax(board, depth):
#if terminal(board):
# return None
best_move = None
alpha = -math.inf
beta = math.inf
if player(board) == X:
if board == initial_state():
best_move = x//2
return best_move
best_score = -math.inf
for action in actions(board):
score = minimaze(result(board, action), alpha, beta, depth)
alpha = max(alpha, score)
if score > best_score:
best_score = score
best_move = action
return best_move
else:
best_score = math.inf
for action in actions(board):
score = maximaze(result(board, action), alpha, beta, depth)
beta = min(beta, score)
if score < best_score:
best_score = score
best_move = action
print(best_move)
return best_move
The minimizing player(返回最好的玩家移动四的特定位置)
def minimaze(board, alpha, beta, depth):
if terminal(board):
return utility(board)
elif depth <= 0:
return score_position(board)
v = math.inf
for action in actions(board):
v = min(v, maximaze(result(board, action), alpha, beta, depth - 1))
beta = min(beta, v)
return v
最大化 AI(返回最佳 AI 在特定位置移动四次)
def maximaze(board, alpha, beta, depth):
if terminal(board):
return utility(board)
elif depth <= 0:
return score_position(board)
v = -math.inf
for action in actions(board):
v = max(v, minimaze(result(board, action), alpha, beta, depth - 1))
alpha = max(alpha, v)
return v
最佳答案
我最近一直在做完全相同的项目:)
对于你的第二个问题,为了让 AI 尽可能快地获胜,你应该改变你的分数系统。
score_position
函数。if block.count(X) == 4 and block.count("-") == 0:
score += 100000 * (places_in_board - turns_played + 1)
if block.count(O) == 4 and block.count("-") == 0:
score -= 1000000 * (places_in_board - turns_played + 1)
其中 places_in_board
是您棋盘的位置数,turns_played
是游戏中经过的回合数。
请注意,当您在更少的回合中赢得比赛时,您获得的分数会更高。
这样,AI 会“更喜欢”走捷径来获胜——它获得的分数只会更高。
而且,作为副作用,您的 AI 又得到了改进!!
如果 AI 不知何故陷入了它总是失败的境地(如果对手打得完美),它宁愿选择最长的方式来失败。为什么?因为在'longest lose'中turns_played
会更大,所以
score -= 1000000 * (places_in_board - turns_left + 1)
会降低分数。分数会更高,所以 AI 更愿意接受那个“长期失败”。
如果您需要一些引用,这里是我的 connect4 AI 的链接:https://github.com/YotamZaiger1/connect_4_AI
我的评分函数在 Board
文件中,名为“state_value”。
希望我有所帮助,祝你好运!
关于python - 为什么我的 connect4 minimax 不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71187789/
我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。 我有这个: $ix = [System.Net.Dn
var urlsearch = "http://192.168.10.113:8080/collective-intellegence/StoreClicks?userid=" + userId +
我有一个非常奇怪的问题,过去两天一直让我抓狂。 我有一个我试图控制的串行设备(LS 100 光度计)。使用设置了正确参数的终端(白蚁),我可以发送命令(“MES”),然后是定界符(CR LF),然后我
我目前正试图让无需注册的 COM 使用 Excel 作为客户端,使用 .NET dll 作为服务器。目前,我只是试图让概念验证工作,但遇到了麻烦。 显然,当我使用 Excel 时,我不能简单地使用与可
我开发了简单的 REST API - https://github.com/pavelpetrcz/MandaysFigu - 我的问题是在本地主机上,WildFly 16 服务器的应用程序运行正常。
我遇到了奇怪的情况 - 从 Django shell 创建一些 Mongoengine 对象是成功的,但是从 Django View 创建相同的对象看起来成功,但 MongoDB 中没有出现任何数据。
我是 flask 的新手,只编写了一个相当简单的网络应用程序——没有数据库,只是一个航类搜索 API 的前端。一切正常,但为了提高我的技能,我正在尝试使用应用程序工厂和蓝图重构我的代码。让它与 pus
我的谷歌分析 JavaScript 事件在开发者控制台中运行得很好。 但是当从外部 js 文件包含在页面上时,它们根本不起作用。由于某种原因。 例如; 下面的内容将在包含在控制台中时运行。但当包含在单
这是一本名为“Node.js 8 the Right Way”的书中的任务。你可以在下面看到它: 这是我的解决方案: 'use strict'; const zmq = require('zeromq
我正在阅读文本行,并创建其独特单词的列表(在将它们小写之后)。我可以使它与 flatMap 一起工作,但不能使它与 map 的“子”流一起工作。 flatMap 看起来更简洁和“更好”,但为什么 di
我正在编写一些 PowerShell 脚本来进行一些构建自动化。我发现 here echo $? 根据前面的语句返回真或假。我刚刚发现 echo 是 Write-Output 的别名。 写主机 $?
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我将一个工作 View Controller 类从另一个项目复制到一个新项目中。我无法在新项目中加载 View 。在旧项目中我使用了presentModalViewController。在新版本中,我
我对 javascript 很陌生,所以很难看出我哪里出错了。由于某种原因,我的功能无法正常工作。任何帮助,将不胜感激。我尝试在外部 js 文件、头部/主体中使用它们,但似乎没有任何效果。错误要么出在
我正在尝试学习Flutter中的复选框。 问题是,当我想在Scaffold(body :)中使用复选框时,它正在工作。但我想在不同的地方使用它,例如ListView中的项目。 return Cente
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我有一个组合框,其中包含一个项目,比如“a”。我想调用该组合框的 Action 监听器,仅在手动选择项目“a”完成时才调用。我也尝试过 ItemStateChanged,但它的工作原理与 Action
你能看一下照片吗?现在,一步前我执行了 this.interrupt()。您可以看到 this.isInterrupted() 为 false。我仔细观察——“这个”没有改变。它具有相同的 ID (1
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我正在尝试在我的网站上设置一个联系表单,当有人点击发送时,就会运行一个作业,并在该作业中向所有管理员用户发送通知。不过,我在失败的工作表中不断收到此错误: Illuminate\Database\El
我是一名优秀的程序员,十分优秀!