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

时间:2017-10-20 22:55:46

标签: c++ multithreading genetic-algorithm

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

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

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

我尝试做的是根据一系列不断变化的历史价格,为FX交易信号发生器生成一个最佳技术分析指标列表,其中包含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();
}

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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