繁体   English   中英

多线程galib247遗传算法卡在局部最大值

[英]Multithreaded galib247 genetic algorithm stuck in local maxima

我为galib247(下面)添加了多线程支持,但我仍然看到解决方案陷入局部最大值的问题。

也许这是遗传算法的一个缺点。 如果有人有任何建议,请告诉我。 我已经尝试过运行1000个独立人群,根据最近人口找到更好的解决方案的优先次序,我仍然认为它没有找到最佳解决方案。

我也试过修改mutator。 也许解决方案设置太复杂,有很多局部最大值。 它通常在1000个池池中的每一个池中找到不同的局部最大值,但偶尔会有一个池池找到更好的答案并且优先用于调度。

我正在尝试做的是根据一组不断变化的历史价格,为FX交易信号发生器生成一个最佳技术分析指标列表,其中包含参数。 几年前有一本关于它的书,我认为作者的名字是卡茨。

我正在测试结果与第二个历史价格集的差异,但基本上,真正的考验是它是否可以预测未来的价格。

GAPopulation.C( http://lancet.mit.edu/ga/Copyright.html ):

#include <boost/thread.hpp>
#include <boost/threadpool.hpp>

boost::threadpool::pool GAPopulation::thpool(5);

void GAPopulationEvaluatorWorker(void* individual_ptr) {
    ((GAGenome*) individual_ptr)->evaluate();
    boost::this_thread::yield();
}

void GAPopulation::DefaultEvaluator(GAPopulation& p) {
    for(int i = 0; i < p.size(); i++) {
        thpool.schedule(boost::bind(GAPopulationEvaluatorWorker, p.individual_ptr(i)));
    }

    thpool.wait();
}

您认为您的问题是由多线程引起的吗? 我不这么认为......

GA始终存在克服局部最大值的问题。 我被教导说,随着程序时间的推移,你应该降低突变率以防止跳跃。 但最近,我做了一个GA,根据人口中遗传多样性的缺乏,提高了突变率。 (不得不提出一个可以计算多样性的函数)。

有了GA,你需要做很多事情:#1,有一个可以很快执行的计算适应性的可靠方法。 这很难解决很多问题。 #2,用一组基因描述你的问题。 同样,这真的很难做到。 #3,谁来繁殖以及如何繁殖它们。 我宁愿拥有一个多样化的繁殖池,其中中等表现的基因可以持续几代,特别是如果你的问题是克服局部最大值。 当然,#4,你的变异策略。 仅仅0.1%的几率翻转1位可能还不够。 或者它可能太多了。 你如何繁殖或改变像浮点数这样的东西? 翻转1位a)会发生剧烈变化,b)对健身没有明显的影响(取决于其他位,可能有好有坏)。

因此使用GA需要大量调整。 评估#1和#2并确保您对此感到满意。 繁殖实验。 “杀死你的父母”可能有所帮助。 也许留下一些父母,但培养每个人,但最低的25%。 这样就不太可能跳下来了,但是一个好基因有机会经历一些可能最终产生更好基因的亚突变。

我听说你可以使用GA设置神经网络的初始权重。 我一直想尝试,但我还没有去写神经网络。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM