jjzjj

java - 通过神经网络和/或强化学习提升我的遗传算法

coder 2024-03-13 原文

正如我在前面的问题中提到的那样,我正在编写一个迷宫求解应用程序以帮助我学习更多的理论CS主题,在遇到一些麻烦之后,我得到了一个遗传算法,该算法可以按顺序演化出一组规则(由 boolean 值处理)通过迷宫找到一个好的解决方案。

话虽这么说,仅靠GA就可以了,但是即使我对神经网络没有真正的工作知识(也没有正规的CS理论教育),我还是想通过神经网络来增强它。在对该主题进行了一些阅读之后,我发现可以使用神经网络来训练基因组以改善结果。假设我有一个基因组(一组基因),例如

1 0 0 1 0 1 0 1 0 1 1 1 0 0...

我如何使用神经网络(我假设是MLP?)来训练和改善我的基因组?

除此之外,由于我对神经网络一无所知,因此我一直在尝试使用迷宫矩阵(二维数组)来实现某种形式的强化学习,尽管我对以下算法希望从我身上有所了解:

(来自http://people.revoledu.com/kardi/tutorial/ReinforcementLearning/Q-Learning-Algorithm.htm)
1.  Set parameter , and environment reward matrix R
   2. Initialize matrix Q as zero matrix
   3. For each episode:
          * Select random initial state
          * Do while not reach goal state
                o Select one among all possible actions for the current state
                o Using this possible action, consider to go to the next state
                o Get maximum Q value of this next state based on all possible actions
                o Compute
                o Set the next state as the current state

  End Do

  End For 

对我来说,最大的问题是实现奖励矩阵R和Q矩阵到底是什么,并获得Q值。我为迷宫和枚举状态的每一步都使用了多维数组。 Q-Learning算法中将如何使用它?

如果有人可以通过解释实现以下内容所需的操作来提供帮助,最好是用Java语言编写,尽管C#也会很好,并且可能附带一些源代码示例,也将不胜感激。

最佳答案

如某些评论中所述,您的问题确实涉及大量的背景知识和主题,而这些知识和主题几乎无法 Eloquent 地涵盖在stackoverflow上。但是,我们在这里可以尝试的是建议的方法来解决您的问题。

首先:您的GA会做什么?我看到了一组二进制值。这些是什么?我认为它们是:

  • 错误的:“右转”和“左转”指令的序列。为什么这样不好?因为您基本上是在随机地,蛮力地尝试解决您的问题。您没有在进化基因型:您正在完善随机猜测。
  • 更好:每个基因(基因组中的位置)都代表一个将在表型中表达的特征。基因组和表型之间不应存在一对一的映射!

  • 让我举一个例子:在我们的大脑中有10 ^ 13ish个神经元。但是我们只有大约10 ^ 9个基因(是的,这不是一个确切的值,请耐心等待一秒钟)。这告诉我们什么?我们的基因型不能编码每个神经元。我们的基因组编码蛋白质,这些蛋白质随后将构成我们 body 的组成部分。

    因此,通过选择表型的特征直接对基因型进行进化。如果我每只手有6根手指,并且如果这会使我成为一个更好的程序员,又因为我在生活中更加成功而使我有更多的 child ,那么我的基因型将通过进化来选择,因为它包含功能给我一个更健康的 body (是的,考虑到这里周围大多数人的平均怪异率与可再现性之比,这里有个双关语)。

    现在,考虑一下您的GA:您要实现的目标是什么?您确定不断发展的规则会有所帮助吗?换句话说-您的在迷宫中的表现如何?可以帮助您的最成功的事情是什么:拥有一个不同的 body ,或者对正确的走出道路内存深刻?也许您可能想重新考虑您的基因型,并使其编码内存能力。也许在基因型中编码可以存储多少数据,以及您的代理可以访问数据的速度-然后根据数据从迷宫中走出来的速度来衡量适应性。
    另一种(较弱)的方法可能是对代理用来决定去向的规则进行编码。带回家的消息是对编码功能进行编码,一旦表达,就可以通过适应性进行选择。

    现在,到神经网络问题。要记住的一件事是,NN是过滤器。他们收到输入。在其上执行操作,并返回输出。这是什么输出?也许您只需要区分真假条件即可;例如,将迷宫贴图输入到NN后,它可以告诉您是否可以离开迷宫。你会怎么做这样的事情?您将需要正确编码数据。

    这是有关NN的关键点:您的输入数据必须正确编码。通常人们对其进行规范化,也许缩放,也许可以对其应用sigma函数来避免值过大或过小。这些是处理错误措施和性能的细节。您现在需要了解的是什么是NN,以及您不能使用它。

    现在给你的问题。您提到您也想使用NN:那又如何,
  • 使用神经网络来指导代理,而
  • 使用遗传算法来进化神经网络参数?

  • 改写为:
  • 让我们假设您有一个机器人:您的NN正在控制左右轮,并作为输入接收下一堵墙的距离以及它已经走了多远(只是一个例子)
  • 从生成随机基因型开始
  • 使基因型成为表型:第一个基因是网络敏感性;第二个基因是网络敏感性。第二个基因编码学习率;第三个基因..依此类推
  • 现在您有了一个神经网络,运行模拟
  • 看看它如何执行
  • 生成第二个随机基因型,进化第二个NN
  • 看看第二个人如何表现
  • 获得最佳个体,然后突变其基因型或与失败者
  • 重组
  • 重复

  • 关于此事,有很棒的阅读:Inman Harvey Microbial GA

    希望我对这些问题有所了解。 NN和GA并不是解决所有问题的 Elixir 。在某些情况下,它们可以做很多事情,而在其他情况下,它们只是错误的工具。 (最好!)我们需要(最好!)来做到最好,而要做到这一点,我们必须很好地理解它们。

    玩得开心!知道这些事情真是太棒了,这使日常生活变得更加有趣:)

    关于java - 通过神经网络和/或强化学习提升我的遗传算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2463160/

    有关java - 通过神经网络和/或强化学习提升我的遗传算法的更多相关文章

    1. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

      尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

    2. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

      我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

    3. ruby - 通过 ruby​​ 进程共享变量 - 2

      我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

    4. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

      我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

    5. java - 等价于 Java 中的 Ruby Hash - 2

      我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

    6. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

      我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

    7. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

      我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

    8. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

      几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

    9. 通过 MacPorts 的 RubyGems 是个好主意吗? - 2

      从MB升级到新的MBP后,Apple的迁移助手没有移动我的gem。我这次是通过macports安装ruby​​gems,希望在下次升级时避免这种情况。有什么我应该注意的陷阱吗? 最佳答案 如果你想把你的gems安装在你的主目录中(在传输过程中应该复制过来,作为一个附带的好处,会让你以你自己的身份运行geminstall,而不是root),将gemhome:键设置为您在~/.gemrc中的主目录中的路径. 关于通过MacPorts的RubyGems是个好主意吗?,我们在StackOverf

    10. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

      我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

    随机推荐