TSP问题,用遗传算法实现,今天只实现到种群初始化。
贴代码:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>
#include <time.h>
#define BOUND_DOWN 1
#define BOUND_UP 14
#define POP_SIZE 4
#define CHROM_LEN 14
#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;
}
float 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 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 dist[POP_SIZE];
int chrom[POP_SIZE][CHROM_LEN];
int i = 0, j = 0;
memset(dist, 0, sizeof(dist));
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]);
}
}