遗传算法 C++代码实现
时间: 2023-06-29 19:20:03 浏览: 86
以下是一个简单的遗传算法的 C++ 代码实现,其中包括了基本的遗传算法流程,包括选择、交叉和变异等操作:
```c++
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<cmath>
using namespace std;
const int N=100;
const int M=10000;
const double p=0.05; //变异概率
int n,d;
double a[N][N],f[N],w[N];
double x[N][N],y[N];
int pre[M][N],nex[M][N];
double sum,sumw;
int cnt;
int getrand(int l,int r){
return rand()%(r-l+1)+l;
}
double getrand(double l,double r){
return (double)rand()/(RAND_MAX+1.0)*(r-l)+l;
}
void init(){
for(int i=1;i<=n;i++){
for(int j=1;j<=d;j++){
x[i][j]=getrand(-10,10);
}
y[i]=0;
}
}
void calc(){
for(int i=1;i<=n;i++){
for(int j=1;j<=d;j++){
y[i]+=a[i][j]*x[i][j];
}
f[i]=max(0.0,1-y[i]);
}
sum=0;
for(int i=1;i<=n;i++){
sum+=f[i];
}
for(int i=1;i<=n;i++){
w[i]=f[i]/sum;
}
sumw=0;
for(int i=1;i<=n;i++){
sumw+=w[i];
w[i]=sumw;
}
}
void select(){
for(int i=1;i<=n;i++){
double u=getrand(0,1);
for(int j=1;j<=n;j++){
if(u<=w[j]){
for(int k=1;k<=d;k++){
pre[i][k]=j;
}
break;
}
}
}
}
void cross(){
for(int i=1;i<=n;i++){
if(getrand(0,1)<=0.8){
int j=getrand(1,n);
while(j==i)j=getrand(1,n);
int k=getrand(1,d);
for(int l=1;l<=k;l++){
nex[i][l]=x[pre[i][l]][l];
}
for(int l=k+1;l<=d;l++){
nex[i][l]=x[pre[j][l]][l];
}
}
else{
for(int j=1;j<=d;j++){
nex[i][j]=x[pre[i][j]][j];
}
}
}
}
void mutate(){
for(int i=1;i<=n;i++){
if(getrand(0,1)<=p){
int j=getrand(1,d);
nex[i][j]=getrand(-10,10);
}
}
}
void print(){
double ans=0;
int id=1;
for(int i=1;i<=n;i++){
double tmp=0;
for(int j=1;j<=d;j++){
tmp+=a[i][j]*x[i][j];
}
if(1-tmp>ans){
ans=1-tmp;
id=i;
}
}
printf("ans=%lf\n",ans);
printf("x=");
for(int i=1;i<=d;i++){
printf("%lf ",x[id][i]);
}
}
int main(){
srand(233);
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++){
for(int j=1;j<=d;j++){
scanf("%lf",&a[i][j]);
}
}
init();
for(int i=1;i<=M;i++){
calc();
select();
cross();
mutate();
for(int j=1;j<=n;j++){
for(int k=1;k<=d;k++){
x[j][k]=nex[j][k];
}
}
}
print();
return 0;
}
```
这个代码实现的是一个简单的经典的遗传算法,用于解决一个分类问题。它的基本流程是:
1. 初始化种群
2. 计算适应度函数
3. 选择优秀的个体
4. 交叉优秀的个体
5. 变异一部分的个体
6. 重复 2-5 步骤若干次
7. 输出最终结果
当然,这只是遗传算法的一个简单实现,实际上遗传算法的变体很多,也可以根据具体问题进行定制化的设计。
阅读全文