草庐IT

python - 需要帮助设计基于 NEAT 算法的神经网络的适应度评估

coder 2023-08-14 原文

我正在研究基于 NEAT algorithm 的神经网络学习演奏 Atari Breakout在 Python 2.7 中进行克隆,我的所有部分都可以正常工作,但我认为可以通过更好的算法来计算物种适应度来大大改进进化。

神经网络的输入是:

  • 桨中心的X坐标
  • 球心的X坐标
  • 球心Y坐标
  • 球的 dx(X 方向的速度)
  • 球的 dy(Y 方向的速度)

输出是:

  • 向左移动桨
  • 向右移动桨
  • 不要移动桨

我可用于物种适应度计算的参数是:

  • breakout_model.score - int:物种所玩游戏的最终得分
  • breakout_model.num_times_hit_paddle - int: Racket 击中球的次数
  • breakout_model.hits_per_life - int: Racket 击中球的次数per life,以列表的形式;例如第一个元素是第一个生命的值(value),第二个元素是第二个生命的值(value),依此类推直到4
  • breakout_model.avg_paddle_offset_from_ball - decimal: 球与 Racket 中心在 X 方向上的平均直线距离
  • breakout_model.avg_paddle_offset_from_center - decimal:框架中心到桨中心的X方向平均直线距离
  • breakout_model.time - int:游戏的总持续时间,以帧为单位
  • breakout_model.stale - boolean:游戏是否因过时而被人为终止(例如,球被卡住直接垂直弹跳, Racket 不动)

如果您认为我需要有关游戏最终状态的更多数据,而不仅仅是这些,我可能会实现一种非常容易获得它的方法。

这是我目前的适应度计算,我认为这不是很好:

def calculate_fitness(self):
    self.fitness = self.breakout_model.score
    if self.breakout_model.num_times_hit_paddle != 0:
        self.fitness += self.breakout_model.num_times_hit_paddle / 10
    else:
        self.fitness -= 0.5
    if self.breakout_model.avg_paddle_offset_from_ball != 0:
        self.fitness -= (1 / self.breakout_model.avg_paddle_offset_from_ball) * 100
    for hits in self.breakout_model.hits_per_life:
        if hits == 0:
            self.fitness -= 0.2
    if self.breakout_model.stale:
        self.fitness = 0 - self.fitness
    return self.fitness

这是我认为适合度计算应该在语义上做的事情:

  • 显然,得分应该对整体健康状况产生最显着的影响。也许 0 分会对健身产生轻微的负面影响?
  • Racket 每次击球的次数应该有一些效果,但贡献/重量没有那么显着。例如如果这个数字是 0,那么它在那段时间里甚至根本没有真正尝试过击球,所以它应该有负面影响
  • Racket 击球的次数也应该有一定的影响,它的贡献应该以得分为基础。例如如果没有多次击球,也没有得到多少分,那应该会有很大的负面影响;如果击球次数不多,但得分很高,那应该会有很大的积极作用。总的来说,(我认为)这个值越接近游戏得分,这个值对适应度的贡献/权重就越小
  • 框架中心和桨叶中心之间在 X 方向上的平均距离应该基本上鼓励桨叶处于中央“静止”位置
  • 如果游戏由于过时而人为结束,这应该会产生显着的负面影响,或者它应该自动强制适应度为 0.0;我不确定哪种情况会更好

我不确定如何对所有这些值进行操作以使它们适本地影响整体适应性。

在此先感谢您提供的任何帮助。

最佳答案

我会尽量减少适应度函数中的条件逻辑,仅在您希望将适应度得分强制为 0 或受到重大惩罚的情况下使用它。我只会决定分数的每个组成部分应该有多少权重并相乘。负成分只会增加理解适应度函数的复杂性,并没有真正的好处;该模型从分数的相对差异中学习。所以我的函数版本看起来像这样:

def fitness(...):
    if total_hits == 0:
        return 0
    return (game_score/max_score) * .7 \
           + game_score/total_hits * .2 \
           + game_score_per_life/hits_per_life * .1

(旁白:我没有包括“距画面中心的距离”,因为我认为那是作弊;如果保持在中心附近是最大化游戏效率的好方法,那么智能体应该自己学习。如果您将所有智能都潜入健身功能,那么您的智能体根本就不是智能。)

关于python - 需要帮助设计基于 NEAT 算法的神经网络的适应度评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40875553/

有关python - 需要帮助设计基于 NEAT 算法的神经网络的适应度评估的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  3. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  4. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  5. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  6. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  7. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  8. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  9. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  10. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

随机推荐