旅行商问题+背包问题--经典问题
问题描述:
旅行商问题(Traveling Salesman Problem,TSP)是旅行商要到若干个城市旅行,各城市之间的费用是已知的,为了节省费用,旅行商决定从所在城市出发,到每个城市旅行一次后返回初始城市,问他应选择什么样的路线才能使所走的总费用最短?此问题可描述如下:设G=(V,E)是一个具有边成本cij的有向图,cij的定义如下,对于所有的i和j,cij>0,若<i,j>不属于E,则cij=∞。令|V|=n,并假设n>1。 G的一条周游路线是包含V中每个结点的一个有向环,周游路线的成本是此路线上所有边的成本和。
- 旅行商问题(Traveling Saleman Problem,TSP)又译为旅行推销员问题、货郎担问题,简称为TSP问题,是最基本的路线问题,该问题是在寻求单一旅行者由起点出发,通过所有给定的需求点之后,最后再回到原点的最小路径成本。最早的旅行商问题的数学规划是由Dantzig(1959)等人提出。
- TSP问题在物流中的描述是对应一个物流配送公司,欲将n个客户的订货沿最短路线全部送到。如何确定最短路线。
TSP问题最简单的求解方法是枚举法。它的解是多维的、多局部极值的、趋于无穷大的复杂解的空间,搜索空间是n个点的所有排列的集合,大小为(n-1)。可以形象地把解空间看成是一个无穷大的丘陵地带,各山峰或山谷的高度即是问题的极值。求解TSP,则是在此不能穷尽的丘陵地带中攀登以达到山顶或谷底的过程。
问题分析
- 旅行商问题要从图G的所有周游路线中求取最小成本的周游路线,而从初始点出发的周游路线一共有(n-1)!条,即等于除初始结点外的n-1个结点的排列数,因此旅行商问题是一个排列问题。排列问题比子集合的选择问题通常要难于求解得多,这是因为n个物体有n!种排列。通过枚举(n-1)!条周游路线,从中找出一条具有最小成本的周游路线的算法,其计算时间显然为O(n!)。
旅行商问题的解法
旅行推销员的问题,我们称之为巡行(Tour),此种问题属于NP-Complete的问题,所以旅行商问题大多集中在启发式解法。Bodin(1983)等人将旅行推销员问题的启发式解法分成三种:
1、途程建构法(Tour Construction Procedures)
从距离矩阵中产生一个近似最佳解的途径,有以下几种解法:
1)最近邻点法(Nearest Neighbor Procedure):一开始以寻找离场站最近的需求点为起始路线的第一个顾客,此后寻找离最后加入路线的顾客最近的需求点,直到最后。
2)节省法(Clark and Wright Saving):以服务每一个节点为起始解,根据三角不等式两边之和大于第三边之性质,其起始状况为每服务一个顾客后便回场站,而后计算路线间合并节省量,将节省量以降序排序而依次合并路线,直到最后。
3)插入法(Insertion procedures):如最近插入法、最省插入法、随意插入法、最远插入法、最大角度插入法等。
2、途程改善法(Tour Improvement Procedure)
先给定一个可行途程,然后进行改善,一直到不能改善为止。有以下几种解法:
1)K-Opt(2/3 Opt):把尚未加入路径的K条节线暂时取代目前路径中K条节线,并计算其成本(或距离),如果成本降低(距离减少),则取代之,直到无法改善为止,K通常为2或3。
2)Or-Opt:在相同路径上相邻的需求点,将之和本身或其它路径交换且仍保持路径方向性,并计算其成本(或距离),如果成本降低(距离减少),则取代之,直到无法改善为止。
3、合成启发法(Composite Procedure)
先由途程建构法产生起始途程,然后再使用途程改善法去寻求最佳解,又称为两段解法(two phase method)。有以下几种解法:
1)起始解求解+2-Opt:以途程建构法建立一个起始的解,再用2-Opt的方式改善途程,直到不能改善为止。
2)起始解求解+3-Opt:以途程建构法建立一个起始的解,再用3-Opt的方式改善途程,直到不能改善为止。
背包问题
- 背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。
- 也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V?
题目
- 有N件物品和一个容量为V的背包。第i件物品的费用是c,价值是w。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
基本思路
- 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。
- 用子问题定义状态:即f[v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[v]=max{f[v],f[v-c]+w}。
- 这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”;如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c的背包中”,此时能获得的最大价值就是f [v-c]再加上通过放入第i件物品获得的价值w。
旅行商问题+背包问题--经典问题相关推荐
- 【人工智能算法】算法基础之离散优化[旅行商问题 背包问题]
本文重点: 离散VS连续 旅行商问题 背包问题 旅行商问题 旅行商问题(Traveling Salesman Problem, TSP)是一个难以用传统迭代算法求解的NP困难问题,因此经常用模拟退火算 ...
- 背包问题经典实现方法
背包问题里"背包"的英文是 knopsack ,其基本问题就假设有一个限定重量的背包,若干一定重量的物品,每个物品都有各自的价值, 现在要尽可能的向背包里装入若干物品,使得背包中物 ...
- Python数模笔记-模拟退火算法(4)旅行商问题
1.旅行商问题(Travelling salesman problem, TSP) 旅行商问题是经典的组合优化问题,要求找到遍历所有城市且每个城市只访问一次的最短旅行路线,即对给定的正权完全图求其总权 ...
- 2021年6月组会分享--算法竞赛入门及背包问题解析
一 竞赛简介 万恶之源 各种竞赛知识的汇总. 1. 赛制介绍 赛制介绍 2. 平台介绍 leetcode 主找工作,周赛/双周赛,每周都有,时间短,可查看别人的代码,学习别人的优秀代码和解题思路,成长 ...
- 一本通 1267:【例9.11】01背包问题
01背包问题 经典的01背包问题模板 这里提供两种做法: #include <iostream> #include <cstdio> using namespace std; ...
- 01型背包问题解题总结(二维)
前言:01型背包问题(一维)的链接: https://blog.csdn.net/qq_56430444/article/details/118157798 完全背包问题链接: https://blo ...
- labuladong的算法小抄pdf_真漂亮!这份GitHub上爆火的算法面试笔记,助你圆满大厂梦...
前言 Github作为程序员们的后花园,一直以来都是程序员最喜欢逛逛.学习的地方,小编也不例外,最近看到一份对标BAT等一线大厂的算法面试笔记,已经标星68+K了,很是惊讶,看了一下,觉得知识点整理得 ...
- 计算机设计大赛国奖作品_2. 报名材料
计算机设计大赛国奖作品_2. 报名材料 本系列是2021年中国大学生计算机设计大赛作品"环境监测无人机航线优化"的相关文档,获得2021年西北赛区一等奖,国赛三等奖.学生习作,只供 ...
- 计算机设计大赛国奖作品_3. 需求分析
计算机设计大赛国奖作品_3. 需求分析 本系列是2021年中国大学生计算机设计大赛作品"环境监测无人机航线优化"的相关文档,获得2021年西北赛区一等奖,国赛三等奖.学生习作,只供 ...
最新文章
- 本科理工男如何学习Linux
- oracle9I收缩表,Oracle 9i删除数据表(转)
- PHP反序列化漏洞总结
- 【计算机学科】最好的学校排名
- 考究Hadoop中split的计算方法
- ListView 两列多行实现
- Jquery一些常见性能的问题
- 浅谈项目管理中的四要素
- eclipse怎么升级到java ee,如何为Java EE开发人员升级Eclipse?
- Java 获取集合元素的值
- C#网络编程(基本概念和操作) - Part.1[转自JimmyZhang博客]
- java多线程thread使用_Java多线程——thread及runnable的基本使用及交替执行
- 模拟恶劣网络环境常用的几种解决方案
- showModalDialog和showModelessDialog使用心得*转*
- 学Python必看,Python中encode(),decode()的本质
- 简单计算器——两种方法
- 单片机交通灯灯c语言程序,51单片机控制交通灯原理图及C语言程序
- 一文教你如何挑选深度学习GPU
- 六下计算机教学总结,六年级下册信息技术教学工作总结
- mac 不显示 外接屏幕_教大家Mac外接显示器设置教程