欢迎来到山村网

C++实现简单遗传算法

2019-03-02 13:30:10浏览:338 来源:山村网   
核心摘要:  本文实例讲述了C++实现简单遗传算法。分享给大家供大家参考。具体实现方法如下:  ? 12345678910111213141516171819202122

  本文实例讲述了C++实现简单遗传算法。分享给大家供大家参考。具体实现方法如下:

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 //遗传算法 GA #include<iostream> #include <cstdlib> #include<bitset> using namespace std; const int L=5; //定义编码的长度 int f(int x) //定义测设函数f(x) { int result; result=x*x*x-60*x*x+900*x+100; return result; } int main(int argc,char *argv[]) { int a(0),b(32); //定义x的定义域范围 const int pop_size=8; //定义种群大小 // int L; //指定编码的长度 const int NG=20; //指定种群最大的繁殖的代数 int t=0; //当前繁殖的代数 int p[pop_size]; //定义种群 int q[pop_size]; //定义繁殖种群 即种群的下一代 srand(6553); //定义随机数生成的种子 double sum; //适值总和 double avl_sum; //适度平均值 double p_probability[pop_size]; //适值概率 double pp[pop_size]; double pro; //定义随机生成的概率 float pc=0.90; //定义交叉的概率 float pm=0.05; //定义变异的概率 cout<<"初始的种群 "; for(int i=0;i<pop_size;i++) //生成初始的第0代种群 { p[i]=rand()%31; cout<<p[i]<<" "; } cout<<endl; cout<<endl; void Xover(int &,int &); //声明交叉函数 //当停止准则不满足 即繁殖代数没到最大代数 ,继续繁殖 while(t<=NG) { cout<<"繁殖的代数:t="<<t<<endl; sum=0.0; for(int i=0;i<pop_size;i++) { q[i]=p[i]; cout<<q[i]<<" "; } cout<<endl; for(int i=0;i<pop_size;i++) //计算sum sum +=f(p[i]); avl_sum=sum/pop_size; cout<<"sum="<<sum<<endl; cout<<"适度平均值="<<avl_sum<<endl; for(int i=0;i<pop_size;i++) //计算适值概率 { p_probability[i]=f(p[i])/sum; if(i==0) { pp[i]=p_probability[i]; cout<<"pp"<<i<<"="<<pp[i]<<endl; } else { pp[i]=p_probability[i]+pp[i-1]; cout<<"pp"<<i<<"="<<pp[i]<<endl; } //cout<<"p_probability"<<i<<"="<<p_probability[i]<<endl; } //选择双亲 for(int i=0;i<pop_size;i++) { pro=rand()%1000/1000.0; if(pro>=pp[0]&&pro<pp[1]) p[i]=q[0]; else if(pro>=pp[1]&&pro<pp[2]) p[i]=q[1]; else if(pro>=pp[2]&&pro<pp[3]) p[i]=q[2]; else if(pro>=pp[3]&&pro<pp[4]) p[i]=q[3]; else if(pro>=pp[4]&&pro<pp[5]) p[i]=q[4]; else p[i]=q[5]; } //杂交算子 int r=0; int z=0; for(int j=0;j<pop_size;j++) { pro=rand()%1000/1000.0; if(pro<pc) { ++z; if(z%2==0) Xover(p[r],p[j]); else r=j; } } //变异算子 for(int i=1;i<=pop_size;i++) for(int j=0;j<L;j++) { pro=rand()%1000/1000.0; //在【0,1】区间产生随机数 if(pro<pm) { bitset<L>v(p[i]); v.flip(j); p[i]=v.to_ulong(); } } t++; cout<<endl; //种群繁殖一代 } cout<<"最终结果:"; for(int i(0);i<pop_size;i++) //算法结束,输出结果 { cout<<p[i]<<" "; } cout<<endl; return 0; } //定义杂交操作 void Xover(int &a,int &b) { int pos; //随机生成杂交点 即第几个分量进行相互交换 pos=rand()%5+1; //在n个分量中,随机确定第pos个分量 int j,k; j=pos; k=pos; bitset<L>e(a); bitset<L>f(b); //前pos个分量进行相互交换 bitset<L>g; bitset<L>h; for(int i=0;i<pos;i++) { if(e[i]==1) g.set(i); } for(int i=0;i<pos;i++) { if(f[i]==1) h.set(i); } for(j;j<L;j++) { if(f[j]==1) g.set(j); } for(k;k<L;k++) { if(e[k]==1) h.set(k); } a=g.to_ulong(); b=h.to_ulong(); }

  希望本文所述对大家的C++程序设计有所帮助。

(责任编辑:豆豆)
下一篇:

C++联合体union用法实例详解

上一篇:

java生成随机数的方法

  • 信息二维码

    手机看新闻

  • 分享到
打赏
免责声明
• 
本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们 xfptx@outlook.com