什麼是hamilton圈?
哈密頓圖(哈密爾頓圖)(英語:hamiltonian path,或traceable path)是乙個無向圖,由天文學家哈密頓提出,由指定的起點前往指定的終點,途中經過所有其他節點且只經過一次。在圖論中是指含有哈密頓迴路的圖,閉合的哈密頓路徑稱作哈密頓迴路(hamiltonian cycle),含有圖中所有頂點的路徑稱作哈密頓路徑。
從圖中的任意一點出發,路途中經過圖中每乙個結點當且僅當一次,則成為哈密頓迴路。(我的理解就是從一點出發經過所有點在回到原始位置畫乙個圈)
hamilton圈滿足兩個條件:①封閉的環②是乙個連通圖,且圖中任意兩點可達
1. 基本原理
首先求得乙個hamilton圈,然後修改圈得到具有較小權的另乙個hamilton圈,直至無法改進則停止
2. 構建新的改良圈
在基本原理中提到「修改圈」 ,那麼如何修改圈?
對於1 ≤i
1n1≤i1≤i1
n,構建新的hamilton圈cij
=v1v
2…vi
vjvj
−1vj
−2…v
i+1v
j+1v
j+2…
vnv1
c_ = v_1v_2…v_iv_j v_v_…v_v_v_…v_nv_1
cij=v
1v2
…vi
vj
vj−1
vj−
2…v
i+1
vj+1
vj+
2…v
nv1
它是由c中將vi和vj之間的邊逆序得到的。若 w(v
ivj)
+w(v
i+1v
j+1)
vivi
+1)+
w(vj
vj+1
)w(v_iv_j)+w(v_v_)w(
viv
j)+
w(vi
+1v
j+1
)viv
i+1
)+w(
vjv
j+1
)則該圈替換有效
3.例子+matlab**
clear,clc;
%% 初始資料d=[
0563521
5160560
2157
7870
3521036
6868
2157360
5161
5178
6851013
6070
6861130
];l=size
(d,1);
%求出d有幾行即有幾個城市c=[
51:4
65];
%選擇初始圈 注意這已經是乙個圈5
->1-
>2-
>3-
>4-
>6-
>5%
% 改良圈
for k=1:l
flag=0;
%退出標誌
for i=
1:l-
2for j=i+2:l
ifd(
c(i),c
(j))+d
(c(i+1),
c(j+1)
)c(i),c
(i+1))
+d(c
(j),
c(j+1)
)c(i+1
:j)=
c(j:-1
:i+1);
%替換圈本來路徑i-
>i+1..
.->j-
>j+
1替換成i-
>j...
->i+1-
>j+
1 flag=flag+1;
%注意上述.
..中也有城市訪問順序也跟著改變
end %即i+
1-j之間的訪問順序顛倒
end
endif flag==
0%如果flag=
0表明沒有新圈代替 說明已經找到乙個相對較優的解
long=0
;for n=1:l
long
=long+d
(c(n),
c(n+1)
);%求出起點經過中間城市然後到終點然後從終點直接回到起點的距離
endcircle=c;
break
; end
end4.侷限與想法
很明顯使用該演算法得到的只是較好解,幾乎可以肯定不是最優解。前幾天看過遺傳演算法的相關知識,現在知道為什麼很多關於遺傳演算法中的介紹都會提到改良圈演算法,先用改良圈演算法求乙個較好的解,然後再用遺傳演算法優化求出最優解,這應該就是所謂的1+1>2吧!
本文**是《數學建模演算法與應用》中**經過自己改編的
改良 氣泡排序演算法
最近講第二個大課題 陣列。講到陣列,肯定不可避免的就要講到兩個排序演算法了,冒泡演算法首當其衝。整理了一下氣泡排序的內容,我跟學生說 要你們掌握兩個東西,乙個是演算法思想,乙個是核心 演算法思想如下 1.將相鄰兩個數比較,將小 大 的調到前頭。最後排序結果,從小到大 從大到小 每輪比較後,最大 小 ...
BF模式匹配演算法改良
子串查詢 bf bf演算法是帶回溯的模式匹配演算法,如果緩衝標記已做的匹配,減少回溯,可以提高時間效率,當然會犧牲空間,實際運用中需要做權衡考慮 主串ms,長度為n 子串ms,長度為n,n n 初始認為ms的 0,n n 與子串是匹配位置,將其加入乙個記錄陣列中,匹配個數為n n 1 將這些位置的字...
Floyd判圈演算法
參考 判斷鍊錶中是否有環 大概就是說兩個指標首先都指向鍊錶的首部,然後乙個每次走一步,乙個每次走兩步,如果有環,那麼慢的肯定能夠追上快的,否則快的就會先到達終點。求環的長度 兩個指標重合時,快的停止,慢的每次走一步,計算圈的長度。求環的起點 if head null slowptr slowptr ...