计算函数y=xsin10xπ+2在区间-12的最大值1个体结构设计struct Point int xsize; 基因编码double fitness; 适应度值;2种群设计struct GASet Point objrowcol;;3个体操作初始化void initstruct Point a int i = 0;for i = 0; i size; i++ a-xi = rand 2;解码
更改后的代码如下:
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h>
#define size 22 #define xmax 2.0 #define xmin -1.0 #define row 20 #define col 20 #define PI 3.141592653589
typedef struct Point { int x[size]; double fitness; } Point;
typedef struct GASet { Point obj[row][col]; } GASet;
void init(Point *a) { int i = 0; for (i = 0; i < size; i++) { a->x[i] = rand() % 2; } }
double decode(Point *a) { double y = 0; int i = 0; for (i = 0; i < size; i++) { y = y + a->x[i] * pow(2.0, size - i - 1); } y = xmin + y * (xmax - xmin) / (pow(2.0, size) - 1); return y; }
double getFitness(Point *a) { double vx = 0; vx = decode(a); a->fitness = vx * sin(10 * PI * vx) + 2.0; return a->fitness; }
void swap(Point *a, Point *b) { Point temp; temp = *a; *a = *b; *b = temp; }
void cross(Point *a, Point *b, Point *ab, Point *ba) { int pos = rand() % size; int i = 0; for (i = 0; i < pos; i++) { ab->x[i] = a->x[i]; ba->x[i] = b->x[i]; } for (i = pos; i < size; i++) { ab->x[i] = b->x[i]; ba->x[i] = a->x[i]; } }
void mut(Point *a) { Point temp; int pos = rand() % size; memcpy(&temp, a, sizeof(Point)); temp.x[pos] = (temp.x[pos] + 1) % 2; memcpy(a, &temp, sizeof(Point)); }
void findBestMove(GASet *p) { int pos = 0; double max; int i = 0; int j = 0; for (i = 0; i < row; i++) { pos = 0; max = p->obj[i][pos].fitness; for (j = 1; j < col; j++) { if (max < p->obj[i][j].fitness) { pos = j; max = p->obj[i][j].fitness; } } swap(&(p->obj[i][i]), &(p->obj[i][pos])); } }
void initSet(GASet *p) { int i, j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { init(&(p->obj[i][j])); } } }
void calSet(GASet *p) { int i, j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { getFitness(&(p->obj[i][j])); } } }
void evol(GASet *p) { int i, j; findBestMove(p); for (i = 0; i < row; i++) { for (j = i + 1; j < col; j++) { cross(&(p->obj[i][i]), &(p->obj[j][j]), &(p->obj[i][j]), &(p->obj[j][i])); } } for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { mut(&(p->obj[i][j])); } } for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { getFitness(&(p->obj[i][j])); } } }
int getGbest(GASet *p) { int pos = 0; double max = p->obj[pos][pos].fitness; int i; for (i = 1; i < row; i++) { if (max < p->obj[i][i].fitness) { pos = i; max = p->obj[i][i].fitness; } } return pos; }
int main() { srand(time(0)); GASet p; int n = 0; int best = 0; initSet(&p); calSet(&p); while (n < 200) { evol(&p); n++; } best = getGbest(&p); printf("%0.8f\n", (p.obj[best][best]).fitness); return 0; }
原文地址: https://www.cveoy.top/t/topic/i5M4 著作权归作者所有。请勿转载和采集!