扫雷AI – 关于推断安全单元格知识的某种边缘情况问题

我正在参加CS50的Python人工智能入门课程,我非常喜欢它。当我运行我的脚本时,似乎一切都运行良好,但CS50的检查器发现了一种边缘情况,我的软件在推断知识时显然无法找到安全单元格。以下是CS50规范,着重于未通过测试的部分:

规范

完成Sentence类和MinesweeperAI类在minesweeper.py中的实现。

  • Sentence类中,完成known_minesknown_safesmark_minemark_safe的实现。

  • known_mines函数应返回self.cells中所有已知为地雷的单元格的集合。

  • known_safes函数应返回self.cells中所有已知为安全的单元格的集合。

  • mark_mine函数应首先检查cell是否包含在句子中。

    • 如果cell在句子中,函数应更新句子,使cell不再在句子中,但仍表示一个逻辑上正确的句子,因为cell已知为地雷。

    • 如果cell不在句子中,则无需采取任何行动。

  • mark_safe函数应首先检查cell是否包含在句子中。

    • 如果cell在句子中,函数应更新句子,使cell不再在句子中,但仍表示一个逻辑上正确的句子,因为cell已知为安全。

    • 如果cell不在句子中,则无需采取任何行动。

MinesweeperAI类中,完成add_knowledgemake_safe_movemake_random_move的实现。

  • add_knowledge应接受一个cell(表示为元组(i, j))及其对应的count,并更新self.minesself.safesself.moves_madeself.knowledge,以包含AI可以推断的任何新信息,因为cell已知为安全单元格,周围有count个地雷。

    • 函数应将cell标记为游戏中已进行的移动之一。

    • 函数应将cell标记为安全单元格,同时更新包含cell的任何句子。

    • 函数应根据cellcount的值向AI的知识库添加一个新句子,以指示cellcount个邻居是地雷。请确保句子中只包含状态仍未确定的单元格。

    • 如果基于self.knowledge中的任何句子,可以将新的单元格标记为安全或地雷,则函数应执行此操作。

    • 如果基于self.knowledge中的任何句子,可以推断出新的句子(使用背景中描述的子集方法),则这些句子也应添加到知识库中。

    • 请注意,每次对AI的知识进行任何更改时,都可能产生之前不可能的新推断。请确保将这些新推断添加到知识库中,如果可能的话。

这是我的代码(大部分任务已经完成,所以如果你不想剧透,请不要继续阅读):

...

当我通过CS50检查函数运行我的脚本时,输出如下:

...

求助!

我已经尝试了一切,Chat GPT一点帮助都没有,我尝试使用pytest和test_minesweeper.py来单元测试我的代码,一切似乎都很好!在所有情况下,我添加到知识中的代码似乎都运行良好。


回答:

你有多个问题需要解决。我将从最基本的问题开始。查看add_sentence()方法中的代码,其中你删除空句子并查找已知地雷和安全单元格的句子。你可以使用这个代码片段进行测试。运行它并在每个for循环后检查knowledge以发现问题:

...

关于地雷/安全单元格循环的提示:如果你使用if/elif,你不需要continue语句。

在你修复了那段代码后,你还有更多需要修复的地方。假设knowledge中有这两个sentences(按此顺序):

...

在你发现(0,0),(0,1),(0,2)中的地雷后,你应该发现(1,0),(2,0)中的地雷。然而,你不会通过一次调用add_sentence()捕获到它。

最后,你的最后一步(推断知识)需要改进。我在CS50AI ED论坛上有一篇帖子展示了这一点。使用此链接:如何调试扫雷

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注