写到变异部分,调试成功。
贴代码:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>
#include <time.h>
#define BOUND_DOWN 1
#define BOUND_UP 5
#define POP_SIZE 4
#define CHROM_LEN 5
#define EVO_NUM 1000
#define CROSS_PROBABILITY 0.6
#define VARY_PROBABILITY 0.1
float sglDistance(float city_1[2], float city_2[2])
{
float s = 0;
s = sqrt(pow((city_1[0] - city_2[0]), 2) + pow((city_1[1] - city_2[1]), 2));
return s;
}
void wholeDistance(int chrom[POP_SIZE][CHROM_LEN], float dist[POP_SIZE], float city[CHROM_LEN][2])
{
float sglDist[POP_SIZE][CHROM_LEN - 1];
int i = 0, j = 0;
for (i = 0; i < POP_SIZE; i++)
{
memset(sglDist[i], 0, sizeof(sglDist[i]));
}
for (i = 0; i < POP_SIZE; i++)
{
for (j = 0; j < CHROM_LEN - 1; j++)
{
sglDist[i][j] = sglDistance(city[chrom[i][j] - 1], city[chrom[i][j + 1] - 1]);
dist[i] += sglDist[i][j];
}
}
}
void testPrint(int chrom[POP_SIZE][CHROM_LEN])
{
int i = 0, j = 0;
for (i = 0; i < POP_SIZE; i++)
{
for (j = 0; j < CHROM_LEN; j++)
{
if (j == (CHROM_LEN - 1))
{
printf("%d", chrom[i][j]);
}
else
{
printf("%d-", chrom[i][j]);
}
}
printf("\n");
}
}
void creat(int chrom[POP_SIZE][CHROM_LEN])
{
int i = 0, j = 0, k = 0, m = 0, flag = 1;
for (i = 0; i < POP_SIZE; i++)
{
for (j = 0; j < CHROM_LEN; )
{
flag = 1;
m = rand() % CHROM_LEN + 1;
for (k = 0; k < j; k++)
{
if (chrom[i][k] == m)
{
flag = 0;
break;
}
}
if (flag == 1)
{
chrom[i][j] = m;
j++;
}
else
{
continue;
}
}
}
}
void fit(float dist[POP_SIZE], float fitness[POP_SIZE])
{
int i = 0;
for (i = 0; i < POP_SIZE; i++)
{
fitness[i] = 1 / dist[i];
}
}
void fitnessP(float fitness[POP_SIZE], float chooseP[POP_SIZE], float accuP[POP_SIZE])
{
float wholeFit = 0;
int i = 0, j = 0;
for (i = 0; i < POP_SIZE; i++)
{
wholeFit += fitness[i];
}
for (i = 0; i < POP_SIZE; i++)
{
chooseP[i] = fitness[i] / wholeFit;
}
accuP[0] = chooseP[0];
for (i = 1; i < POP_SIZE; i++)
{
accuP[i] = accuP[i - 1] + chooseP[i];
}
}
void roulette(int chrom[POP_SIZE][CHROM_LEN], float chooseP[POP_SIZE], float accuP[POP_SIZE])
{
float r = 0;
int i = 0, j = 0, k = 0, m = 0;
int tmp[POP_SIZE][CHROM_LEN];
for (i = 0; i < POP_SIZE; i++)
{
memset(tmp[i], 0, sizeof(tmp[i]));
}
for (i = 0; i < POP_SIZE; i++)
{
r = ((float)rand()) / (RAND_MAX + 1);
if (r < accuP[0])
{
for (j = 0; j < CHROM_LEN; j++)
{
tmp[k][j] = chrom[0][j];
}
k++;
}
else
{
for (m = 1; m < POP_SIZE; m++)
{
if ((r >= accuP[m - 1]) && (r < accuP[m]))
{
for (j = 0; j < CHROM_LEN; j++)
{
tmp[k][j] = chrom[m][j];
}
k++;
}
}
}
}
for (i = 0; i < POP_SIZE; i++)
{
for (j = 0; j < CHROM_LEN; j++)
{
chrom[i][j] = tmp[i][j];
}
}
}
void cross(int chrom[POP_SIZE][CHROM_LEN])
{
int tmp_1[2][CHROM_LEN], tmp_2[2][CHROM_LEN];
int tmp;
int choice_1 = 0, choice_2 = 0, tmp_0 = 0, r_1 = 0, r_2 = 0, i = 0, j = 0, k = 0, m = 0, n = 0;
float pCross = 0;
for (i = 0; i < (POP_SIZE - 1); i++)
{
for (j = 0; j < 2; j++)
{
for (k = 0; k < CHROM_LEN; k++)
{
tmp_1[j][k] = -1;
tmp_2[j][k] = -1;
}
}
choice_2 = choice_1 + 1;
pCross = ((float)rand()) / RAND_MAX;
if (pCross < CROSS_PROBABILITY)
{
r_1 = rand() % CHROM_LEN;
r_2 = rand() % CHROM_LEN;
if (r_1 > r_2)
{
tmp_0 = r_1;
r_1 = r_2;
r_2 = tmp_0;
}
for (j = r_1; j < (r_2 + 1); j++)
{
tmp = chrom[choice_1][j];
chrom[choice_1][j] = chrom[choice_2][j];
chrom[choice_2][j] = tmp;
}
/*printf("\n");
printf("交叉:\n");
testPrint(chrom);*/
for (j = 0; j < CHROM_LEN; j++)
{
if ((j >= r_1) && (j <= r_2))
{
continue;
}
for (k = r_1; k < (r_2 + 1); k++)
{
if (chrom[choice_1][j] == chrom[choice_1][k]) /*r_1=1,r_2=3,choice_1=2,j=3,k=4*/
{
tmp_1[0][m] = j;
tmp_1[1][m] = chrom[choice_1][j];
m++;
}
}
for (k = r_1; k < (r_2 + 1); k++)
{
if (chrom[choice_2][j] == chrom[choice_2][k]) /*r_1=1,r_2=3,choice_2=3,j=3,k=4*/
{
tmp_2[0][n] = j;
tmp_2[1][n] = chrom[choice_2][j];
n++;
}
}
}
for (j = 0; j < n; j++)
{
if (tmp_1[0][j] != -1)
{
chrom[choice_1][tmp_1[0][j]] = tmp_2[1][j];
}
if (tmp_2[0][j] != -1)
{
chrom[choice_2][tmp_2[0][j]] = tmp_1[1][j];
}
}
}
choice_1++;
/*printf("\n");
printf("校正:\n");
testPrint(chrom);*/
}
}
void vary(int chrom[POP_SIZE][CHROM_LEN])
{
int i = 0, r_1 = 0, r_2 = 0, tmp = 0;
float pVary = 0;
for (i = 0; i < POP_SIZE; i++)
{
pVary = ((float)rand()) / RAND_MAX;
if (pVary > VARY_PROBABILITY)
{
continue;
}
do
{
r_1 = rand() % CHROM_LEN;
r_2 = rand() % CHROM_LEN;
} while (r_1 == r_2);
tmp = chrom[i][r_1];
chrom[i][r_1] = chrom[i][r_2];
chrom[i][r_2] = tmp;
}
}
void main(void)
{
/*float city[CHROM_LEN][2] = { {16.47, 96.10}, {16.47, 94.44}, {20.09, 92.54}, {22.39, 93.37},
{25.23, 97.24}, {22.00, 96.05}, {20.47, 97.02}, {17.20, 96.29},
{16.30, 97.38}, {14.05, 98.12}, {16.53, 97.38}, {21.52, 95.59},
{19.41, 97.13}, {20.09, 92.55} };*/
float city[CHROM_LEN][2] = { {16.47, 96.10}, {16.47, 94.44}, {20.09, 92.54}, {22.39, 93.37}, {25.23, 97.24} };
float dist[POP_SIZE], fitness[POP_SIZE], chooseP[POP_SIZE], accuP[POP_SIZE];
int chrom[POP_SIZE][CHROM_LEN];
int i = 0, j = 0;
memset(dist, 0, sizeof(dist));
memset(fitness, 0, sizeof(fitness));
memset(chooseP, 0, sizeof(chooseP));
memset(accuP, 0, sizeof(accuP));
for (i = 0; i < POP_SIZE; i++)
{
memset(chrom[i], 0, sizeof(chrom[i]));
}
srand(time(NULL));
creat(chrom);
//testPrint(chrom);
wholeDistance(chrom, dist, city);
/*for (i = 0; i < POP_SIZE; i++)
{
printf("dist[%d]=%f ", i, dist[i]);
}*/
fit(dist, fitness);
fitnessP(fitness, chooseP, accuP);
/*for (i = 0; i < POP_SIZE; i++)
{
printf("chooseP[%d]=%f ", i, chooseP[i]);
}
printf("\n");
for (i = 0; i < POP_SIZE; i++)
{
printf("accuP[%d]=%f ", i, accuP[i]);
}
printf("\n");*/
roulette(chrom, chooseP, accuP);
printf("原:\n");
testPrint(chrom);
cross(chrom);
printf("\n");
printf("交叉:\n");
testPrint(chrom);
vary(chrom);
printf("\n");
printf("变异:\n");
testPrint(chrom);
}