标签: evolutionary-algorithm

轮盘赌选择算法

任何人都可以为轮盘选择功能提供一些伪代码吗?我将如何实现这一点:我真的不明白如何阅读这个数学符号.我想要通用算法.

algorithm roulette-wheel-selection genetic-algorithm evolutionary-algorithm

20
推荐指数
4
解决办法
8万
查看次数

进化算法和神经网络是否在相同的域中使用?

我试图了解各种类型的机器学习算法之间的差异.

据我所知,进化算法的实现与神经网络的实现完全不同.

然而,它们似乎都在确定潜在噪声训练/历史数据集的输入和输出之间的相关性.

从定性的角度来看,与进化算法相比,是否有问题域是神经网络的更好目标?

我已经浏览了一些建议以互补的方式使用它们的文章.有一个很好的用例的例子吗?

artificial-intelligence machine-learning neural-network evolutionary-algorithm

19
推荐指数
1
解决办法
5413
查看次数

Theo Jansen步行机构的进化算法

有一位荷兰艺术家/工程师创造了一个非常精致的步行机制.工作原理可以在这里看到:

http://www.strandbeest.com/beests_leg.php

奇怪的是,他使用自制的进化算法来计算理想的链接长度,这在页面底部有描述.

我创建了一个Python脚本来可视化地分析循环的地面接触部分,它必须满足两个必要条件:

  1. 尽可能直,以免上下摆动;
  2. 尽可能保持速度恒定,以免将一只脚拖到另一只脚上;

这两个标准将产生"轮状"效应,机器在线性前进而不浪费动能.

问题是:

"你是否有任何关于优化腿长度的简单进化迭代公式的建议(通过在下面的代码中插入正确的突变),以便根据上述两个标准改善步行路径?"

编辑:关于基因组候选人的"拟合规则"的一些​​建议:

  • 考虑到它对应于曲柄转动的三分之一(考虑到下部可能具有非水平斜率并且仍然是线性的),取出循环的"下部"(接地触点);
  • 对这个"地面接触"部分的点位置应用线性回归;
  • 从线性回归计算垂直变化(最小二乘?)
  • 通过平行于回归线的一个点和前一个点之间的差异来计算速度变化;
  • (可选)绘制这些"错误函数"的图表,可能允许在视觉上选择突变体(boooring ......; o).

这是我在Python + GTK中的代码,它提供了对问题的一些视觉洞察:(编辑:现在参数化的魔术数字受到mut的值的突变)

# coding: utf-8

import pygtk
pygtk.require('2.0')
import gtk, cairo
from math import *

class Mechanism():
    def __init__(s):
        pass

    def assemble(s, angle):

        # magic numbers (unmutated)
        mu = [38, 7.8, 15, 50, 41.5, 39.3, 61.9, 55.8, 40.1, 39.4, 36.7, 65.7, 49]

        # mutations
        mut = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

        # …
Run Code Online (Sandbox Code Playgroud)

python math geometry genetic-algorithm evolutionary-algorithm

19
推荐指数
1
解决办法
6159
查看次数

遗传算法和进化策略有什么区别?

我已经阅读了几本书的介绍部分以及关于这两个主题的一些论文,并且我认为这两种方法几乎完全相同.也就是说,我还没有时间对主题进行深入研究,所以我可能错了.

遗传算法和进化策略之间有什么区别?是什么让他们与众不同,他们在哪里相似?

genetic-algorithm evolutionary-algorithm

19
推荐指数
2
解决办法
1万
查看次数

任何现有的机器学习结构都可以完美地模拟像Fibonacci序列那样的递归函数吗?

要明确我并不是说,只要序列中的最后两个数字提供下一个数字:

(2, 3, -> 5)
Run Code Online (Sandbox Code Playgroud)

但相反,给定任何索引提供斐波纳契数:

(0 -> 1) or (7 -> 21) or (11 -> 144) 
Run Code Online (Sandbox Code Playgroud)

对于任何机器学习结构,添加两个数字是一项非常简单的任务,并且通过扩展计数,两个数字或任何固定数字是一个简单的加法规则.然而递归计算......

据我所知,大多数学习网络只依赖于前向评估,而大多数编程语言都有循环,跳转或循环流模式(所有这些都是某种类型的ASM跳转),从而允许递归.

当然有些网络不仅仅是前锋; 但是,使用双曲正切或sigmoid函数处理权重是否可以进入任何计算完整的状态?

即条件语句,条件跳转,强制跳转,简单循环,具有多个条件的复杂循环,提供排序顺序,元素的实际重新排序,赋值,分配额外的寄存器等等?

似乎即使是非前向唯一的网络也只能找到最佳拟合的多项式,从而减少了训练集范围内的误差,并且不再进一步.

我错过了一些明显的东西,或者大多数机器学习只是看看递归并假装那些问题不存在?


更新

从技术上讲,任何编程语言都可以被认为是遗传算法的DNA,其中编译器(以及可能的控制台测量)将是适应度函数.问题是编程(到目前为止)不能以爬山的方式表达 - 字面上,健身是0,直到健身为1.事情不是编程的一半,如果他们这样做,没有办法衡量一个程序在未知情况下的"工作"程度.即使是一个错误也可能看起来是完全不同且混乱的系统,没有输出.这正是首先学习编码非常困难的原因,学习曲线几乎是垂直的.

有些人可能会争辩说,你只需要为系统提供更强大的基础规则来利用 - 但这只会导致尝试概括所有编程问题,这些问题一直围绕着设计编程语言并且完全失去了某些学习机器的概念.沿着这条道路带您到LISP的近似变体,具有可变异的代码和几乎无意义的健身功能,这些功能可以强制"漂亮"和"简单"的代码空间,以尝试遵循人类编码最佳实践.

其他人可能会争辩说,我们根本没有使用足够的人口或动力来获得错误表面,或者朝着解决方案迈出有意义的一步.但随着你的人口接近DNA排列的数量,你实际上只是粗暴的强迫(并且非常低效).暴力强制代码排列并不是什么新鲜事,绝对不是机器学习 - 它实际上在正则表达式高尔夫中很常见,我认为甚至还有一个关于它的xkcd ......

真正的问题不是找到适用于某些特定递归函数的解决方案,而是找到一个可以以某种有用的方式包含递归域的解决方案空间.


因此,除了使用反向传播训练的神经网络,假设找到递归函数的封闭形式(如果封闭形式甚至存在,并且它们在递归有用的大多数实际情况中不存在),或者非转发网络就像伪编程语言在最好的情况下具有可怕的健身前景,加上调整退出约束以防止无限递归的几乎不可能的任务......到目前为止,机器学习和递归真的是这样吗?

recursion machine-learning neural-network genetic-algorithm evolutionary-algorithm

19
推荐指数
2
解决办法
4473
查看次数

Haskell:抽象遗传算法

我是Haskell编程世界的新手,我正在研究一种简单的遗传算法,以找到旅行商问题的良好解决方案.我将解决方案表示为Integers上的排列,因此我有这种类型的同义词

type Genome = [Int]
Run Code Online (Sandbox Code Playgroud)

算法本身是一组对解决方案进行操作的函数:

mutation :: Genome -> Genome
selectParents :: [Genome] -> [Genome] -> [Genome]
crossover :: Genome -> Genome -> (Genome, Genome)
selectSurvivors :: [Genome] -> [Genome] -> [Genome]
Run Code Online (Sandbox Code Playgroud)

我不确定我的代码中有多少与我的问题相关,所以请询问是否需要更多详细信息.值得一提的一件事是上面的类型签名实际上是简化的,我实际上是使用State monad来携带一个StdGen所以这些函数实际上都返回有状态计算.

有几件事我想对此做些什么,但不能完全理解.我希望能够为解决方案选择不同的表示形式,在我看来,这将是一个使用类型类的自然场所,因此这Genome将是类型类和它[Int]的特定实例Genome.

现在,我希望能够尝试实现,并希望能够在其他项目中使用该代码.使用这样的类型类需要我创建的每个新算法都要求我创建另一个实例Genome,这是创建库的好方法吗?

一个额外的问题,只是困扰我的事情,是否有任何方法可以创建类似函数的类型同义词,这样如果我正在编写一个函数,它将函数作为参数,我可以编写同义词而不是整个类型函数的签名,即以下类似的东西可以工作.

type someFunc = [Int] -> [Int] -> Int
someOtherFunc :: someFunc -> [Int] -> Int
Run Code Online (Sandbox Code Playgroud)

是的,希望这是对问题的一个清晰的解释,感觉我错过了真正明显的答案,但它没有跳出来对我.干杯

haskell evolutionary-algorithm

18
推荐指数
1
解决办法
2554
查看次数

解释差异进化方法

有人可以解释差异进化方法吗?维基百科的定义非常技术性.

一个简单的例子后面的一个愚蠢的解释将是赞赏:)

evolutionary-algorithm differential-evolution

17
推荐指数
3
解决办法
1万
查看次数

什么是小生活方案?

我目前正在阅读一篇关于在约束优化问题中使用GA的论文.在某些方面,它正在讨论将niching方案应用于个人(或他们制造的帕累托前线).

这似乎是一个典型的选择方案,但在我搜索时,我找不到一个很好的解释.

有人可以尽可能简单地向我解释一下,这是一种什么样的方案

genetic-algorithm evolutionary-algorithm

17
推荐指数
1
解决办法
8309
查看次数

具有部分可用机器的排列作业调度

我正在寻找一种合适的算法来解决时间调度问题.首先,我将概述问题本身,然后在第二部分,我将给出我正在考虑解决方案的方向.我正在尝试解决这个问题,因为我对这些问题感兴趣,并且因为同样的问题可以在以后用更多的变量和更大的设置来解决.

问题

我想对电池进行一些测试,以了解它们在连接到负载时的响应方式.并在尽可能短的时间内完成所有测试.这里的两个重要变量是:

  • 充电状态(SoC)电池剩余的能量从100%到0%.我们将测试99%,75%,50%和25%(4种变化).(后面解释为什么99%而不是100%).我们将假设当放松为0时SoC丢失.
  • 放松电池在几小时内放松的量.我们知道理论上24小时应该足够了,所以这是最大的.我们将测试不同的时间,如:5分钟,15分钟,30分钟,1小时,2小时,6小时,24小时(7个变化).

总组合:一个电池4 x 7 = 28

测试应该进行的顺序如下:充电到100%,放电到所需的SoC,放松,放电到新的SoC测量

示例:我们希望看到电池在放电达到2小时的同时从75%放电到50%时的反应

  1. 电池有未知的SoC(测量方法不够准确)
  2. 充值至100%
  3. 放电至75%
  4. 放松2小时
  5. 测量时放电,停止在50%

电池现在可以再次放松,并从50%到25%开始测量.它不必再次充电至100%.

情况/状态

现在我将概述一些可能发生的情况以及在这种情况下必须采取的措施.

初始化

可以使用已执行的测试来初始化问题(这很重要,因为我们可能希望在中途重新安排).如果电池具有已知状态(SoC /松弛),我们可以使用它.如果SoC未知,那么电池必须充电.如果放松未知但SoC已知,那么电池必须放松至少24小时.

充值

将电池放入充电器必须手动完成.将电池留在充电器中不是问题.充电大约需要2.5小时.每个电池都有自己的专用充电器,但将来我们可能会有更多的电池充电器,因此算法需要能够采用不同数量的充电器.

放松(放松)

放松可以简单地通过不将电池连接到任何东西来完成,因此它不需要任何特殊设备.在松弛时间段开始之前,必须对电池施加压力(=连接到放电器).我们不确定压力期将持续多长时间,但我们假设将电池放电1%所需的时间就足够了.99%将成为我们可以准确确定放松时间的第一个SoC.

放电

目前只有一个放电器,但算法应该能够采用不同数量的放电器.将电池放入放电器必须手动完成(也取出).但是,如果将电池放入放电器,则无需立即将电池放电.可以将时间设置为在特定时间开始.当排出足够的能量时,放电器可以自动停止.可以从查找表估计放电时间的估计.这不是线性的,因此75%至50%不必花费相同的时间,从25%到0%.查找相当准确(2.5小时差异大约5分钟).

等候

如果取出所有放电器,电池可以等待,但是等待放电器会增加放松时间.因此,如果弛豫时间高于必须执行的测量所需的弛豫时间,则它必须放电到较低的电荷水平并再次松弛,或者必须再次充电.
如果安全地取出所有充电器,电池可以等待,这里没有任何惩罚/劣势,除此之外没有时间等待.

限制

必须手动完成的事情只能在办公时间(星期一至星期五8:30-17:00)完成.因此,例如将电池放入放电器必须手动完成.然后在夜晚的设定时间(电池放松后),可以在计时器上启动放电器,然后第二天早上到达办公室时,电池可以放入充电器.

对解决方案的想法

我不确定我是否正在考虑正确的方向,因为我还没有工作解决方案.所以部件中的任何东西都可能是错误的..

任务序列很重要,因为不同的序列可能会引入比另一个序列更多或更少的等待时间.因此,对于只有一个28次测试的电池,这将是28的排列!这是一个相当大的数字.因此,对问题空间的详尽搜索是不可行的.我所知道的唯一可以在这些问题上给出相当好结果的算法是遗传算法.虽然有所有的限制和可能性,我不能使用经典的遗传算法.我读过一些(研究)论文,最终对排列Flowshop调度问题(PFSP)的描述产生了最多的共鸣(各种来源).虽然提到扩展作业车间调度问题(EJSSP)在这里也非常有趣.

我看到的最大问题是办公时间限制.如果不是因为调度可能类似于仅将块拟合到时隙中(即使插槽具有动态大小).我不确定处理这种约束的最佳方法是什么.要么我可以将机器(放电器)建模为两个独立的机器,每个机器在不同时刻都是活动的,或者我可以引入假工作,以便机器不能被正常工作带走.

这只是在这一点上的猜测,因为我缺乏经验.我更像是一个务实的程序员,而不是一个学者,我真的很难弄清楚哪些算法适合哪些,以及注意事项是什么.我很高兴做到实施,但现在我仍然坚持:

  1. 哪种算法适合这类问题?
  2. 如何设置算法的特殊条件?
  3. 我怎样才能进行交叉/选择/突变功能?
  4. 我是否需要在子问题中解决这个问题并将其纳入更大的算法?首先要解决哪些子问题?
  5. 伪代码怎么样?

algorithm search genetic-algorithm evolutionary-algorithm

16
推荐指数
1
解决办法
508
查看次数

如何在Neuroevolution中进化神经网络的权重?

我是人工神经网络和NeuroEvolution算法的新手.我正在尝试实现名为NEAT(NeuroEvolution of Augmented Topologies)的算法,但原始公共报纸中的描述错过了如何演化网络权重的方法,它说"连接权重在任何NE系统中变异,与每一个连接在每一代都是否受到干扰".

我已经做了一些关于如何在NE系统中改变权重的搜索,但遗憾的是找不到任何详细的描述.

我知道在训练NE时,通常使用反向传播算法来校正权重,但只有在您拥有固定的拓扑(结构)代数并且您知道问题的答案时,它才有效.在NeuroEvolution中你不知道答案,你只有健身功能,所以在这里不可能使用反向传播.

machine-learning neural-network genetic-algorithm evolutionary-algorithm deep-learning

15
推荐指数
2
解决办法
9214
查看次数