uva 116 - Unidirectional TSP(精心设计的测试数据)

TSP_旅行商问题 - 蛮力法DFS(一) 本文基于蛮力法(此处采用深度优先遍历,DFS)解决旅行商问题。通过遍历出所有满足条件的路径情况,并保持更新最优解,直到所有情况都遍历完,得到全局最优解。但是,使用蛮力法需要遍历的城市个数高达city_num的阶乘,当city_num=12的时候,需遍历479001600种情况,程序所需时间以小时为单位。 阅读详情

题目

题目大意是说,一个数字矩阵,从第1列到最后一列,一步可以往右走、右上走、右下走。路权为这条路径上的数字之和。输出最小路权及字典序最小的路径。

这题的一大亮点是,如果采用遍历每条路径从而获得字典序最小的路径的话,必然会超时;或者要加上剪枝才能通过检测,但是我没有找到强有力的剪枝。求神牛指点。

正确的做法是从后往前转移状态,假如当前往右、右上、右下都一样最优,则选择右上,每一步都这样做,必定是字典序最小的路径。记录在当前位置做出的选择。

AC:

#include<cstdio>
#include<cstring>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#include<ctime>
#include<iostream>
#define INF 1<<30
using namespace std;
const int maxm=10+10;
const int maxn=100+10;
typedef int G[maxm][maxn];
G a,way,f;

int main()
{
#ifndef ONLINE_JUDGE
  freopen("in1.txt","r",stdin);
#endif
	int i,j;
	int m,n;
	while(scanf("%d%d",&m,&n)==2)
	{
		for(i=1;i<=m;i++)
		  for(j=1;j<=n;j++)
		    scanf("%d",&a[i][j]);//mistook:a[m][n]
    for(i=1;i<=m;i++) f[i][n]=a[i][n];
    for(j=n-1;j>=1;j--)
    	for(i=1;i<=m;i++)
    	{
	    	int &ans=f[i][j];
	    	ans=INF;
	    	for(int k=-1;k<=1;k++)
	    	{
	    		int p=(i+k-1+m)%m+1;
	    		if(f[p][j+1]<ans)
	    		{
		    		ans=f[p][j+1];
		    		way[i][j]=p;
		    	}else if(f[p][j+1]==ans && p<way[i][j])
		    	{
	    			way[i][j]=p;
	    		}
	    	}
	    	ans+=a[i][j];
	    }
    int mm,ans=INF;
    for(i=1;i<=m;i++)
    	if(f[i][1]<ans)
    	{
	    	ans=f[i][1];
				mm=i;
	    }
    printf("%d",mm);
    int x=mm,y=1;
    while(y<n)
    {
    	x=way[x][y];
    	printf(" %d",x);
    	y++;
    }
    printf("\n%d\n",ans);
	}
	//printf("%.2lf\n",(double)clock()/CLOCKS_PER_SEC);
  return 0;
}

/*
*/
非正确程序,卡时返回,不能通过,数据太强:

#include<cstdio>
#include<cstring>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#include<ctime>
#include<iostream>
#define INF 1<<30
using namespace std;
const int maxn=100+10;
const int maxm=10+10;
const int maxTimes=10000;
bool vis[maxm][maxn];
int f[maxm][maxn];
int a[maxm][maxn];
int m,n;
int dp(int i,int j)
{
	int &ans=f[i][j];
	if(vis[i][j]) return ans;
	vis[i][j]=true;
	if(j==1) return ans=a[i][j];
	ans=INF;
	for(int k=-1;k<=1;k++)
	  ans=min(ans,dp((i+k-1+m)%m+1,j-1));
 	ans+=a[i][j];
 	return ans;
}

int bestPath[maxn],path[maxn];
bool first;
int times;
bool findPath(int i,int j)
{
	int k;
	if(j==0)
	{
		if(first)
		{
			memcpy(bestPath,path,sizeof(bestPath));
			first=false;
		}else 
		{
			for(k=1;k<=n;k++)
			  if(path[k]!=bestPath[k])
					break;
			if(path[k]<bestPath[k])
			  memcpy(bestPath,path,sizeof(bestPath));
		}
		if(++times>maxTimes) return true;
		return false;
	}
	path[j]=i;
	for(k=-1;k<=1;k++)
	{
		int p=(i+k-1+m)%m+1;
		if(f[i][j]==f[p][j-1]+a[i][j])
	  {
  		if(findPath(p,j-1)) return true;
  	}
	}
	return false;
}

int main()
{
#ifndef ONLINE_JUDGE
  freopen("in.txt","r",stdin);
#endif
	int i,j;
	while(scanf("%d%d",&m,&n)==2)
	{
		for(i=1;i<=m;i++)
		  for(j=1;j<=n;j++)
		    scanf("%d",&a[i][j]);
    memset(vis,0,sizeof(vis));
    memset(f,0,sizeof(f));
    for(i=1;i<=m;i++) dp(i,n);
    int A[n],An;
    int ans=INF;
    for(i=1;i<=m;i++) 
      if(f[i][n]<=ans)
      {
      	if(f[i][n]<ans) 
      	{
	      	An=0;
	      	ans=f[i][n];
	      }
      	A[An++]=i;
      }
    first=true;
    for(i=0;i<An;i++)  
    {
    	times=0;
    	findPath(A[i],n);
    }
    printf("%d",bestPath[1]);
    for(i=2;i<=n;i++) printf(" %d",bestPath[i]);
    printf("\n%d\n",ans);
	}
	//printf("%.2lf\n",(double)clock()/CLOCKS_PER_SEC);
  return 0;
}

/*
*/


遗传算法解决旅行商问题(TSP) 旅行商问题(TSP). 一个商人欲从自己所在的城市出发,到若干个城市推销商品,然后回到其所在的城市。如何选择一条周游路线,使得商人经过每个城市一次且仅一次后回到起点,并使他所走过的路径最短?TSP 即Travelling Salesman Problem. 中文翻译过来就是旅行商问题。旅行商问题是一个典型的NP难问题。NP指的是Non-deterministic Polynomial,即多项式复杂程度的非确定性问题。由于该问题的组合特性,旅行商问题已成为测试新算法的标准问题,如模拟退火、神经网络和演化算法等 阅读详情

相关推荐

旅行商问题(TSP)常用数据集

文章目录一、数据集1、burma142、bayg293、att484、eil51、eil101、eil5355、Oliver306、st707、pr76、pr2268、gr969、ch130、ch15010、pcb442二、下载地址 一、数据集 1、burma14 城市分布如图1所示。 图1 burma14分布 2、bayg29 城市分布如图2所示。 图2 bayg29分布 3、att48 城市分布如图3所示。 图3 att48分布 4、eil51、eil101、eil535 城市分布如图4~6所示。 图4

心升明月的博客 1万+

关于旅行商问题的多种算法求解

通过旅行商问题来了解三个算法的区别

weixin_58351753的博客 1万+

[数据结构 & 算法] 遗传算法解决旅行商问题(TSP)(实验课)

问题描述 在旅行商问题中,给定一组城市及每座城市与其他城市之间的旅行成本,目标是找出一条经过所有城市的路径,要求该路径只经过每座城市一次并且旅行总成本最低。从任意一座城市出发,经过每一座城市之后,再回到出发城市结束旅行。 课上给的距离矩阵,可能是疏忽9到3和3到9的距离不一致,但这不妨碍程序设计 代码部分 #include&lt;iostream&gt; #include&lt...

专注于计算机视觉与计算机图形学 5753

运筹系列60:TSP问题数据

1. 2-opt方法 2-opt本质是一个边交换启发式算法,非常简单。首先用myopic的方式生成一条路线,然后逐点使用2-opt算法进行优化。 我们使用kaggle上的一个数据,https://www.kaggle.com/jsaguiar/fast-2-opt-with-cython/notebook?select=cities.csv,5000个点。 1.1 基础版本 import numpy as np import pandas as pd cities = pd.read_csv("/Users

kittyzc的博客 7355

实验九 TSP问题

原因分析:动态规划算法的时间复杂度为O(n),分治算法的时间复杂度为O(nlogn),而蛮力算法的时间复杂度为O(2n),因此随着问题规模的增加,最终的运行时间总会呈现:动态规划时间最短,分治算法的时间次之,蛮力算法的时间最长。③d(1,{2,3}),d(2,{1,3}),d(3,{1,2})同样也不是一步就能求出来的,它们的解一样需要有依赖,就比如说d(1,{2,3})①我们要求的最终结果是d(0,{1,2,3}),它表示,从城市0开始,经过{1,2,3}之中的城市并且只有一次,求出最短路径.

popoywei的博客 1463

旅行商问题(TSP)(4)(Lab_test.py)(TSP 项目的测试验证体系)

该文章介绍了一个完整的旅行商问题(TSP)测试方案,主要包含以下内容: 测试框架采用分层验证: 先测试基础类(Point和Route) 再测试两种启发式算法(最近邻和最近插入) 测试用例设计: 简单"5点用例":手动计算预期结果,便于调试 复杂"美国首府用例":验证算法在大规模数据下的表现 核心功能: 结果对比功能:自动比较预期和实际结果 可视化输出:生成路径PDF图 异常处理:文件缺失时的容错机制 测试控制: 通过TEST_NI全局变量一键切换测试算法 使用深拷贝保

StarPrayers.的博客 801

Uva 116 Unidirectional TSP (DP_记忆化搜索)

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=52 题目大意:给定一个n*m的矩阵,问从第一列走到最后一列经过的最小路径长度,方向有三个:右上,右,右下,第一行和最后一行是连通。在输出最小路径的同时输出经过

1202

蚁群算法:TSP测试数据集的应用与分析

蚁群算法,作为启发式算法的一种,其灵感来源于自然界中蚂蚁觅食的行为。蚂蚁在寻找食物源和回巢的过程中,能够以一种群体智能的方式找到最短路径。这一行为背后的原理是蚂蚁会释放一种叫做信息素的化学物质,其他蚂蚁会根据信息素的浓度来选择路径。信息素浓度越高的路径,后续的蚂蚁越可能选择,从而形成一种正反馈机制。TSP(Travelling Salesman Problem)问题,即旅行商问题,是一种经典的组合优化问题。

weixin_36231030的博客 1144

【TSP数据集】用于 加载ATSP和TSP 测试样例的python加载器【使用所有类型数据】【使用数据给出方法计算邻接矩阵和邻接表】

class TSP_DATA: '''用于读取数据、存放图的数据结构 类内变量: 必有: self.NAME 测试样例名称 self.TYPE 测试样例类型 TSP ATSP self.DIMENSION. 维度 self.EDGE_WEIGHT_TYPE 边权值计算方式 决定读取方式 self.matrix 矩阵形式数据 self.table .

prinTao的博客 1691

(TSP)旅行商问题经典数据集 50+经典数据集

用于验证算法的有效性

遗传算法解决旅行商问题(附标准测试数据)

传统遗传算法解决旅行商问题,附带标准测试用例及样例的已知最优解,算法结果与已知最优解相差不大

算法 |【实验5.2】1-深度优先搜索暴力求解旅行商问题

商品推销员要去n个城市推销商品,城市从1至n编号,任意两个城市间有一定距离,该推销员从城市1出发,需要经过所有城市并回到城市1,求最短总路径长度。

成长之路 1941

TSP问题测试数据和最优结果(含100多组数据)

对于编写的TSP问题优化算法,随机产生的数据的最优解是未知的。这里给出100多组TSP问题测试数据,并且提供了对应的最优结果。

TSP问题数据集

共102组数据 涵盖了从131个点到744710个点的数据。从29个城市的西撒哈拉,到71009个城市的中国。

深巷 1566

旅行商(TSP)问题测试集

旅行商(TSP)问题测试集,可用于测试蚁群算法\遗传算法性能

蚁群算法中使用的tsp测试数据集

TSP数据集是用来对自己所写的蚁群算法进行测试的原始数据,使用这些标准数据来进行测试有利于与别人的算法进行性能比较

【计算机算法】回溯——子集和问题、旅行商问题

求集合中满足一个值的子集和 测试数据: 4 31 13 24 11 7 结果: {13,11,7} {24,7} #include<iostream> using namespace std; int *x,*y; int size,sum; void output(){ int count = 0;//计算子集中的个数,这个只是用来控制是否输出逗号的情况 int tempsum = 0; for(int i = 1;i <= size;i++){ if(y[i] !

passer__jw767的博客 499

多仓智能订单路由与动态优化方案设计

现在有很多商家会有多个仓库,并分布在不同的城市中,当用户下单后会根据商品库存及订单信息将订单分配到对应的仓库进行发货,如就近原则,本期基于多仓库设计一套订单路由方案,包含核心逻辑、规则优先级和实施方案,适用于多仓协同的订单自动分配场景

14年产品经理老兵,想把自己的经验及总结分享给大家,只讲思路及实操,不讲废话 2481

UVA11624 Fire! -- bfs

传送门: luogu 题目大意:  你的任务是帮助Joe走出一个大火蔓延的迷宫。Joe每分钟可以走到上下左右4个方向的相邻格子之一,而所有着火的格子都会四周蔓延(即如果某个空格子与着火格子有公共边,则下一分钟这个空格子将着火)。迷宫中有一些障碍格,Joe和火都无法进入。当Joe走到一个迷宫的边界格子时,我们认为他已经出了迷宫。  输入数据 第一行为数据组数T。每一组测试数据格式如下: 第一...

笑面蘑菇的博客 219

解放双手:用KUKA示教器白键一键触发复杂工艺,自定义你的快捷指令

本文详细介绍了如何利用KUKA示教器的工艺白键功能,通过自定义快捷指令一键触发复杂工艺,显著提升自动化产线效率。文章涵盖UserTech技术栈解析、KRL脚本封装、人机交互视觉工程及工业实战策略,帮助工程师实现机械臂操作的高阶优化。

weixin_30379531的博客 432

RK3568/RK3588之修改8250驱动实现RS485收发的自动切换

在串口发送前,若为485,则将控制引脚拉为发送状态,在发送后,循环查看是否发送完成,若发送完成则将引脚置回读状态,如此一来,就能实现在内核测控制方向切换,而不会因为延时造成数据丢失,经过测试此办法可行。全部修改完成后,重新编译生成内核文件和设备树文件,烧写到板子上即可。

哒宰的博客 3114
上一篇: uva 10003 - Cutting Sticks 动态规划
下一篇: 专心高考,用学oi修成的学习能力虐高考
lzw_java
博客等级 码龄15年 49粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值