我为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) 考虑以下汇编代码循环:
#include <iostream>
#define ADD_LOOP(i, n, v) \
asm volatile ( \
"movw %1, %%cx ;" \
"movq %2, %%rax ;" \
"movq $0, %%rbx ;" \
"for: ;" \
"addq %%rax, %%rbx ;" \
"decw %%cx ;" \
"jnz for ;" \
"movq %%rbx, %0 ;" \
: "=x"(v) \
: "n"(i), "x"(n) \
: "%cx", "%rax", "%rbx" \
);
int main() {
uint16_t iter(10000);
uint64_t num(5);
uint64_t val;
ADD_LOOP(iter, num, val)
std::cout << val << std::endl;
return 0; …Run Code Online (Sandbox Code Playgroud)