这是用C++写的遗传算法,参考《智能算法 30案例分析 第2版》一书,包含TSP、LQR控制器、结合量子算法、多目标优化、粒子群等,由于原作为matlab程序,综合自己思路通过C++写出来,算是练习和开个大坑
这是用C++写的遗传算法,参考《智能算法 30案例分析 第2版》一书,包含TSP、LQR控制器、结合量子算法、多目标优化、粒子群等,由于原作为matlab程序,综合自己思路通过C++写出来,算是练习和开个大坑
git clone https://github.com/ShiSanChuan/GeneticAlgorithm.git
cd GeneticAlgorithm/
cmake .
make -j4
cd src/
./GA
x^2*sin(3x*pi)
的最大值,增大初始种群数目可加快迭代,增加种群基因编码长度增大迭代稳定性,变异和交叉较小为好;float fun1(std::vector<float> argv){
float x=argv[0];
return (x*x*std::sin(3*pi*x));
}
...
ga.solve(fun1,1);
xcos(2pi*y)+ysin(2pi*x)
,该函数的matlab绘制的图像在第二张图片。float fun2(std::vector<float> argv){
float x=argv[0];//参数可变,当前使用两个变量
float y=argv[1];
return (x*std::cos(2*pi*y)+y*std::sin(2*pi*x));
}
...
ga.solve(fun2,2);
BP的正则化在opencv中有点难弄。。所以结果误差MSE在4左右,BP中的sigmod函数的确非常重要。。。
float _input[2][3]={{1,2,3},{4,5,6}};
float _output[2][2]={{1.,2.},{3.,4.}};
...
GA_BP ga(10,440);
ga.BPsolve(input, output);
float _address[14][3]
,这样初始化就有问题,会求取空间的TSP,而且第三个参数是随机的,这个错误太大意了,修改后效果好很多,近乎最优解,速度比MATLAB快。float _address[14][2]={{16.47,96.10},{16.47,94.44},
{22.39,93.37},{25.23,97.24},
{20.47,97.02},{17.20,96.29},
{14.05,98.12},{22.00,96.05},
{16.53,97.38},{21.52,95.59},
{19.41,97.13},{20.09,92.55}};
...
cv::Mat address(cv::Size(2,12),CV_32FC1,_address);
GA_TSP ga(40,address.rows);
ga.TSPsolve(address);
* select 通过量子门旋转更新群体 更新方法: P82
*x best f(x)>f(best) alpha ab>0 ab<0 a=0 b=0
*0 0 false 0 0 0 0 0
*0 0 true 0 0 0 0 0
*0 1 false 0.01pi 1 -1 0 +-1
*0 1 true 0.01pi -1 1 +-1 0
*1 0 false 0.01pi -1 1 +-1 0
*1 0 true 0.01pi 1 -1 0 +-1
*1 1 false 0 0 0 0 0
*1 1 true 0 0 0 0 0
float fun2(std::vector<float> argv){
float x=argv[0];
float y=argv[1];
return (x*std::cos(2*pi*y)+y*std::sin(2*pi*x));
}
...
QGA ga(80,80);
ga.solve(fun2,2);
Popula=ga.crtbp();
...
ga.bs2rv(Popula,-2,2);
ga.ranking();
ga.select(Popula);
float fun3(std::vector<float> argv){
float x=argv[0];
float y=argv[1];
return (x*std::cos(2*pi*y)+y*std::sin(2*pi*x));
}
...
PSO pso(50,2,-2,2);
pso.solve(fun3);
pso.crtbp();
...
pso.ranking();
pso.update(1);
#include <cstdarg>
void testarg(count,...){
va_list ap;
va_start(ap, count);
for(int i=0;i<count;i++)
std::cout<<(int)va_arg(ap, int)<<std::endl;;
va_end(ap);
return;
}