资源简介
个人自己做的基于遗传算法的最短路径问题的程序
用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
- 上一篇:使用GPU实现SVD
- 下一篇:C++串口读写类
相关资源
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
评论
共有 条评论