【发布时间】:2014-07-21 03:00:37
【问题描述】:
我正在尝试为“连续蛇”游戏实现 AI。它与普通的蛇游戏非常不同,至少就人工智能而言。基本上,蛇的驾驶有点像汽车,2 名玩家中的第一个撞到他的踪迹或其他人的踪迹将输掉比赛。屏幕也会环绕其边框。
如果您看一下我当前进度的视频,您会更好地理解它: https://www.youtube.com/watch?v=i9qU-r4COQ8
还不错,但还是打不过我(我是黄色的)。 理想情况下,获胜的 AI 需要表现出以下行为:
- 避开墙壁
- 注意它可能会“缩短我的时间”(在我旁边稍微靠前的时候)。
- 避免被“剪短”。
- 了解当前二维空间的拓扑结构,尝试将我封闭在更小的空间中/为自己保护更大的空间。
我目前的方法使用 NEAT 算法 (http://www.cs.ucf.edu/~kstanley/neat.html)。 这是一种遗传算法,可以在几代人中进化神经网络。它在一定程度上学会了如何做 1,2 和 3(但不是很好),但不知道 4。
对于输入,我使用的是:
- 相对于我们的对手角度
- 对手与我们的距离
- 相对于我们的对手航向
- 通过一定数量的树搜索在某些方向上探测的智能光线(参见视频)
我现在有点卡住了,想知道:
- 我应该研究哪类算法?循环/实时/连续/无监督神经网络,......关于这些以及它们如何应用于我的问题的解释会很棒。
- 我应该研究任何特定的算法吗?
- 我还可以使用哪些其他输入集?人类玩家可以看到游戏中的所有像素,这比我简单的一组输入信息要多得多。但我认为将示例中的 200x200 像素输入到我的 NN 根本行不通。也许如果我将它们离散化并使其相对于 AI 位置/航向...听起来很棘手。
如果有人想查看我的代码,我很高兴提供 (C#)。
谢谢!
【问题讨论】:
-
如果这能给您带来不错的结果,我会尝试添加更多功能作为神经网络的输入。你可以给它自己和对手的 X、Y 坐标。您还可以计算对手行进的距离并将其作为特征。我对您如何定义适应度函数以及如何确定它来进化代理很感兴趣。
-
我已经给出了对手的相对位置/航向,这就是我认为屏幕环绕自身所需要的一切。是的,我需要在输入方面更有创意......适应度函数非常简单 - 我对自己玩不同版本的人工智能,获胜者获得 10 适应度,失败者获得 1。我在那里做了一些调整以平衡如果获胜者“快速”获胜,则获得更多积分。 5% 最好的 AI 可以“复制”自己并混合他们的基因以创建更智能的神经网络。
-
您是否尝试过尝试不同数量的隐藏层,甚至允许神经网络的结构进化(假设您只进化权重)。您还必须考虑优化的约束。例如,我正在用进化神经网络进化赛车 AI,而最好的智能体在某些地方使用赛道的墙壁来帮助他更好地转弯,因为我不会因此而受到惩罚。因此,如果您希望 AI 学习特定行为,您需要确保适应度函数奖励这种行为。
-
我想知道 vlad,在视频中我看到了一个没有隐藏层的神经网络。我也看到你在奖励“获胜”,但是奖励“活着的时间”呢?你应该尝试一下。
标签: artificial-intelligence neural-network genetic-algorithm