❶ 近似算法的旅行售货员问题近似算法
问题描述:给定一个完全无向图G=(V,E),其每一边(u,v)∈E有一非负整数费用c(u,v)。要找出G的最小费用哈密顿回路。
旅行售货员问题的一些特殊性质:
比如,费用函数c往往具有三角不等式性质,即对任意的3个顶点u,v,w∈V,有:c(u,w)≤c(u,v)+c(v,w)。当图G中的顶点就是平面上的点,任意2顶点间的费用就是这2点间的欧氏距离时,费用函数c就具有三角不等式性质。
对于给定的无向图G,可以利用找图G的最小生成树的算法设计找近似最优的旅行售货员回路的算法。
void approxTSP (Graph g)
{
(1)选择g的任一顶点r;
(2)用Prim算法找出带权图g的一棵以r为根的最小生成树T;
(3)前序遍历树T得到的顶点表L;
(4)将r加到表L的末尾,按表L中顶点次序组成回路H,作为计 算结果返回;
}
当费用函数满足三角不等式时,算法找出的旅行售货员回路的费用不会超过最优旅行售货员回路费用的2倍。
(b)表示找到的最小生成树T;(c)表示对T作前序遍历的次序;(d)表示L产生的哈密顿回路H;
(e)是G的一个最小费用旅行售货员回路。
❷ NP问题的简述
首先需要介绍P(Polynomial,多项式)问题.P问题是可以在多项式时间内被确定机(通常意义的计算机)解决的问题.NP(Non-Deterministic Polynomial, 非确定多项式)问题,是指可以在多项式时间内被非确定机(他可以猜,他总是能猜到最能满足你需要的那种选择,如果你让他解决n皇后问题,他只要猜n次就能完成----每次都是那么幸运)解决的问题.这里有一个着名的问题----千禧难题之首,是说P问题是否等于NP问题,也即是否所有在非确定机上多项式可解的问题都能在确定机上用多项式时间求解.
这样一来,只要我们找到一个NPC问题的多项式解,所有的NP问题都可以多项式时间内划归成这个NPC问题,再用多项式时间解决,这样NP就等于P了.
换一种说法,如果一个问题的复杂度是该问题的一个实例规模n的多项式函数,则这种可以在多项式时间内解决的问题属于P类问题.通俗地称所有复杂度为多项式时间的问题为易解的问题类,否则为难解的问题。
有些问题很难找到多项式时间的算法(或许根本不存在),例如“找出无向图中哈密顿回路”问题。但如果给了该问题的一个答案,可以在多项式时间内判断这个答案是否正确。例如说对于哈密顿回路问题,给一个任意的回路,很容易判断它是否是哈密顿回路(只要看是不是所有的顶点都在回路中就可以了)。这里给出NP问题的另一个定义,这种可以在多项式时间内验证一个解是否正确的问题称为NP问题,亦称为验证问题类。
简单的说,存在多项式时间的算法的一类问题,称之为P类问题;在多项式时间内可由非确定机解决的一类问题,称之为NP问题。另外,很多人相信P类问题是NP问题的一个子集,但既没有人证明出有某个问题属于NP但不属于P,也没有人证明所有NP问题都能在多项式时间内有解。
❸ matlab最短哈密顿回路算法
可以用蚁群算法,当然Hopfield网络与退火我也试过,但还是蚁群的效果最好.
注意:哈密顿回路问题(TSP问题)是NP-COMPLETE问题,问题规模比较大时无法求得最优解,只能通过启发式算法逼近其次优解.
把你的邮箱留下来吧.我这有一份C++写的,不过封装成MEX了,MATLAB里可以直接调用的,速度还不错.纯MATLAB的我也有,不过速度慢死.要不然我就不费事用C++重写一份了.
留邮箱吧.
❹ hamilton圈算法是什么意思
哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。在图论中是指含有哈密顿回路的图,闭合的哈密顿路径称作哈密顿回路(Hamiltonian cycle),含有图中所有顶点的路径称作哈密顿路径。
从图中的任意一点出发,路途中经过图中每一个结点当且仅当一次,则成为哈密顿回路。
要满足两个条件:
⒈封闭的环
⒉是一个连通图,且图中任意两点可达
经过图(有向图或无向图)中所有顶点一次且仅一次的通路称为哈密顿通路。
经过图中所有顶点一次且仅一次的回路称为哈密顿回路。
具有哈密顿回路的图称为哈密顿图,具有哈密顿通路但不具有哈密顿回路的图称为半哈密顿图。
平凡图是哈密顿图。
❺ 数据结构——图graph(基础概念)
【各种东拼西凑来的】
图(Graph)是由顶点和连接顶点的边构成的离散结构。在计算机科学中,图是最灵活的数据结构之一,很多问题都可以使用图模型进行建模求解。例如:生态环境中不同物种的相互竞争、人与人之间的社交与关系网络、化学上用图区分结构不同但分子式相同的同分异构体、分析计算机网络的拓扑结构确定两台计算机是否可以通信、找到两个城市之间的最短路径等等。
图的结构很简单,就是由顶点$V$集和边$E$集构成,因此图可以表示成$G=(V, E)$。
注意: 顶点有时也称为节点或者交点,边有时也称为链接。
无向图
我们可以说这张图中,有点集$V=\{1, 2, 3, 4, 5, 6\}$,边集$E=\{(1, 2), (1, 5), (2, 3), (2, 5), (3, 4), (4, 5), (4, 6)\}$。在无向图中,边$(u, v)$和边$(v, u)$是一样的,因此只要记录一个就行了。简而言之,对称。
有向图
也很好理解,就是加上了方向性,顶点$(u, v)$之间的关系和顶点$(v,u)$之间的关系不同,后者或许不存在。例如,地图应用中必须存储单行道的信息,避免给出错误的方向。
加权图 :
权:与图的边或弧相关的数叫做权。
与加权图对应的就是无权图,或叫等权图。如果一张图不含权重信息,我们就认为边与边之间没有差别。不过,具体建模的时候,很多时候都需要有权重,比如对中国重要城市间道路联系的建模,总不能认为从北京去上海和从北京去广州一样远(等权)。
还有很多细化的概念,比如:无向图中,任意两个顶点间都有边,称为 无向完全图 ;加权图起一个新名字,叫 网(network) ……然而,如无必要,毋增实体。
邻接(adjacency) :邻接是 两个顶点之间 的一种关系。如果图包含$(u,v)$,则称顶点$v$与顶点$u$邻接。当然,在无向图中,这也意味着顶点$u$与顶点$v$邻接。
关联(incidence) :关联是 边和顶点之间 的关系。在有向图中,边$(u,v)$从顶点$u$开始关联到$v$,或者相反,从$v$关联到$u$。注意,有向图中,边不一定是对称的,有去无回是完全有可能的。细化这个概念,就有了顶点的 入度(in-degree) 和 出度(out-degree) 。无向图中,顶点的度就是与顶点相关联的边的数目,没有入度和出度。在有向图中,我们以图1-2为例,顶点10有2个入度,$3\rightarrow10$,$11\rightarrow10$,但是没有从10指向其它顶点的边,因此顶点10的出度为0。
路径(path) :依次遍历顶点序列之间的边所形成的轨迹。注意,依次就意味着有序,先1后2和先2后1不一样。
简单路径 : 没有重复顶点的路径称为简单路径。说白了,这一趟路里没有出现绕了一圈回到同一点的情况,也就是没有 环 。
环/回路 :包含相同的顶点两次或者两次以上。图1-3中的顶点序列$<1,2,4,3,1>$,1出现了两次,当然还有其它的环,比如$<1,4,3,1>$。
简单回路/简单环: 除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路
无环图 :没有环的图,其中, 有向无环图 有特殊的名称,叫做 DAG(Directed Acyline Graph) (最好记住,DAG具有一些很好性质,比如很多动态规划的问题都可以转化成DAG中的最长路径、最短路径或者路径计数的问题)。
两个连通分支:
连通的 :无向图中每一对不同的顶点之间都有路径。如果这个条件在有向图里也成立,那么就是 强连通 的。
连通分量 :无向图中的极大连通子图。
两点强连通:在有向图G中,如果两点互相可达
强连通图: 如果有向图G的每两个顶点都强连通(任意两点互相可达),称G是一个 强连通图 。
强连通分量: 非强连通有向图的极大强连通子图,称为强连通 分量 (strongly connected components)。
关节点(割点) :某些特定的顶点对于保持图或连通分支的连通性有特殊的重要意义。如果 移除某个顶点 将使图或者分支 失去连通性 ,则称该顶点为 关节点 。(在某图中,若删除顶点V以及V相关的边后,图的一个连通分量分割为两个或两个以上的连通分量,则称顶点V为该图的一个关节点)。
桥(割边) :和关节点类似,删除一条边,就产生比原图更多的连通分支的子图,这条边就称为 割边 或者 桥 。
双连通图 :在无向连通图中,如果删除该图的任何一个结点都不能改变该图的连通性,则该图为双连通的无向图。个人理解就是一个双连通图没有割点,没有桥的图。
1.2 一些有趣的图概念
这一部分属于图论的内容,基础图算法不会用到,但是我觉得挺有意思的,小记如下。【这部分我没看,照搬过来了】
同构 4 :图看起来结构不一样,但它是一样的。假定有$G_1$和$G_2$,那么你只要确认对于$G_1$中的所有的两个 相邻点 $a$和$b$,可以通过某种方式$f$映射到$G_2$,映射后的两个点$f(a)$、$f(b)$也是相邻的。换句话说,当两个简单图同构时,两个图的顶点之间保持相邻关系的一一对应。
图1-7就展示了图的同构,这里顶点个数很少判断图的同构很简单。我们可以把v1看成u1,自然我们会把u3看出v3。用数学的语言就是$f(u_1)=v_1$,$f(u_3)=v_3$。u1的另外一个连接是到u2,v1的另外一个连接是到v4,不难从相邻顶点的关系验证$f(u_2)=v_4$,$f(u_4)=v_2$。
欧拉回路(Euler Circuit) :小学数学课本上的哥尼斯堡七桥问题,能不能从镇里的某个位置出发 不重复的经过所有桥(边)并且返回出发点 。这也就小学的一笔画问题,欧拉大神解决里这个问题,开创了图论。结论很简单:至少2个顶点的连通多重图存在欧拉回路的充要条件是 每个顶点的度都是偶数 。证明也很容易,大家有兴趣可以阅读相关资料。结论也很好理解,从某个起点出发,最后要回起点,中间无论路过多少次起点,都会再次离开,进、出的数目必然相等,故一定是偶数。
哈密顿回路(Hamilton Circuit) :哈密顿回路条件就比欧拉回路严格一点, 不能重复经过点 。你可能会感到意外,对于欧拉回路,我们可以轻而易举地回答,但是 我们却很难解决哈密顿回路问题,实际上它是一个NP完全问题 。这个术语源自1857年爱尔兰数学家威廉·罗万·哈密顿爵士发明的智力题。哈密顿的智力题用到了木质十二面体(如图1-8(a)所示,十二面体有12个正五边形表面)、十二面体每个顶点上的钉子、以及细线。十二面体的20个顶点用世界上的不同城市标记。智力题要求从一个城市开始,沿十二面体的边旅行,访问其他19个城市,每个恰好一次,最终回到第一个城市。
因为作者不可能向每位读者提供带钉子和细线的木质十二面体,所以考虑了一个 等价的问题 :对图1-8(b)的图是否具有恰好经过每个顶点一次的回路?它就是对原题的解,因为这个平面图 同构 于十二面体顶点和边。
着名的 旅行商问题(TSP) 要求旅行商访问一组城市所应当选取的最短路线。这个问题可以归结为求完全图的哈密顿回路,使这个回路的边的权重和尽可能的小。同样,因为这是个NP完全问题,最直截了当的方法就检查所有可能的哈密顿回路,然后选择权重和最小的。当然这样效率几乎难以忍受,时间复杂度高达$O(n!)$。在实际应用中,我们使用的启发式搜索等 近似算法 ,可以完全求解城市数量上万的实例,并且甚至能在误差1%范围内估计上百万个城市的问题。
关于旅行商问题目前的研究进展,可以到 http://www.math.uwaterloo.ca/... 。
1.3 小结
以为可以一带而过,结果写了那么多。也没什么好总结的了,当然这些也至是图论概念的一小部分,还有一些图可能我们以后也会见到,比如顺着图到网络流,就会涉及二分图,不过都很好理解,毕竟有图。
1、数组(邻接矩阵)
2、邻接表
3、十字链表
4、邻接多种表
❻ 最短哈密顿回路!!!!!!!!!
你这个问题是NPC问题,不存在多项式时间的算法。
只有两种方法:
1,搜索:O(n!)
2,状态压缩的动态规划:O(n^2*2^n)
❼ 什么是哈密顿路径问题
也叫哈密顿回路:在图中找出一条包含所有结点的闭路,并且,出来起点和重点重合外,这条闭路所含结点是互不相同的 可以在多项式时间类判断一个回路是否是哈密顿回路 但目前没有算法直接解出哈密顿回路
天文学家哈密顿(William Rowan Hamilton) 提出,在一个有多个城市的地图网络中,
寻找一条从给定的起点到给定的终点沿 途恰好经过所有其他城市一次的路径。
这个问题和着名的过桥问题的不同之处在于,某些城市之间的旅行不 一定是双向的。比如A→B,但B→A是不允许的。
换一种说法,对于一个给定的网络,确定起点和终点后,如果存在一条路径,穿过这个网络,我们就说这个网络存在哈密顿路径。哈密顿路径问题在上世纪七十年代初,终于被证明是“NP完备”的。据说具有这样性质的问题,难于找到一个有效的算法。实际上对于某些顶点数不到100的网络,利用现有最好的算法和计算机也需要比较荒唐的时间(比如几百年)才能确定其是否存在一条这样的路径。
❽ 求matlab解决哈密顿回路
可以用蚁群算法, 当然Hopfield网络与退火我也试过, 但还是蚁群的效果最好.
注意: 哈密顿回路问题(TSP问题)是NP-COMPLETE问题, 问题规模比较大时无法求得最优解, 只能通过启发式算法逼近其次优解.
把你的邮箱留下来吧. 我这有一份C++写的, 不过封装成MEX了, MATLAB里可以直接调用的, 速度还不错. 纯MATLAB的我也有, 不过速度慢死. 要不然我就不费事用C++重写一份了.
❾ 哈密尔顿回路问题具体指什么
1857年,英国数学家汉密尔顿(Hamilton)提出了着名的汉密尔顿回路问题,其后,该问题进一步被发展成为所谓的“货郎担问题”,即赋权汉密尔顿回路最小化问题:这两个问题成为数学史上着名的难题。而后者在工程优化、现场管理等现实生活中有重要作用:以电站建设为例,如何使若干供货点的总运费最小,施工现场如何使供货时间最短等等,最终都归结为赋权汉密尔顿问题,是电站建设中成本控制和进度优化的关键技术;因而,赋权汉密尔顿问题与主生产计划安排成为电站建设中成本控制和进度优化的两大技术难题。而且,主生产计划安排,又可以分解为有向图的赋权汉密尔顿问题进行解决;因此,赋权汉密尔顿问题在包括电站建设的大型工程建设项目占有重要的地位,具有重大的理论和现实意义。理论上讲,赋权汉密尔顿问题的最优解总可以用枚举法求出;但在实际工作中,枚举法的计算量巨大,对于n个点的问题存在(n-1)!条汉密尔顿回路,当n比较大时,枚举法显然是行不通的,为此,优化专家们提出了启发式算法[1],以期求得该问题的近似最优解。而不同算法之目的是共同的,即在多项式的运算量内,尽可能提高其解的精度。其中应用比较广泛的有Clarke和Wright的C-W算法,Norback和Love的几何算法[2],在此,称这些算法为经典启发式算法,简称经典算法,这些算法的一个共同特点就是非优化性。针对这一特点,本文提出一种局部优化的算法,对业已求得的汉密尔顿回路进行优化。这种算法的结果是以经典算法结果为起点的局部优化解,因此,该算法极大改进了经典启发式算法的性能,且在目前可考证的情况下,均能求得最优解;但是,是否在任何情况下都能求得最优解则尚待证明。
❿ 哈密顿回路的算法
哈密顿路径问题在上世纪七十年代初,终于被证明是“NP完备”的。据说具有这样性质的问题,难于找到一个有效的算法。实际上对于某些顶点数不到100的网络,利用现有最好的算法和计算机也需要比较荒唐的时间(比如几百年)才能确定其是否存在一条这样的路径。
从图中的任意一点出发,路途中经过图中每一个结点当且仅当一次,则成为哈密顿回路。
要满足两个条件:
⒈封闭的环
⒉是一个连通图,且图中任意两点可达
经过图(有向图或无向图)中所有顶点一次且仅一次的通路称为哈密顿通路。
经过图中所有顶点一次且仅一次的回路称为哈密顿回路。
具有哈密顿回路的图称为哈密顿图,具有哈密顿通路但不具有哈密顿回路的图称为半哈密顿图。
平凡图是哈密顿图。
⒊若以1到2、2到3、3到4、4到5、5到1,为计数规律,则各点均出现两次;这种判断方法在计算机编程运算中显得尤为重要,其会精简很多运算过程。
⒋新出炉,有待检测的代码如下:
%-------输入的数据的原数据参照
% v1 v2 v3 v4 v5
%v1 0 20 1 11 2
%v2 0 0 9 1 3
%v3 0 0 0 13 8
%v4 0 0 0 0 6
%v5 0 0 0 0 0
%以上为输入数据的原数据参照
%建议所计算的数据矩阵长度为5,不会产生bug,且不会对任何计算机造成计算负担
%输入数据矩阵长度可以超过5,但是最初计算出的n个最小值中,重复次数超过2的点的种类只允许为一种
a=[0 20 1 11 2
0 0 9 1 3
0 0 0 13 8
0 0 0 0 6
0 0 0 0 0];
l=length(a)
s1=inf
zp=inf
n2=1
f=a
f(a==0)=inf
b=zeros(l)
i1=0
while i1<=l-1
[r c]=find(f==min(min(f)))
b(r⑴,c⑴)=f(r⑴,c⑴)
f(r⑴,c⑴)=inf
i1=i1+1
end
f1=f
[rz cz]=find(b>0)
pathz=[rz cz]
pz=[rz;cz]
p2z=zeros(2*l,1)
i2z=1
n2z=0
while i2z<=2*l
[r2z c2z]=find(pz==pz(i2z,1))
k1z=size(r2z)
if k1z(1,1)>2
p2z(r2z,1)=pz(r2z,1)
n2z=n2z+1
end
i2z=i2z+1
end
if n2z==2
HHL=b
zp=sum(sum(b))
else
while min(min(f1))~=inf
if n2>2
b=snh
end
[r1 c1]=find(b>0)
path1=[r1 c1]
p1=[r1;c1]
p2=zeros(2*l,1)
i2=1
n2=0
while i2<=2*l
[r2 c2]=find(p1==p1(i2,1))
k1=size(r2)
if k1(1,1)>2
p2(r2,1)=p1(r2,1)
n2=n2+1
end
i2=i2+1
end
[r3 c3]=find(p2>0)
p3=zeros(l,2)
i3=0
while i3<=n2-1
if r3⑴<=l
p3(r3⑴,:)=path1(r3⑴,:)
else
p3(r3⑴-l,:)=path1(r3⑴-l,:)
end
r3⑴=[]
i3=i3+1
end
p3(p3==0)=[]
p3=reshape(p3,n2,2)
p8=p2
[r8 c8]=find(p8>0)
p9=p8
r9=r8
i4=1
while i4<=n2
f1(p9(r9⑴,1),:)=inf
f1(:,p9(r9⑴,1))=inf
r9⑴=[]
i4=i4+1
end
[r4 c4]=find(f1==min(min(f1)))
f1(r4,c4)=inf
b1=b
b1(r4,c4)=a(r4,c4)
i5=1
p4=p3
while i5<=n2
b1=b
b1(r4⑴,c4⑴)=a(r4⑴,c4⑴)
b1(p4(1,1),p4(1,2))=0
p4(1,:)=[]
[r5 c5]=find(b1>0)
p5=[r5;c5]
i6=1
n6=0
while i6<=2*l
[r6 c6]=find(p5==p5(i6,1))
k6=size(r6)
if k6(1,1)>2
n6=n6+1
end
i6=i6+1
end
if n6>2
if sum(sum(b1))<s1
snh=[]
s1=sum(sum(b1))
snh=b1
end
else
if sum(sum(b1))<zp
HHL=[]
zp=sum(sum(b1))
HHL=b1
end
end
i5=i5+1
end
end
[rs cs]=find(HHL>0)
minpaths=[rs cs]
journeys=zp
注:这段代码采用分支定界法作为编写程序的依据,因此代码依旧局限在算法上;而且代码的使用对所要计算的数据是有要求的,如下:
⒈只要数据在开始计算出的n个最小值中,其重复次数超过2次的点的种类只能为一种,例如:代码段中的数据五个最小值中其重复次数超过2次的点只有v5。
⒉数据矩阵格式要求:只允许为上三角矩阵,不支持全矩阵以及下三角矩阵的运算。
⒊代码扩展方法请使用者独立思考,不唯一。
⒋运算数据扩展方法,请使用者独立思考,不唯一。
⒌此代码为本人毕设的附加产品,不会对使用此代码者,因理解不当或使用不当而造成的任何不良后果,付出任何责任。
⒍代码仅供交流。