资源简介
使用遗传算法求解中国旅行商问题(31个城市),数据从文件中(网上找到)读取。求得的最好结果是:15397.5km(不是每次都能有这个解),比介绍算法的人工智能上说的15404km略短,编程环境Visual studio2013,所以个别函数在低版本环境下可能需要修改(例如fopen_s在低版本环境下为fopen)。
代码片段和文件信息
/**
*遗传算法求解中国旅行商问题
*遗传算法使用的三个算子:
*(1)选择算子:根据适应度函数,选择适应度该高的个体进行下一步的杂交,
反应进化过程中优胜劣汰的自然规律
*(2)交叉算子:交叉过程随机选择两个个体进行排队,根据预先设定的交叉概
率Pc(0.5~0.8),决定是否交叉,交叉方法有单点交叉,两点交叉,和均
匀交叉,这个类似于生物学中染色体交换基因片段
*(3)变异算子:变异算子将新个体的基因链中的某一位或者某一片段按变异概率
Pm(0.001~0.1)进行变异
**/
#include
#include
#include
#include
#include“qsort.h“
#define INF 9999999 //指定为正无穷
//定义坐标点结构体
struct Point
{
int x;
int y;
};
/**********************************************
*以下过程包括:
*1. 读入31个城市的坐标位置
*2. 求任意两个城市间的距离
*3. 求一条完整路径的总长度
************************************************/
//从文件读取坐标点
Point* getPoints(int len char* filename)
{
Point* ps = (Point*)malloc(sizeof(Point)*len);
FILE *infile;
fopen_s(&infile filename “r“);
if (infile == NULL)
{
printf(“文件打开失败\n“);
}
for (int i = 0; i < len; i++)
{
fscanf_s(infile “%d%d“ &ps[i].x &ps[i].y);
}
fclose(infile);
return ps;
}
//求两点间的距离
float getDistance(Point p1 Point p2)
{
return powf(powf(p1.x - p2.x 2) + powf(p1.y - p2.y 2) 0.5);
}
//计算任意两座城市间的距离,并保存在二维数组里
float** getAnyDistance(Point* ps int len)//求任意两座城市之间的距离
{
float** cost = (float**)malloc(sizeof(float*)*len);
for (int i = 0; i < len; i++)
{
cost[i] = (float*)malloc(sizeof(float)*len);
}
for (int i = 0; i < len; i++)
{
for (int j = i + 1; j < len; j++)
{
cost[i][j] = getDistance(ps[i] ps[j]);
cost[j][i] = cost[i][j];
}
cost[i][i] = 0;
}
return cost;
}
//计算一条环路的总长度,本算法里面的适应度就是以环路的长度为标准,越小适应度越高
float getTotalDistance(int *path float **cost int len)
{
float total = 0;
for (int i = 0; i < len - 1; i++)
{
total += cost[path[i]][path[i + 1]];
}
total += cost[path[len - 1]][path[0]];
return total;
}
void copyPath(int *path1 int *path2 int len)
{
while (len>0)
{
path1[len - 1] = path2[len - 1];
len--;
}
}
/****************************************************/
//判断值在不在数组的start位到end位之间,在返回标号,不在-1;
int isInArray(int value int *s int start int end)
{
//printf(“vslue=%d start=%dend=%d\n“ valuestartend);
for (int i = start; i <= end; i++)
{
//printf(“s[%d] = %d\n“ is[i]);
if (s[i] == value)
{
//printf(“%d返回值:%d\n“ i s[i]);
return i;
}
}
return -1;
}
//两个个体交叉,产生两个新的个体的过程
void Cross(int *f1 int *f2 int *s1 int *s2 int start int end int len)
{
if (start >= end || end >= len)
{
return;
}
int jk;
for (int i = start; i <= end; i++)//交换start到end间的基因片段
{
s1[i] = f2[i];
s2[i] = f1[i];
}
/**
*理论上讲交叉过程应该保持其他部分不变化,但受制于本讨论问题中每一个城市
*是唯一的,并且要求出现并且只能出现在回路中一次,(出发节点两次)因此交换
*基因片段后必将影响其他部分,这里的工作就是在尽量保证不变的前提下,解决冲突
*本算法参考博客名为 xiaoning6p14 关于巡回旅行商问题的遗传算法路径交叉的思路
*进行编写,使用部分匹配交叉(PMX)详细算法地址为:
*http://blog.sina.com.cn/s/blog_5d7883db0100bl04.html
**/
for (int i = (end+1)%len; i != start; i++i%=len)
{
j = isInArray(f1[i] s1 start end);
if (j!=-1)
{
k = isInArray(f1[j] s1 start
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2013-12-10 18:12 GA_TSP\
目录 0 2013-12-04 15:47 GA_TSP\Debug\
文件 37376 2013-12-04 17:28 GA_TSP\Debug\GA_TSP.exe
文件 363452 2013-12-04 17:28 GA_TSP\Debug\GA_TSP.ilk
文件 510976 2013-12-04 17:28 GA_TSP\Debug\GA_TSP.pdb
目录 0 2013-12-04 17:28 GA_TSP\GA_TSP\
目录 0 2013-12-04 17:28 GA_TSP\GA_TSP\Debug\
文件 27857 2013-12-04 17:28 GA_TSP\GA_TSP\Debug\GA.obj
文件 1857 2013-12-04 17:28 GA_TSP\GA_TSP\Debug\GA_TSP.log
目录 0 2013-12-04 17:28 GA_TSP\GA_TSP\Debug\GA_TSP.tlog\
文件 3902 2013-12-04 17:28 GA_TSP\GA_TSP\Debug\GA_TSP.tlog\CL.read.1.tlog
文件 1670 2013-12-04 17:28 GA_TSP\GA_TSP\Debug\GA_TSP.tlog\CL.write.1.tlog
文件 171 2013-12-04 17:28 GA_TSP\GA_TSP\Debug\GA_TSP.tlog\GA_TSP.lastbuildstate
文件 1298 2013-12-04 17:28 GA_TSP\GA_TSP\Debug\GA_TSP.tlog\cl.command.1.tlog
文件 2442 2013-12-04 17:28 GA_TSP\GA_TSP\Debug\GA_TSP.tlog\li
文件 2660 2013-12-04 17:28 GA_TSP\GA_TSP\Debug\GA_TSP.tlog\li
文件 580 2013-12-04 17:28 GA_TSP\GA_TSP\Debug\GA_TSP.tlog\li
文件 4430 2013-12-04 17:13 GA_TSP\GA_TSP\Debug\QSort.obj
文件 60416 2013-12-04 17:28 GA_TSP\GA_TSP\Debug\vc120.idb
文件 86016 2013-12-04 17:28 GA_TSP\GA_TSP\Debug\vc120.pdb
文件 7929 2013-12-04 17:28 GA_TSP\GA_TSP\GA.cpp
文件 4188 2013-12-04 11:32 GA_TSP\GA_TSP\GA_TSP.vcxproj
文件 1150 2013-12-04 11:32 GA_TSP\GA_TSP\GA_TSP.vcxproj.filters
文件 796 2013-12-04 17:10 GA_TSP\GA_TSP\QSort.cpp
文件 369 2013-12-02 13:46 GA_TSP\GA_TSP\points.txt
文件 50 2013-12-04 13:14 GA_TSP\GA_TSP\qsort.h
文件 338 2013-12-10 18:09 GA_TSP\GA_TSP\result.txt
文件 2883584 2013-12-10 18:12 GA_TSP\GA_TSP.sdf
文件 964 2013-12-04 10:04 GA_TSP\GA_TSP.sln
文件 24064 2013-12-10 18:12 GA_TSP\GA_TSP.v12.suo
相关资源
- 模拟退火遗传算法的C++程序
- c++利用遗传算法求解函数优化问题
- 旅行商问题 最近插入法
- xcs 基于遗传算法的自动学习分类器系
- VC使用CStringArray类创建和使用字符串数
- 旅行商问题 C语言解法
- Gauss-Seidel 迭代和SOR迭代的通用c++程序
- Elgamal算法,加密算法,各算法比较
- 标准遗传算法c语言程序
- 遗传算法求函数最值(C语言实现)
- Sigar 使用详解
- 遗传算法C语言实现
- 遗传算法解决01背包问题
- C++实现的旅行商问题
- 标准CGAL库使用说明
- 遗传算法求解混合流水车间调度问题
- 遗传算法实现Rosenbrock函数的求解过程
- 遗传算法解决TSP问题 旅行商问题 程序
- NSGA2源代码,C++源代码
- 基于遗传算法的人工生命模拟 AL_GA.
- VegaPrime_MFC
- 人工智能旅行商问题实验报告及C++源
- N皇后C++源代码---回溯法、遗传算法、
- CRC32算法(FPGA和C语言)
- 遗传算法求解Rosenbrock最小值
- 四变量遗传算法求最小值程序C++
- 基于遗传算法的随机规划matlab
- 动态规划解TSP(旅行商)问题C++源码
- Gabor滤波器纹理特征提取
- NSGA多目标遗传算法
评论
共有 条评论