geatpy-dev / geatpy

Evolutionary algorithm toolbox and framework with high performance for Python
http://www.geatpy.com
GNU Lesser General Public License v3.0
2.02k stars 727 forks source link

使用moea_NSGA2_templet时,若无可行解时,属性设置maxForgetCount和MAXTIME完全无效,运行时间非常长 #142

Closed zypruc closed 4 years ago

zypruc commented 4 years ago

使用moea_NSGA2_templet时,若无可行解时,属性设置maxForgetCount和MAXTIME完全无效,运行时间非常长 moea_NSGA2_DE_temple情况类似

1061655504 commented 4 years ago

@zypruc 触发了“遗忘策略”,详见Algorithm.py。该问题同issue 74

1061655504 commented 4 years ago

在terminated()里添加print(self.currentGen)看看是不是停留在了某一代里面。MAXTIME是保留属性,原生Algorithm.py里面并无根据MAXTIME来判断进化终止。见http://geatpy.com/index.php/2019/07/28/4-%E8%BF%9B%E5%8C%96%E7%AE%97%E6%B3%95%E6%A8%A1%E6%9D%BF/ 文档的最后部分。

zypruc commented 4 years ago

谢谢,大概懂了,是原生Algorithm.py不调用terminated,因此需要继承写一个新的是吗?

1061655504 commented 4 years ago

@zypruc 对哒,照着那个文档写一个terminated(),就可以实现利用MAXTIME来控制进化时间。

zypruc commented 4 years ago

我按照文档写了,但是无效,在新类中打印passTime与currentGen均为0。

zypruc commented 4 years ago

说错了,currentGen维持-1,passTime为0

1061655504 commented 4 years ago

@zypruc 用MAXTIME控制时间的时候要把遗忘策略关掉,因为遗忘策略会忽略找不到可行解时候的时间。

1061655504 commented 4 years ago

要么就修改遗忘策略原本的机制,把遗忘策略里面忽略找不到可行解的时间的代码改掉,这些以你的能力是可以搞定的。

zypruc commented 4 years ago

搞定了,谢谢。源码模版里初始化了maxForgetCount=1000,难怪我后续修改属性maxForgetCount没用。