我在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();
}
答案 0 :(得分:2)
您认为您的问题是由多线程引起的吗?我不这么认为......
GA始终存在克服局部最大值的问题。我被教导说,随着程序时间的推移,你应该降低突变率以防止跳跃。但最近,我做了一个GA,根据人口中遗传多样性的缺乏,提高了突变率。 (不得不提出一个可以计算多样性的函数)。
对于GA来说,你需要做很多事情:#1,有一种可以非常快速地执行计算适应性的可靠方法。这很难解决很多问题。 #2,用一组基因描述你的问题。同样,这真的很难做到。 #3,谁来繁殖以及如何繁殖它们。我宁愿拥有一个多样化的繁殖池,其中中等表现的基因可以持续几代,特别是如果你的问题是克服局部最大值。当然,#4,你的变异策略。仅仅0.1%的几率翻转1位可能还不够。或者它可能太多了。你如何繁殖或改变像浮点数这样的东西?翻转1位a)会发生剧烈变化,b)对健康没有明显的影响(取决于其他位,可能有好有坏)。
因此使用GA需要大量调整。评估#1和#2并确保您对此感到满意。繁殖实验。 “杀死你的父母”可能有所帮助。也许留下一些父母,但培养每个人,但最低的25%。这样就不太可能跳下来,但是一个好的基因有机会经历一些可能最终产生更好基因的亚突变。
我听说您可以使用GA来设置神经网络的初始权重。我一直想尝试一下,但我还没有去写神经网络。