服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++实现简单遗传算法

C++实现简单遗传算法

2021-02-26 15:02巫祝 C/C++

这篇文章主要介绍了C++实现简单遗传算法,以实例形式较为详细的分析了遗传算法的C++实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了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++程序设计有所帮助。

延伸 · 阅读

精彩推荐