tsp问题求解

anjilabibi 2016-12-15 09:37:57
我用最临近法求解tsp问题但是结果出不来,求教。
...全文
298 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灸舞 版主 2016-12-16
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
anjilabibi 2016-12-15
  • 打赏
  • 举报
回复
程序贴上去了希望有大佬能给解决一下。
anjilabibi 2016-12-15
  • 打赏
  • 举报
回复
#include "stdafx.h" # include<time.h> # include<math.h> # include<stdio.h> # include<stdlib.h> # define Max 11 int cn, tt, start; // 要经过的城市个数,,起点 double arry1[Max][Max]; // 邻接矩阵,存放两两城市间的距离 double fn = 0, gn = 0, hn = 0; // 启发函数 double f1 = 0, g1 = 0, h1 = 0; int arry3[Max]; // 存放已历经的城市名 int arry4[Max]; // 标志位数组,cn个城市中已历经的置,未历经的置 // 定义顶点数据类型 struct Vertex { int x; int y; }City[Max]; /////////////////////////////////////////////////////////////////////////////////////////// // 主函数 void main() { void RandNum(int); void CityCoordinate(); double CityCost(int, int); void TSP(); double MaxLengh(); int i, j; CityCoordinate(); // 随机生成并显示个城市及其坐标 printf("\n"); printf("\n"); for (i = 1; i<Max; i++) // 随机生成并显示表示两城市间距离的邻接矩阵 { tt = 0; for (j = i; j<Max; j++, tt++) { if (i == j) arry1[i][j] = 0; else arry1[i][j] = CityCost(i, j); } } TSP(); // 用最小生成树查找最短路径 printf("\n从%d出发的最佳路径为:%d→", start, start); for (i = 2; i <= cn; i++) printf("%d→", arry3[i]); printf("%d\n", arry3[cn + 1]); printf("总路径长度为:%f\n", fn); } /////////////////////////////////////////////////////////////////////////////////////////// // 随机数产生器 int RandNum(int max) { int m; m = rand() % (max - 1) + 1; // 产生一个~20的随机数 return m; } // 生成并显示城市坐标 void CityCoordinate() { int i, j, hh = 0; srand((unsigned)time(NULL)); // 使用当前时间作为种子 City[1].x = RandNum(Max); // 生成并显示第个城市的坐标 City[1].y = RandNum(Max); printf("City[1]的坐标: (%d,%d); ", City[1].x, City[1].y); for (i = 2; i<Max; i++) // 生成第~10个城市的坐标 { City[i].x = RandNum(Max); City[i].y = RandNum(Max); for (j = 1; j<i; j++) // 检查重合坐标,有重合时重新生成 if (City[i].x == City[j].x&& City[i].y == City[j].y) i = i - 1; hh++; // 换行 if (0 != i % 2) hh = 0; if (0 == hh) printf("\n"); printf("City[%d]的坐标: (%d,%d); ", i, City[i].x, City[i].y);// 显示第i个城市的坐标 } } // 计算并显示城市间的欧式距离 double CityCost(int i, int j) { int x1, x2, y1, y2, hh = 0; double Distance, t; x1 = City[i].x; x2 = City[j].x; y1 = City[i].y; y2 = City[j].y; t = (x1 - x2)* (x1 - x2) + (y1 - y2)* (y1 - y2); Distance = sqrt(t); arry1[i][j] = Distance; hh++; if (0 != tt % 2) hh = 0; // 换行 if (0 == hh) printf("\n"); printf("%d与%d的距离:%3.2f ", i, j, Distance); return arry1[i][j]; } // 用最邻近法找最短路径 void TSP(){ int Mnode; // 起点,当前搜索层的父节点 int h, i, k, l, m, j; double min; int x, y = 0; int arry2[Max] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };;// 标志位数组,已历经的置0,未历经的置1 double temp1 = 100, temp2 = 100; printf("\n请输入要经过的城市个数:"); scanf_s("%d", &cn); printf("\n"); printf("请输入要历经的城市:\n"); for (h = 1; h <= cn; h++) // 输入历经节点 { scanf_s("%d", &x); if (0 == arry2[x]) arry2[x] = 1; // 避免重复 else if (1 == arry2[x]) h = h - 1; } printf("\n"); for (i = 1; i<Max; i++) // 显示历经节点 if (1 == arry2[i]) printf("%d ", i); printf("\n"); printf("请输入出发城市:"); // 输入出发点 scanf_s("%d", &start); printf("\n"); arry2[start] = 0; // 初始化 arry3[1] = start; arry3[cn + 1] = start; //首尾端点一致 Mnode = arry3[1]; ////////////////////////////////////////寻找最近的点 for (k = 1, l = 1; k < Max&&arry2[k] == 1; k = m){ for (j = 1; j < Max; j++){ if (arry2[j] == 1 && j != k) { min = arry1[k][j]; if (arry1[k][j] <= min){ min = arry1[k][j]; m = j; arry3[++l] = j; } } } fn += min; } }
基于并行人工免疫算法的大规模TSP问题求解-基于并行人工免疫算法的大规模TSP问题求解.pdf 摘 要:  为求解大规模TSP 问题,提出了并行人工免疫系统的塔式主从模型 ,和基于TMSM的并行免疫记忆克隆选择算法 . TMSM是粗粒度的两层并行人工免疫模型,其设计体现了分布式的免疫响应和免疫记忆机制. PIMCSA 用疫苗的迁移代替了抗体的迁移,兼顾了种群多样性的保持和算法的收敛速度. 与其他算法相比,PIMCSA 在求解精度和运行时间上都更具优势,而且问题规模越大优势越明显. TMSM很好地体现了免疫系统的特性,PIMCSA 是适合求解大规模复杂优化问题的并行人工免疫算法,具有良好的可扩展性. 关键词:  TSP; 并行人工免疫系统; 克隆选择; 免疫记忆 1  引言 旅行商问题 是经典的组合优化问题,具有很强的工程背景和广泛的应用价值. TSP 问题可以形式化描述为:已知N 个城市C = { C1 , C2 , ⋯, CN} , 以及任意两城市之间的距离d , 求一条经过C 中所有城市一次且仅一次的闭合路径Cx = { Cx , Cx , ⋯,Cx } 使得总行程最小 .对于大规模TSP 问题,人们倾向于用有限的时间找到可接受的近似解. 求解TSP 问题的近似算法分为环路构造算法和环路改进算法两类. 环路构造算法从某个非法解出发,逐步改变路径,直到得到一个合法路径为止.这类算法包括:最近邻算法,贪心算法,Clarke2Wright 算法,Christofides 算法等[1] . 环路改进算法则在给定初始合法解之后,使用某种策略寻找质量更好的解. 这类算法包括:局部搜索策略 ,禁忌搜索[1] ,模拟退火[1] ,遗传算法[3] ,蚁群算法[4] ,粒子群算法[5] ,多级算法[6 ,7] ,免疫算法[8]等. TSP 问题的解空间随着问题规模的增大而迅速膨胀,面对大规模TSP 问题庞大的搜索空间,单个计算机的计算能力已经远不能满足搜索算法对时间的要求. 并行算法求解大规模TSP 问题越来越受到研究者的关注,出现了并行蚁群算法[9 ,10]研究的一些成果,目前尚处于起步阶段. 本文工作尝试设计并行的免疫算法来解决这一复杂问题. ....... 后面主要是新提出的算法性能分析和仿真及结论,本文是2008年底新发表的,估计网上现在还不能下载,我是从学校论文数据库中下载的,以供需要者共享资源.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧