• 大小: 6KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-22
  • 语言: C/C++
  • 标签: C++  

资源简介

个人自己做的基于遗传算法的最短路径问题的程序 用C++写的 使用的选择法是轮盘赌 交叉式部分匹配 变异是2点交换。 最近准备用C#再重做一遍,准备添加个前台界面,以及自动读图生成拓补结构图。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 

#define popsize 50
#define maxgens 500
#define pxover 0.8
#define pmutation 0.3
#define nvars 30

struct genotype
{
int gene[nvars];
int course;
double fitness;
double rfitness;
double cfitness;
int point[nvars];
};


int b[nvars][nvars];
struct genotype population[popsize];
struct genotype newpopulation[popsize];
struct genotype better;



void initialize(void) // 初始化结构体
{
int ij;
int p;
for (i=0;i {
for (j=0;j {
population[i].gene[j]=0;  
population[i].point[j]=0;
}
population[i].course=0;
population[i].fitness=0;
population[i].rfitness=0;
population[i].cfitness=0;
} // 初始化
printf(“初始化种群中:“);
for (i=0;i {
p=1; // 优先权初始化
srand((unsigned)time(NULL));
while (p<=nvars)
{
j = rand()%nvars; // 随即赋予优先权
if (population[i].gene[j]==0)
{
population[i].gene[j]=p;
p++;
}
}
if((i+1)%10==0) printf(“.“);
}
printf(“\n“);
}

void evaluate()
{
int ijknm;
double abc; // 新增了一个中转变量
int temp[nvars];
for (n=0;n {
for (j=0;j {
population[n].point[j]=0;
}
population[n].course=0;
k=1;
i=0;
while (i!=(nvars-1))
{
for (m=0;m {
temp[m]=0;
}
m=0;
for (j=0;j {
if (b[i][j]!=0)
{
temp[m]=j;
m++; // 找出当前端点可以前进的端点;
}
}
for (m=0;m {
if((population[n].gene[temp[m]]>population[n].gene[temp[0]])&&(temp[m]!=0)) temp[0]=temp[m]; // 优先权比较
}
population[n].course+=b[i][temp[0]]; // 计算路径长度
i=temp[0];
population[n].point[k]=i; // 记录路径中的端点
k++;
}
abc=population[n].course; // 将数值进行转换从INT型转为DOUBLE型
population[n].fitness=1/abc; // 计算适应度
}
}

void best(void)
{
int i;
better.fitness=0.0000000;
for (i=1;i {
if (population[i].fitness>better.fitness)
{
better=population[i];
}
}
}

void keep_the_best(void)
{
int i;
for (i=1;i {
if (population[i].fitness>better.fitness)
{
better=population[i];
}
}
}

void select(void)
{
int ij;
double sum=0;
double p;
for (i=0;i {
sum+=population[i].fitness;
}
for (i=0;i {
population[i].rfitness =  population[i].fitness/sum;
}
population[0].cfitness = population[0].rfitness;
for (i=1;i {
population[i].cfitness =  population[i-1].cfitness + population[i].rfitness;
}
for (i = 0; i < popsize; i++)
    { 
p = rand()%1000/1000.0;
if (p < population[0].cfitness)
newpopulation[i] = population[0];      
else
{
for (j = 0; j  if (p >= population[j].cfitness && p                        newpopulation[i] = population[j+1];
}
}
for (i=0;i

评论

共有 条评论