【问题标题】:Genetic Algorithms in games游戏中的遗传算法
【发布时间】:2011-04-23 10:01:59
【问题描述】:

我必须做一个关于遗传算法的学期项目,并且我有调整第一人称射击机器人的特征(即要使用的武器等)的想法。例如,我将以字符串的形式表示特征,前 10 位表示选择武器 1 的概率,接下来的 10 位表示选择武器 2 的概率,等等。因此我将获得最佳字符串,从而能够弄清楚我应该使用什么最佳武器。

我面临的明显问题是如何找到适应值。我的想法是,如果我想找到一个字符串的适应度,我会强制机器人使用相应的武器并与它进行一场游戏,并使用机器人的最终得分作为适应度。问题是我需要玩很多游戏。

我可以做某种模拟吗?例如,我能否以某种方式获得一个函数 f,我将在其中输入机器人的特征(例如:武器等)并返回相应的适应度值?开源 FPS 游戏有提供这样的库吗?

另一种选择是进入游戏的源代码,然后继续模拟各种场景并记录每个场景的分数。我不希望进入游戏源代码的额外复杂性,因为这是一个短(1 个月)的项目。

谢谢。

【问题讨论】:

    标签: genetic-algorithm


    【解决方案1】:

    我认为你的项目对于一个月的项目来说非常复杂。

    这不是很令人兴奋,但也许您可以看看棋盘游戏或纸牌游戏的策略。这是一个简单得多的情况,并且可以轻松快速地模拟许多游戏,从而使您可以使用遗传算法来找到一个好的游戏策略。它将教您遗传算法的原理,而无需您了解模拟第一人称射击游戏所需的大量源代码。

    【讨论】:

    • 嗯....点了。但如果我能弄清楚如何模拟 FPS,我想我可能会在一个月内完成。或者其他类型的游戏,比如足球比赛。是否有任何库可以做到这一点,而无需进入他们的游戏代码?
    • 有开源FPS游戏吗?
    • @Dane:是的,你可以在这个页面上找到很多:en.wikipedia.org/wiki/List_of_freeware_first-person_shooters - 所有有 GNU GPL 许可证的都是开源的,还有一些也是开源的。
    • 基本上我应该测试一下我可以轻松编写代码的游戏,或者我可以轻松理解代码的游戏,对吧?因为这样我就可以模拟游戏并获得健身值(分数)。
    • 另一个观察:我认为我应该在一个只有 1 个玩家(cpu)玩的游戏上工作,因为否则当我通过玩机器人来模拟时,它会导致不确定性,因为有时我可能会玩得好,有时我可能不会。
    【解决方案2】:

    我同意 Mark Byers 的观​​点,对于 1 个月的项目来说,这有点过于雄心勃勃了。

    无论如何,您可能想看看NERO(神经进化机器人操作员),这是一款基于肯斯坦利算法NEAT(增强拓扑的神经进化)的游戏。

    您可能还想看看 Stanley 的论文:

    NEAT 的几种实现适用于不同的语言,所以这可能是一个开始。

    【讨论】:

    • 好的。我想到了另一个想法,这个想法并不太雄心勃勃。我设计一个能够自己玩蛇的 GA 怎么样?我担心这个项目可能太容易了。你怎么看?
    • @user280454:那会很有趣,你可以总是实现一个“扩展”版本的蛇,例如,你可以在屏幕周围传送,或者炸弹等等,所以让它成为稍微复杂一点:) 无论如何,如果我没记错的话,你会在 NEAT 网页中找到的一个例子处理类似的事情(一个机器人通过 labirint 或类似的东西找到它的方式)。
    【解决方案3】:

    如果有可用的并且可能的话,您可以使用现有的机器人来生成数据。

    或者,您可以使用 Autohotkey(搜索 google)生成一系列按键和鼠标按下,并以某种方式使机器人以某种愚蠢的方式自动播放。

    【讨论】:

    • 使用已经存在的机器人的问题在于,要让它使用某些武器,我需要进入机器人的代码,不是吗?
    【解决方案4】:

    你的适应度函数可以是一个给定的机器人对一个坐着的鸭子对手造成多少 DPS。例如。让机器人攻击玩家,不要反击。

    您可以记住适应度,因此不必重新测试重复的个体。


    或者,您可以将 2 个人放在对立的团队中,看看谁杀了谁,从而实现适者生存。

    因为从技术上讲,您不需要适应度函数,只需要一种比较个体的方法。

    为了减少比较的次数,可以通过锦标赛来比较每一代的个体,比如

    A 
      }-> A
    B
            }-> C
    C
      }-> C
    D
    

    这表明前两个人是C,然后是A。

    【讨论】:

    • 如果我这样做,我仍然需要模拟 2 个机器人之间的战斗,而且我需要做很多这样的模拟,这会花费很多时间。如果有一个库函数可以为我做到这一点(即,将机器人的武器作为输入并返回赢得战斗的人),那将非常棒,因为我不必总是看到整个该死的战斗,我会立即得到结果。
    • @user280454:你可以通过做出某些假设来加快速度,比如一个拿着枪的机器人总是能用一把刀打败一个机器人。
    • @user280454:我在答案的顶部添加了一个新的替代方案:让健身 = 个人对坐着的鸭子玩家的 DPS。
    猜你喜欢
    • 2011-08-03
    • 2012-06-07
    • 2017-10-16
    • 2018-05-12
    • 1970-01-01
    • 2016-04-05
    • 2016-08-31
    • 2011-01-11
    • 2012-02-02
    相关资源
    最近更新 更多