c_cpp Genetic_Algorithm
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp Genetic_Algorithm相关的知识,希望对你有一定的参考价值。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
using namespace std;
#define MAX 20
#define MAX_S 0xFFFF
int ge[MAX][MAX_S];
int child1[MAX_S];
int child2[MAX_S];
int maxes[MAX];
char msg[MAX_S] = { 0 };
int tmp[MAX_S] = { 0 };
int main()
{
cin.getline(msg, 0xFFFF);
int msgsz = strlen(msg);
int i, k, j;
int min = 0, min2 = 0, minNumber = 0;
srand(time(0));
for (i = 0; i<MAX; i++)
for (k = 0; k<msgsz; k++)
ge[i][k] = 33 + rand() % 127;
for (j = 0;; j++)
{
memset(maxes, 0, sizeof(int) * MAX);
for (i = 0; i<MAX; i++)
for (k = 0; k<msgsz; k++)
maxes[i] += (msg[k] - ge[i][k]) * (msg[k] - ge[i][k]);
if (j % 100 == 0)
{
for (i = 0; i<MAX; i++)
{
for (k = 0; k<msgsz; k++)
/* ターミナルからBELLがなるときはコメントをはずす */
if (ge[i][k] != 0x07) printf("%c", ge[i][k]);
putchar('\n');
}
}
for (i = 0; i<MAX; i++)
{
if (maxes[i] == 0)
{
for (k = 0; k<msgsz; k++)
/*if (ge[i][k] != 0x07)*/ printf("%c", ge[i][k]);
putchar('\n');
}
}
for (i = 0; i < MAX; i++)
{
min2 = min = maxes[i];
for (k = i; k < MAX; k++)
{
min2 = maxes[k];
if(min2 < min)
{
minNumber = k;
min = min2;
if( 0 == min )
{
cout << j << endl;
return 0;
}
}
}
memcpy(&ge[i], &ge[minNumber], sizeof(int) * msgsz);
}
// 一様交叉
for (i = 0; i < msgsz; i++)
{
if( rand() % 2 ) child1[i] = ge[0][i];
else child1[i] = ge[1][i];
if( rand() % 2 ) child2[i] = ge[0][i];
else child2[i] = ge[1][i];
}
memcpy(&ge[MAX-1 -0], child1, sizeof(int) * msgsz);
memcpy(&ge[MAX-1 -1], child2, sizeof(int) * msgsz);
memcpy(&ge[MAX-1 -2], child1, sizeof(int) * msgsz);
// 突然変異
for (i = 0; i < MAX / 2; i++)
ge[rand() % MAX][rand() % msgsz] += rand() % 2 ? -1 : 1;
}
return 0;
}
以上是关于c_cpp Genetic_Algorithm的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp 200.岛屿数量
c_cpp 127.单词阶梯
c_cpp MOFSET
c_cpp MOFSET
c_cpp 31.下一个排列
c_cpp string→char *