背景
MENACE(中号 achine Ë ducable Ñ oughts 甲 ND Ç rosses ë ngine)是用于游戏圈与叉,由英国计算机科学家唐纳德米基在1960创建一个基本的浅的机器学习算法。它最初由304个火柴盒实现,每个火柴盒都标有板子位置并包含彩色珠子(九种颜色之一,代表可能的移动)。Michie计算得出,这304个火柴盒足以满足棋盘上每个动作的组合。
您可能会更数学化,您会发现N&C板上实际上有19,683种Nought,Cross和Blanks的可能组合;但是,他计算了减少此数字的方法(以加快算法的速度,并有可能减少火柴盒!)。首先,他删除了所有不可能的举动,例如:
-------
|X|0|X|
| |0| |
|X|X| |
-------
(两个零和四个十字架)
接下来,他补偿了旋转。例如,如果在火柴盒上,我们看到:
-------
| |0|0|
|X| |X|
| |0| |
-------
我们可以使用同一框
-------
| |X| |
|0| |0|
| |X|0|
-------
因此,上述有色珠代表相对位置,而不是绝对位置。例如,如果我们说红色的珠子表示左上角,那么我们将看一下盒子顶部的图像,然后看看:
-------
| |0|0|
|X| |X|
| |0| |
-------
因此,我们知道在这是木板的情况下,红色的珠子表示:
-------
|R|0|0|
|X| |X|
| |0| |
-------
但是如果这是董事会:
-------
| |X| |
|0| |0|
| |X|0|
-------
红色的珠子意味着
-------
| |X|R|
|0| |0|
| |X|0|
-------
这些变换适用于旋转和反转(在所有方向,包括对角线)。再一次,您只需要按以下方式保存每个火柴盒:不要为每个转换单独创建虚拟盒!
Michie进行的另一个简化是确保计算机先运行。这样,他可以删除所有第一级的动作,从而删除剩余的大约五分之一的盒子。最后,他删除了所有游戏结束框(因为这些步骤不需要进一步的“内容”或移动)。
正确,现在介绍算法本身(非常简单):
- 首先,确定珠子代表什么颜色。您需要9种颜色来表示板上的每个空间。
- 在游戏开始时,每个304个火柴盒都包含珠子。虽然这些珠子是随机的颜色(因此可以很好地重复),但它们应该可以移动(因此,如果板状态图像在右中角显示一个“ O”,那么您就不能使用代表中间的珠子了,对)。
- 每次轮到MENACE(X)时,都要找到刻有当前木板位置(或其某些变形)的火柴盒。
- 打开火柴盒,然后在其中随机选择任何珠子。
- 查找棋盘的状态如何改变以获取火柴盒上的图像(例如,逆时针旋转90度)。然后,将该变换应用于磁珠(例如,左上角变为左上角)。
- 在该正方形中放置一个X。从火柴盒中删除所选的珠子。如果结果是将盒子留空,则将三个随机的(可能的)珠子放入盒子,并选择其中一个进行移动。
- 重复3-6,直到游戏结束。
- 如果MENACE赢得了比赛,请回顾MENACE拍摄的每个火柴盒。然后,追溯该移动中使用了什么颜色的珠子。将两种颜色的珠子放入盒子中(这样就可以得到原始的珠子,再加上一个),从而增加MENACE的可能性,使它在下次到达该位置时移动。
- 如果MENACE输掉了比赛,则什么也不做(不要更换取出的珠子)。
- 如果MENACE绘制了游戏,则替换它在每个移动中使用的珠子,但不要添加多余的珠子,这样您就可以开始游戏了。
这给我们留下了非常简单但难以实现的算法。这构成了您挑战的基础。
如果您仍然感到困惑,请访问http://chalkdustmagazine.com/features/menace-machine-educable-noughts-crosses-engine/-这是我第一次学习该算法时所读的内容
挑战
用电脑玩井字游戏。在每一步,输出所有火柴盒的内容。
输入项
- 在程序开始时有一个数字,表示您想与MENACE进行多少场比赛
- 然后,在MENACE的第一个回合之后,您将输入的动作作为两个字符串输入,第一个字母是相对于Y轴的“ L”,“ R”或“ M”(左,右或中间)。然后输入另一个字母(再次是“ L”,“ R”或“ M”),这次是指X轴。对所有动作和游戏重复上述步骤。
产出
- 在每个新游戏开始时,输出“新游戏”。
- 玩家每次移动后,以任何合理的格式输出棋盘。它不需要看起来很漂亮(例如,代表电路板位置的数组阵列就可以了)。
- 玩家每次移动后,MENACE应该移动。MENACE移动后输出板
- 每个游戏结束后,输出所有304个火柴盒的内容。珠子可以由字母,颜色名称,字符或您喜欢的任何字符串或整数(没有指针,匿名函数等)表示。
规则
- 这是代码高尔夫球,因此最短答案以字节为单位。
- 看到MENACE的回应后,我必须能够输入动作。没有“将所有动作都传递给该功能,并观察游戏如何进行”。
- 游戏之间必须清除董事会。
- 比赛之间不得清除火柴盒(这将重置机器学习)
- 您必须具有304个火柴盒。任何人都可以在所有19,683个火柴盒中实现此算法,但学习速度很慢(因为要获得具有有用内容的所有游戏,都需要很多游戏)。
- 输出可以是任何合理的格式,并且输入可以按照PPCG标准进行(只要符合规则2)。如果您需要调整输入格式(如“ 输入 ”部分中所述),则可以,只要有意义即可。
- 当玩家获胜(通过对角线,水平或垂直获得三连胜)或出现平局(棋盘已满且没有获胜者)时,游戏结束
- 尽管MENACE需要做出可能的移动(并且每个火柴盒中只能有可能的珠子),但是为了挑战,您不需要验证用户的输入。如果他们输入了错误的内容,则您的程序可以执行任何操作(完全疯狂,抛出错误等)-您可以假定输入正确。
[[0, 2, 6], [4, 8, 4, 3, 3], [7, 7, 7, 7, 7, 7, 7, 8], [1], ... [3, 3, 5, 4]]
。