回溯法解旅行商问题java,回溯法解旅行商问题 | 学步园
第一次编写,格式写的比较混乱。先把源码上来吧。这个源码是模仿教材上的(本人学生一枚
)。分析过程在下面。
#include
using namespace std;
class Traveling{
private:
friend int TSP(int**,int*,int,int);
void backTrack(int i);
int city;
int* x;//当前旅行策略
int* bestx;//最优旅行策略
int** a;
int current_cost;//当前代价
int bestc;//存放最小代价值
int NoEdge;//不连通的标志,这里设为-1
};
void Traveling::backTrack(int i)
{
if(i==city){
if(a[x[city-1]][x[city]]!=NoEdge &&
a[x[city]][1]!=NoEdge &&
(current_cost+a[x[city-1]][x[city]]+a[x[city]][1]
{
bestc=current_cost+a[x[city-1]][x[city]]+a[x[city]][1];
for(int j=1;j<=city;j++)
bestx[j]=x[j];
}
}else{
for(int j=1;j<=city;j++)
if(a[x[i-1]][x[j]]!=NoEdge &&
(current_cost+a[x[i-1]][x[i]]
{
swap(x[i],x[j]);
current_cost+=a[x[i-1]][x[i]];
backTrack(i+1);
current_cost-=a[x[i-1]][x[i]];
swap(x[i],x[j]);
}
}
}
int TSP(int** a,int* bestPath,int city,int NoEdge)
{
Traveling Y;
Y.x=new int[city+1];
for(int i=1;i<=city;i++)
Y.x[i]=i;
Y.a=a;
Y.city=city;
Y.bestc=NoEdge;
Y.bestx=bestPath;
Y.current_cost=0;
Y.NoEdge=NoEdge;
Y.backTrack(2);
delete[] Y.x;
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
cout<
}
cout<
}
cout<
for(int i=1;i<=city;i++)
{
cout<
}
cout<
return Y.bestc;
}
void main()
{
int **map;
int * bestpath;
map = new int*[5];
for(int i=0;i<5;i++)
{
map[i] = new int[5];
}
int a[5][5]=
{0,1,2,3,4,
1,-1,30,6,4,
2,30,-1,5,10,
3,6,5,-1,20,
4,4,10,20,-1};
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
map[i][j] = a[i][j];
}
}
bestpath = new int[5];
memset(bestpath,0,sizeof(bestpath));
cout<
}
测试数据的临界矩阵:
0
1
2
3
4
1
0
30
6
4
2
30
0
5
10
3
6
5
0
20
4
4
10
20
0
一、回溯法解旅行商问题
(1) 问题重述
某销售员要到若干城市去推销商品,已知各城市之间的路线(或旅费)。他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线(即哈密顿回路),使总的路程(或总旅费)最小。给定一个有n个顶点V={1,2,……,n}的带权图G=(V,E),旅行商问题就是要在图G中找出一条有最小费用的周游路线(哈密顿回路,即经过V中每一个顶点的简单回路)。
(2)
旅行商问题的解空间是一颗排列树。对于排列树的回溯搜索与生成1,2,3,……,n的所有列的递归算法Perm类似。开始时x=[1,2,…,n],则相应的排列树由x[1:n]的所有排列构成。在backTrack函数中算法的主要流程可以归结如下:
① i=n 时,当前扩展结点是排列树的叶节点的父节点。此时算法检测图G是否存在一条从顶点x[n-1]到顶点x[n]的边和一条从顶点x[n]到顶点1的边。如果这两条边都存在,则找到一条回路。此时算法还需要判断这条回路的代价是否优于已找到的当前最优回路的代价。如果是则更新当前解。
② i
(3) 运行结果
旅行策略13241,最小旅行代价25
回溯法解旅行商问题java,回溯法解旅行商问题 | 学步园相关推荐
- otus阈值分割matlab,OSTU最佳阈值法二值化原理-matlab和C | 学步园
觉得这篇介绍OTSU方法挺清楚的.自己又加了一些,希望对初学者有帮助哦~ OTSU 1. OTSU算法原理简介 对于一幅图像,设当前景与背景的分割阈值为t时,前景点占图像比例为w0,均值为u0,背景点 ...
- 回溯法解旅行商问题java,回溯法-旅行商问题
一.问题描述 旅行推销员问题(英语:Travelling salesman problem, TSP)是这样一个问题:给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路 ...
- python解压打开文件过多_自动解压大量压缩文件 Python 脚本 | 学步园
之前写了一个自动解压压缩文件到压缩文件所在文件夹的脚本 后根据自己需要,写了另外两个.原理一样 都是使用winrar的命令 第一个脚本没考虑周到,只能解压rar文件 改进后可以支持winrar支持的各 ...
- matlab 分水岭法,分水岭算法Matlab实现——三种方法 | 学步园
clear,clc%三种方法进行分水岭分割 %读入图像 filename='sar1.bmp'; f=imread(filename); Info=imfinfo(filename); if Info ...
- java实现linux变量替换_linux java 配置 含环境变量 | 学步园
一般情况下,我们都要将linux自带的OPENJDK卸载掉,然后安装SUN的JDK. 首先查看Linux自带的JDK是否已安装. 输入如下命令,查看已经安装的JAVA版本信息. Linux代码 j ...
- java winrar_Java使用winrar解压缩 | 学步园
JAVA JDK中的解压缩似乎不能解压缩我们手工压缩的RAR文件,只能解压JDK中的API压缩的RAR 所以想出以下用WINRAR命令行方式的解压缩 package edu.nwpu.vcampus. ...
- java起名_java命名方法 | 学步园
Java命名方法 1.骆驼(Camel)命名法:第一个字母小写,随后的每个单词的第一个字母大写.如:studentName 2.帕斯卡(Pascal)命名法:每一个单词的第一个字母都大写.如:Stud ...
- java发布程序_发布java应用程序的步骤 | 学步园
一.使用命令行发布java应用程序 步骤: 1.打开命令行界面: 2.进入项目目录(class路径)[例如在eclipse中的bin文件夹下]. 3.压缩文件:命令为 jar -cvf des * ...
- java中system_《java中System类》 | 学步园
System类 System类是一个特殊类,它是一个公共最终类,不能被继承,也不能被实例化,即不能创建System类的对象.System类功能强大,与Runtime一起可以访问许多有用的系统功能.Sy ...
最新文章
- ##安装MySql数据库并解决如果安装出错卸载的注意事项
- 关于数据可视化入门,看这一篇够了
- ajaxfileupload 访问不到后台_一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目地址)...
- mysql之mysqldump命令
- 社区团购战国七雄出场了
- visual studio 删除附加项
- HDU1150Machine Schedule(二分图最大匹配的DFS解法)
- python yield详解
- 财务系统需求分析 用户分析 功能需求
- ESP8266与阿里云传数据
- 链表节点被删除时的资源释放
- sd内存卡 a1 a2 区别
- EMM系列1:EMM和ECM状态
- css3 transition属性造成文字抖动
- JAVA面试题大全,收藏这一篇就够了
- 华硕u4000u 重装window7 重装win7 重装window10 重装win10 重装系统 戴尔 联想 鸿基 重装系统远程协助
- k8s中配置namespace的最小和最大内存
- mysql 开源入门_入门教程:安装配置新版MySQL 8开源数据库
- [转帖]LCD与LED的区别之背光原理与优缺点对比介绍
- java iw_java知识回顾 - osc_iwr5mti2的个人空间 - OSCHINA - 中文开源技术交流社区