旅行商问题

欧几里得旅行商问题

ぐ巨炮叔叔 提交于 2020-01-24 10:14:53
注:本文转载自网络,笔者略有改动,感谢作者整理。 欧几里得旅行商问题,又叫货郎问题(Traveling Salesman Problem,简称“TSP”)也叫货郎担问题,中国邮路问题,旅行商问题等,是计算机算法理论历史上的经典问题。在过去几十年中,它成为许多重要算法思想的测试平台,同时也促使一些新的理论领域的产生,比如多面体理论和复杂性理论。 货郎问题:给定n个结点和任意一对结点{i,j}之间的距离为dist(i,j),要求找出一条闭合的回路,该回路经过每个结点一次且仅一次,并且该回路的费用最小,这里的费用是指每段路径的距离和。 货郎问题求解其精确解是NP难的,并且求解任意常数因子近以度的解也是NP难的。若将问题限定在欧氏平面上,就成为欧氏平面上的货郎问题,也叫欧几里德旅行商问题(Eculid Traveling Salesman Problem)。但是,即使是欧氏平面上的货郎问题也是NP难的。因此通常用来解决TSP问题的解法都是近似算法。其中第一个欧几里德旅行商问题的多项式近似算法是Arora在1996年使用随机平面分割和动态规划方法给出的。 J.L. Bentley 建议通过只考虑双调旅程(bitonic tour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。事实上,存在确定的最优双调路线的O(n*n)时间的算法。 1 /***

基于遗传算法的旅行商问题

懵懂的女人 提交于 2020-01-11 02:45:52
旅行商问题(Travelling salesman problem, TSP): 一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。应如何选择行进路线,以使总的行程最短。 遗传算法(Genetic Algorithm): 模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,通过模拟自然进化过程搜索最优解。遗传算法是从一组候选解构成的一个种群(population)开始的,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择个体,并借助于的遗传算子进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。这个过程将导致种群按照自然进化一样产生后生代种群,并且更适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解。 如图所示,在遗传算法中,一共有如下几个步骤: 初始化:设置进化代数计数器 t=0、设置最大进化代数 T、交叉概率、变 异概率、随机生成 M 个个体作为初始种群 P 个体评价:计算种群 P 中各个个体的适应度 选择运算:将选择算子作用于群体。以个体适应度为基础,选择最优个体 直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代 交叉运算

基于遗传算法的旅行商问题

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-05 00:52:30
一、问题描述: 旅行商问题:设有n个城市和距离矩阵D=[dij],其中dij表示 城市i到城市j的距离,i,j=1,2 … n,则问题是要找出遍访每个城市恰好一次的一条回路并使其路径长度为最短。 二、实验目的: 在同一组数据中,观察种群数量和参数不一样的情况对实验结果的总结。 三、程序流程 1、根据输入的城市初始化基因序列; 2、计算每个基因序列的适应性,适应性与路径长度成反比(这里我使用路径长度的倒数表示个体适应性); 3、根据个体适应性选择生存下来的个体,也就是根据阈值选择留下来的个体; 4、选择后,个体数小于种群初始个体数,使用轮盘选择方式选择父本; 5、若是选中的父本既定概率大于交叉概率,则直接保留下来,否则通过交叉产生后代 6、后代进行基因突变操作,也就是交换两个节点值; 7、判断是否达到迭代次数,是,结束,返回最优解;否,转到第2步。 初始参数数据: 适应度函数: 选择: 变异: 交叉: 初始运行: 四、实验结论: 主要参数: 种群规模、城市数量、最大运行代数、交叉概率、变异概率 1、种群规模对结果的影响 不变参数 变参:种群数量 种群数量M=50: 种群数量M=200: 结论:上述情况下,当种群规模大于等于30的时候算法基本能得到正确解,达到40算法能100%得到最短路径,但是最佳路径出现代数并不稳定,种群数量越小收敛越快。 2、最大运行代数对结果的影响 不变参数

旅行商问题简化版模型

天涯浪子 提交于 2019-12-02 15:46:47
学到了,我得到了一个线性动态规划的模型。 以防万一,我还是先把旅行商问题简化版的题意简要说明一下。 原本的旅行商问题是在一圈城市之间找到最短回路访问各城市有且仅有一次。现在添加了限制:对于每个城市,所有标号比该城市小的城市要么全部访问过要不全部没有访问。这样我们对于整体的访问队列能够得到一个抽象的双向队列。 首先添加1,1是固定的。 1 然后添加2,2的位置可以在1前面也可以在1后面。 1 2 2 1 这两种情况都是合法的,然后我们添加3,3的位置也可以在队列的前面或者后面但是不能在队列中间。 3 1 2 1 2 3 3 2 1 2 1 3 在n等于3的情况下有且只有这4种合法情况。对于接下来的压入行为,对状态有影响的只有队列两端的元素。所以我们定义状态为( i , j ),表示队列两段分别为i和j且i是当前队列中最大的元素时最小的花费,始终保持i大于j。(第二种情况和第三种情况是等效的)于是我们得到状态转移方程。 dp[i+1][j]=min(dp[i+1][j],dp[i][j]+dis[i+1][i]); dp[i+1][i]=min(dp[i+1][i],dp[i][j]+dis[i+1][j]); 规模为n的问题实际上只用n-1个有效可行解。 然后对于最后求解,我们在 dp[n][i](i<n) 中求最小值即可。 来源: https://www.cnblogs.com

旅行商问题的动态规划解法

二次信任 提交于 2019-12-01 18:25:38
一个售货员必须访问n个城市,这n个城市是一个完全图,售货员需要恰好访问所有城市的一次,并且回到最终的城市。 城市与城市之间有一个旅行费用,售货员希望旅行费用之和最少。 旅行商问题是np问题,一般可以使用回溯法或者动态规划解决。 class Solution: def __init__(self, X, start_node): self.X = X self.start_node = start_node self.array = [[0] * (2 ** (len(self.X) - 1)) for i in range(len(self.X))] def transfer(self, sets): su = 0 for s in sets: su = su + 2 ** (s - 1) return su def tsp(self): s = self.start_node num = len(self.X) cities = list(range(num)) cities.pop(cities.index(s)) node = s return self.solve(node, cities) def solve(self, node, future_sets): if len(future_sets) == 0: return self.X[node][self.start

IPUOJ24101旅行商问题(状压dp)

痞子三分冷 提交于 2019-11-30 16:47:53
题目↓ (建议全屏看图) 常规状压,集合思想;挺简单的 具体看代码吧 #include<bits/stdc++.h> using namespace std; #define fr(g,h) for(int g = 0; g < h; g++) const int N = 25, M = 2100000; int n,nn,mm,a[N][N],f[N][M]; inline void init () { scanf("%d",&n); fr(i,n) fr(j,n) cin >> a[i][j]; memset(f, 0x3f, sizeof f); } void floyd() { fr(k,n) fr(i,n) fr(j,n) a[i][j] = min(a[i][j], a[i][k] + a[k][j]); } void dp() { for(int s = 1; s <= (1 << n) - 1; s++) //从第一个开始走过 (这个地方s的优化还是蛮重要的,暴力开210万只能险过) fr(i,n) fr(j,n) if(s & (1 << j)) f[i][s|(1<<i)] = min(f[i][s|(1<<i)], f[j][s] + a[i][j]); } int main() { init(); f[0][1] = 0; floyd(); dp();

算法设计

不羁的心 提交于 2019-11-27 03:55:47
一、分治法 递归,找最大值最小值,整数相乘,归并排序,快速排序,线性时间选择,最近点对问题 二、动态规划   0-1背包问题 ,矩阵相乘问题,装配线调度问题,最长公共子序列,最优二分检索树,凸多边形最优三角剖分 三、贪心法   背包问题,活动选择问题,哈夫曼编码,最小生成树算法(Kruskal 和 Prim) 四、回溯法   n皇后问题,子集和数问题,0-1背包问题,旅行商问题,着色问题 五、图算法   图的表示,广度优先搜索,Dijkstra算法 来源: https://www.cnblogs.com/eaglezb/p/11343106.html