日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python遗传算法最短路径问题有几种类型_遗传算法求最短路径 - osc_tn8uhjgi的个人空间 - OSCHINA - 中文开源技术交流社区...

發布時間:2025/3/20 python 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 - 中文开源技术交流社区...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。