Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 遗传算法:较高的变异率导致较低的运行时间_Python_Genetic Algorithm_Traveling Salesman_Genetic Programming - Fatal编程技术网

Python 遗传算法:较高的变异率导致较低的运行时间

Python 遗传算法:较高的变异率导致较低的运行时间,python,genetic-algorithm,traveling-salesman,genetic-programming,Python,Genetic Algorithm,Traveling Salesman,Genetic Programming,我实现了一个遗传算法来解决一个增强的旅行商问题(边的权重随时间而变化)。目前我正在评估我的模拟的不同参数,我偶然发现了一个我无法向自己解释的相关性: 突变率越高,运行时间越短。我个人认为恰恰相反,因为较高的突变率会产生更多的手术。 (25%的突变率比5%快12%) 突变率为8%(5%比10%好,25%表现最差(0%除外)时,效果最好。适应值越低越好 迭代计数由generation参数设置,该参数在所有测试用例中设置为10.000 每个测试用例执行10次 我的变体实现(在python中)如下所

我实现了一个遗传算法来解决一个增强的旅行商问题(边的权重随时间而变化)。目前我正在评估我的模拟的不同参数,我偶然发现了一个我无法向自己解释的相关性:

突变率越高,运行时间越短。我个人认为恰恰相反,因为较高的突变率会产生更多的手术。 (25%的突变率比5%快12%)

突变率为8%(5%比10%好,25%表现最差(0%除外)时,效果最好。适应值越低越好

迭代计数由generation参数设置,该参数在所有测试用例中设置为10.000

每个测试用例执行10次

我的变体实现(在python中)如下所示:

def mutate(self,p):
    for i in self.inhabitants:
        r = random()
        if r <= p:
            i.mutate()
为什么较高的突变率会导致更快的执行时间

编辑:我实际上在我的Raspberry Pi上运行了相同的测试(速度慢了9倍),结果是相同的:


每个突变周期i都有提供可接受解决方案的概率pi,评估周期所需的时间为Ti。pi和Ti均随突变率的增加而增加。因此,算法的预期运行时间是查找答案所需的预期周期数的总和∑piTi。较高的突变率会增加每个项的大小,但会减少要求和的项的数量。有一个最佳的突变率可以最小化这个总和。

不看完整的代码是不可能知道的,但以下似乎是合理的:

当突变率较低时,经过几代后,种群变得比突变率较高时更同质。假设您使用的是轮盘赌轮抽样的一些变体,更同质的总体意味着轮盘赌轮的每次“旋转”平均花费的时间比您使用更多样的总体时长(相对较少的成员将主导适合度的分布,因此倾向于在扫描人口中较少的成员后进行选择)


更确切地说,您可以使用分析工具,如查看这些CPU周期的确切去向。

运行时间越短,执行的操作就越少(一般来说)。较高的“p”将导致调用“i.mutate()”的频率越高。“i.mutate()”是否会更改“self.incidents”变量?您能显示该函数的代码吗?(或者,如果可能,提供一个最简单的工作示例)你还可以尝试在函数mutate中创建self.industries的本地副本,并循环该副本吗?@armatita我添加了该变异的代码。我不理解你对循环副本的意思。显然,变异函数对self.industries没有任何作用:局部我指的是“local=self.industries”,而不是“因为我在当地:。。。"。另外,您何时何地更改self.incidents的值?为什么您认为它没有做任何事情?它交换了两个位置。如果不发生任何事情,我们将在结果/适用性方面看不到任何差异。可能是,我不完全理解答案,但预期的周期数不会减少,因为它是由世代决定的参数,表示执行交叉和变异的次数。@chepner你怎么知道变异会减少要求和的项数?我没有看到任何指向这一点的东西。啊,我没有注意到生成计数是固定的;我假设有一个阈值来确定解决方案何时足够好。我想他在改变self.includes沿着他的变异函数使初始循环变短。但我不确定这是否是算法的目的。如果这是解释,否则这可能是过程中的错误。
def mutate(self):
    r1 = randint(0,self.locations.size()-1)
    r2 = randint(0,self.locations.size()-1)
    self.locations.swap(r1,r2)