Abd*_*had 7 c++ multithreading genetic-algorithm
我为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();
}
Run Code Online (Sandbox Code Playgroud)
您认为您的问题是由多线程引起的吗?我不这么认为...
遗传算法总是存在克服局部最大值的问题。我被告知,随着程序时间的推移,你应该降低突变率以防止跳下去。但最近,我制作了一个 GA,由于其种群缺乏遗传多样性,它增加了其突变率。(必须想出一个可以计算多样性的函数)。
对于 GA,您需要做好很多事情:#1,拥有可以快速执行的可靠计算适应度的方法。这根本无法完成,会带来很多问题。#2,用一组基因描述你的问题。再说一遍,这真的很难做到。#3,饲养谁以及如何饲养它们。我宁愿有一个多样化的育种池,其中表现中等的基因可以持续几代,特别是如果你的问题是克服局部最大值。当然,#4,你的突变策略。仅以 0.1% 的机会翻转 1 位可能还不够。或者可能太多了。如何培育或变异浮点数之类的东西?翻转 1 位 a) 会产生巨大的变化,b) 对适应度没有明显的影响(它可能是好是坏,具体取决于其他位)。
所以使用 GA 需要大量的调优。评估#1 和#2 并确保您对此感到满意。进行育种实验。“杀死你的父母”可能会有所帮助。也许保留一些父母,但除了最低的 25% 之外,其他人都可以繁殖。这样一来,跳下来的机会就会减少,但一个好的基因有机会经历一些低于标准的突变,最终可能会产生一个更好的基因。
我听说你可以使用 GA 来设置神经网络的初始权重。我一直想尝试一下,但我仍然没有时间编写神经网络。
| 归档时间: |
|
| 查看次数: |
266 次 |
| 最近记录: |