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

标签 c++ multithreading genetic-algorithm

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

也许这是一般遗传算法的缺点。让我知道是否有人有任何建议。我已经尝试运行 1000 个独立群体,这些群体根据群体最近找到更好解决方案的时间来确定优先级,但我仍然认为它没有找到最佳解决方案。

我也试过修改增变器。可能解设置的太复杂了,有很多局部极大值。它通常会在 1000 个池中的每一个中找到不同的局部最大值,但偶尔会有一个池中的池找到更好的答案并优先进行调度。

我正在尝试做的是生成一个最佳技术分析指标列表,其中包含用于根据不断扩展的历史价格集进行实时交易的外汇交易信号生成器的参数。几年前有一本书,我想作者的名字叫卡茨。

我正在根据第二个历史价格集测试结果的方差,但基本上,真正的测试是它是否可以预测 future 价格。

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 位可能还不够。或者它可能太多了。你如何繁殖或变异像 float 这样的东西?翻转 1 位 a) 会产生巨大的变化,并且 b) 对适应性没有明显影响(根据其他位可能是好是坏)。

所以使用 GA 需要大量的调整。评估#1 和#2 并确保您对此感到满意。进行育种试验。 “杀死你的 parent ”可能会有所帮助。也许保留一些 parent ,但除了最低的 25% 以外的所有人。这样跳下来的机会就更少了,但是一个好的基因有机会经历一些低于标准的突变,最终可能会产生一个更好的基因。

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

关于c++ - 多线程 galib247 遗传算法卡在局部最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46858371/

相关文章:

c++ - QT undefined reference 错误(Qextserialport)

C++错误初始化数组

php - 在PHP中最后sem_release之后删除信号量

c++ - 最佳情况下,如果一个变量在多个线程中读取但仅在一个线程中写入,那么是否应该在写入线程中非原子地读取该变量?

machine-learning - 神经进化 : NEAT algorithm innovation numbers

c++ - OpenGL 高度图渲染器不产生平滑的地形

c++ - 模拟读数的计算出现错误

android - android handlemessage可以重入吗?

算法:使用 GA 优化生产计划

c++ - 使用遗传算法收敛到 2 变量函数的全局最小值