python遗传算法最短路径问题有几种类型_遗传算法求最短路径 - osc_tn8uhjgi的个人空间 - OSCHINA - 中文开源技术交流社区...
實例描述
配送中心數為 $1$,客戶數 $k$為 $8$,車輛總數 $m$為 $2$;車輛載重皆為 $8$ 噸;各客戶點需求為 $g(i = 1, 2, ... , 8)$(單位為噸),已知客戶點與配送中心的距離如表 $1 $(其中 $0$ 表示中心倉庫),要求合理安排車輛的運輸路線,使總運輸里程最小。
客戶點與配送中心的距離表
cij
0
1
2
3
4
5
6
7
8
0
0
4
6
7.5
9
20
10
16
8
1
4
0
6.5
4
10
5
7.5
11
10
2
6
6.5
0
7.5
10
10
7.5
7.5
7.5
3
7.5
4
7.5
0
10
5
9
9
15
4
9
10
10
10
0
10
7.5
7.5
10
5
20
5
10
5
10
0
7
9
7.5
6
10
7.5
7.5
9
7.5
7
0
7
10
7
16
11
7.5
6
7.5
9
7
0
10
8
8
10
7.5
15
10
7.5
10
10
0
各客戶點需求
g1
g2
g3
g4
g5
g6
g7
g8
1
2
1
2
1
4
2
2
運行結果
【Attention】下圖并非最優結果,只是為了測試程序的正確性。可以嘗試加大次數改良結果。
遺傳算法分析
顧名思義,遺傳算法是根據遺傳規律寫的一個算法,但是相比于醫學中的遺傳來講,這里講的遺傳算法原理相對簡單很多。
遺傳算法的核心有三個部分:交叉、變異、輪盤賭。
解決問題的關鍵和難點就是理解遺傳算法的作用:通過改變交叉和變異改變基因特性,導致個體發生改變,從而影響到適應度,最后利用輪盤賭的方式淘汰掉一些個體。
看一下整個程序的運行流程:
$$ 4 5 2 7 3 6 1 8 \ 2 8 1 5 7 6 3 4 \ 4 6 7 2 5 1 3 8 \ 4 2 6 5 1 7 8 3 \ 1 7 3 2 4 8 5 6 \ 3 2 8 6 4 7 1 5 $$
上面的數據一用有$6$行$8$列,我們可以說有$6$個個體,每個個體的基因長度是$8$。其中$6$可以說是種群大小,$8$可以說是每個個體的特征數目。到目前為止,我們可以定義一種運算規則了:通過每個個體的特征計算出該個體的樣子($X$),然后根據個體的樣子,求出該個體的適應度($Y$)。
整個流程是:個體特征 --->> 個體 --->> 適應度
假設個體$1$和個體$2$發生了交叉,交叉點在第$7$列,那么交叉之前,兩個個體為:
$$ 4 5 2 7 3 6 1 8 \ 2 8 1 5 7 6 3 4
$$
交叉之后,兩個個體為:
$$ 4 5 2 7 3 6 3 4 \ 2 8 1 5 7 6 1 8 $$
可以發現,交叉就是把交叉點后的所有列數據都進行交換(包括交叉點所在的列)。
假設個體$4$發生了變異,發生變異的點在第$3$點,那么變異之前為:
$$ 4 2 6 5 1 7 8 3
$$
變異之后,該個體變為:
$$ 4 2 3 5 1 7 8 3 $$
可以發現,變異就是把變異點所在的位置隨機的更換一個數字。
輪盤賭的規則很簡單:在左輪手槍的六個彈槽中放入一顆或多顆子彈,任意旋轉轉輪之后,關上轉輪。游戲的參加者輪流把手槍對著自己的頭,扣動板機;中槍的當然是自動退出,怯場的也為輸,堅持到最后的就是勝者。
遺傳算法中的輪盤賭和俄羅斯輪盤賭還是有點差距的。這里不以子彈作為籌碼,而是以概率作為籌碼。
還是以上面的$6$個個體作為例子,我們對上面的$6$個個體都求出適應度($Y$)后,$6$個適應度可能是下面的樣子:
$$ 99.0000 \ 105.5000 \ 100.5000\ 102.0000 \ 103.0000 \ 95.5000 $$
然后求出總適應度(sum(Y))將每個個體的適應度除以總適應度,得到下面的結果:
$$ 0.1635 \ 0.1742\ 0.1660\ 0.1685\ 0.1701\ 0.1577 $$
然后,對$6$個個體適應度從上到下累加求和,得到下面的結果:
$$ 0.1635\ 0.3377\ 0.5037\ 0.6722\ 0.8423\ 1.0000 $$
對種群的處理已經完成,那么應該淘汰哪部分,是現在應該應該考慮的問題。
我們可以生成一個隨機數序列,然后從小到大排序,假設下面是一個生成的隨機序列:
$$ 0.0005\ 0.1899\ 0.3298\ 0.8077\ 0.8875\ 0.9450 $$
比較規則:
對左右兩列數據做對比:
選擇第二列的第一個數(0.1635),依次與左側數據對比,直到遇到一個比它大的數(0.1899),停止比較。
選擇第二列的第二個數(0.3377),接著從(1)中停止的位置(0.1899)開始比較,直到遇到一個比它大的數(0.8077),停止比較。
按照上面的規律,直到比較完第二列的所有數據,輪盤賭結束。
如果不對比較次數做限制的話,那么整個比較過程會是如下的效果:
但是,鑒于種群數量有限,只能保存$6$個個體,因此,我們只保留箭頭起始點較大的個體。
因為 0.1635 > 0.0005 ,故 0.1635 保留。 因為 0.5037 < 0.8077 ,故 0.5037 舍棄。
經過篩選后,我們得到下面的個體可以被保留:
也就是個體$1$、$2$、$5$、$6$被篩選了下來,而且,個體$2$和$6$被保留了兩次。
以上就是整個遺傳算法的核心了。其余部分(如何根據個體計算適應度,也就是如何根據$x$求出$y$)需要根據具體情況做修改。
【注意】在交叉和變異中,需要將重復的元素去重,才能在適用于本題目。去重操作可以參考[Source Code]。
總結
以上是生活随笔為你收集整理的python遗传算法最短路径问题有几种类型_遗传算法求最短路径 - osc_tn8uhjgi的个人空间 - OSCHINA - 中文开源技术交流社区...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arcgis java api_Arcg
- 下一篇: 20 条非常实用的 Python 代码,