资源简介
个人自己做的基于遗传算法的最短路径问题的程序
用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++串口读写类
相关资源
- C++串口读写类
- c++公司员工管理系统
- c++ 实现matlab smooth 函数
- C++ 课程设计 扫雷系统 报告+源代码
- C++文件加密系统
- 贝塞尔曲面 vc++ opengl
- alphabeta剪枝算法的C++实现下棋程序
- 操作系统的理发师问题解决文件打包
- C++11标准发布文档
- c++ MODBUS串行通信程序
- 成组链接法UNIXC++
- 维特比译码+卷积码编码程序C/C++实现
- 学分管理系统 c++
- C++五子棋源码有AI,先手禁手
- 双语版C++苏小红课后习题参考
- C++大作业之学生管理系统图表
- 基于Windows Socket的安全通信(C++实现)
- 蓝桥杯青少组C++赛前集训包.pdf
- 11个常用OpenCV+C++图像处理
- 吃豆人 c++ 源程序
- 求公式的主合取范式和主析取范式
- C++实现MATLAB的filter函数
- 实验室设备管理系统C++
- C++课程设计之简易英汉字典
- 传热学非稳态热传导问题网格划分数
- 学分管理系统c++课程设计
- 阿伦方差的C++ 版本
- 如何在VC++ 6.0创建RTX项目
- utf8编码解码的纯C++代码
- visualc++下位机温度测量串口通信与实
评论
共有 条评论