最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python&Matlab實(shí)現(xiàn)螞蟻群算法求解最短路徑問題的示例

 更新時(shí)間:2022年03月04日 16:17:23   作者:是夢(mèng)吧,是你吧!  
本文主要介紹了Python&Matlab實(shí)現(xiàn)螞蟻群算法求解最短路徑問題的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

1 知識(shí)點(diǎn)

詳細(xì)知識(shí)點(diǎn)見:智能優(yōu)化算法—蟻群算法(Python實(shí)現(xiàn))

我們這一節(jié)知識(shí)點(diǎn)只講蟻群算法求解最短路徑步驟及流程。

 1.1 蟻群算法步驟

     設(shè)螞蟻的數(shù)量為m,地點(diǎn)的數(shù)量為n,地點(diǎn)i與地點(diǎn)j之間相距Dij,t時(shí)刻地點(diǎn)i與地點(diǎn)j連接的路徑上的信息素濃度為Sij,初始時(shí)刻每個(gè)地點(diǎn)間路徑上的信息素濃度相等。

   螞蟻k根據(jù)各個(gè)地點(diǎn)間連接路徑上的信息素決定下一個(gè)目標(biāo)地點(diǎn),Pijk表示t時(shí)刻螞蟻k從地點(diǎn)i轉(zhuǎn)移的概率,概率計(jì)算公式如下:

上式中,為啟發(fā)函數(shù),,表示螞蟻從地點(diǎn)i轉(zhuǎn)移到地點(diǎn)j的期望程度;為螞蟻k即將訪問地點(diǎn)的集合,開始時(shí)中有n-1個(gè)元素(除出發(fā)地點(diǎn)),隨時(shí)間的推移,螞蟻每到達(dá)下一個(gè)地點(diǎn),中的元素便減少一個(gè),直至空集,即表示所有地點(diǎn)均訪問完畢;a為信息素重要程度因子,值越大,表明信息素的濃度在轉(zhuǎn)移中起到的作用越大,也就是說螞蟻選擇距離近的下一個(gè)地點(diǎn)的概率更大,β為啟發(fā)函數(shù)重要程度因子。

 螞蟻在釋放信息素的同時(shí),每個(gè)地點(diǎn)間連接路徑上的信息素逐漸消失,用參數(shù)

 表示信息素的揮發(fā)程度。因此,當(dāng)所有螞蟻完成一次循環(huán)后,每個(gè)地點(diǎn)間連接路徑上的信息素濃度需更新,也就是有螞蟻路過并且留下信息素,有公式表示為:

其中,表示第k只螞蟻在地點(diǎn)i與j連接路徑上釋放的信息素濃度;表示所有螞蟻在地點(diǎn)i與j連接路徑上釋放的信息素濃度之和;Q為常數(shù),表示螞蟻循環(huán)一次所釋放的信息素總量;Lk表示第k只螞蟻經(jīng)過路徑的長(zhǎng)度,總的來說,螞蟻經(jīng)過的路徑越短,釋放的信息素濃度越高,最終選出最短路徑。 

1.2 蟻群算法程序

(1)參數(shù)初始化

在尋最短路錢,需對(duì)程序各個(gè)參數(shù)進(jìn)行初始化,蟻群規(guī)模m、信息素重要程度因子α、啟發(fā)函數(shù)重要程度因子β、信息素會(huì)發(fā)因子、最大迭代次數(shù)ddcs_max,初始迭代值為ddcs=1。

(2)構(gòu)建解空間

將每只螞蟻隨機(jī)放置在不同的出發(fā)地點(diǎn),對(duì)螞蟻訪問行為按照公式計(jì)算下一個(gè)訪問的地點(diǎn),直到所有螞蟻訪問完所有地點(diǎn)。

(3)更新信息素

計(jì)算每只螞蟻經(jīng)過的路徑總長(zhǎng)Lk,記錄當(dāng)前循環(huán)中的最優(yōu)路徑,同時(shí)根據(jù)公式對(duì)各個(gè)地點(diǎn)間連接路徑上的信息素濃度進(jìn)行更新。

(4)判斷終止

迭代次數(shù)達(dá)到最大值前,清空螞蟻經(jīng)過的記錄,并返回步驟(2)。

2 螞蟻算法求解最短路徑問題——Python實(shí)現(xiàn)

2.1 源碼實(shí)現(xiàn)

智能優(yōu)化算法—蟻群算法(Python實(shí)現(xiàn))

2.2  ACA_TSP實(shí)現(xiàn)

補(bǔ)充知識(shí)點(diǎn):scipy.spatial.distance.cdist

#============導(dǎo)入相關(guān)庫(kù)=================
import numpy as np
from scipy import spatial
import pandas as pd
import matplotlib.pyplot as plt
from sko.ACA import ACA_TSP
 
num_points = 25
 
points_coordinate = np.random.rand(num_points, 2)  # 生成點(diǎn)的坐標(biāo)
distance_matrix = spatial.distance.cdist(points_coordinate, points_coordinate, metric='euclidean')#函數(shù)用于計(jì)算兩個(gè)輸入集合的距離
 
 
def cal_total_distance(routine):
    num_points, = routine.shape
    return sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] for i in range(num_points)])
 
 
#=============ACA_TSP解決==================================
 
aca = ACA_TSP(func=cal_total_distance, n_dim=num_points,
              size_pop=50, max_iter=200,
              distance_matrix=distance_matrix)
 
best_x, best_y = aca.run()
 
#=============可視化=======================
 
fig, ax = plt.subplots(1, 2)
best_points_ = np.concatenate([best_x, [best_x[0]]])
best_points_coordinate = points_coordinate[best_points_, :]
ax[0].plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1], 'o-r')
pd.DataFrame(aca.y_best_history).cummin().plot(ax=ax[1])
plt.show()

3 螞蟻算法求解最短路徑問題——Matlab實(shí)現(xiàn)

3.1 流程圖

3.2 代碼實(shí)現(xiàn) 

下表為一些坐標(biāo)點(diǎn),找出最短路線:

%蟻群算法尋找最短路徑程序
%% 清空環(huán)境變量
clear
clc
%% 導(dǎo)入數(shù)據(jù),導(dǎo)入方式,看個(gè)人習(xí)慣
zuobiao=[1304  2312
3639  1315
4177  2244
3712  1399
3488  1535
3326  1556
3238  1229
4196  1004
4312  790
4386  570
3007  1970
2562  1756
2788  1491
2381  1676
1332  695
3715  1678
3918  2179
4061  2370
3780  2212
3676  2578
4029  2838
4263  2931
3429  1908
3507  2367
3394  2643
3439  3201
2935  3240
3140  3550
2545  2357
2778  2826
2370  2975];
%% 計(jì)算城市間相互距離
n = size(zuobiao,1);%城市個(gè)數(shù)
jl = zeros(n,n);%首先求得各個(gè)坐標(biāo)點(diǎn)的距離,這里是矩陣初始化
for i = 1:n
    for j = 1:n
        if i ~= j  %~=是不等于的意思,zuobiao矩陣中每行都有個(gè)坐標(biāo),坐標(biāo)相減用i和j區(qū)分不同的坐標(biāo)點(diǎn),然后求兩點(diǎn)距離
            jl(i,j) = sqrt(sum((zuobiao(i,:) - zuobiao(j,:)).^2));
%上式運(yùn)算如a=[2,2;1,1]=>a(1,:)-a(2,:)=>ans =1 1,然后1?+1?=2,最后開根號(hào)
        else
            jl(i,j) = 1e-4;%相等的點(diǎn)相減準(zhǔn)確說是等于0的,這里設(shè)置成了一個(gè)很小的數(shù),是為了避免后面程序運(yùn)算出錯(cuò)
        end
    end    
end
%% 初始化參數(shù)
m = 50;         % 螞蟻數(shù)量,視情況而定,坐標(biāo)點(diǎn)多的話可以適當(dāng)增加螞蟻數(shù)量
a= 1;           % 信息素重要程度因子
b= 5;           % 啟發(fā)函數(shù)重要程度因子
r = 0.1;        % 信息素?fù)]發(fā)因子
Q = 1;          % 常數(shù)
qfhs = 1./jl;    % 啟發(fā)函數(shù),將jl矩陣中每個(gè)元素轉(zhuǎn)化為倒數(shù)
xxsjz = ones(n,n);       % 信息素矩陣初始化
ljjl = zeros(m,n);       % 路徑記錄表矩陣初始化
ddcs = 1;                % 迭代次數(shù)初值
ddcs_max = 200;          % 最大迭代次數(shù) 
Lujin_best = zeros(ddcs_max,n);      % 各代最佳路徑       
L_best = zeros(ddcs_max,1);     % 各代最佳路徑的長(zhǎng)度  
L_ave = zeros(ddcs_max,1);      % 各代路徑的平均長(zhǎng)度  
%% 迭代尋找最佳路徑
while ddcs <= ddcs_max%在ddcs小于ddcs_max前,一直循環(huán)
%% 隨機(jī)產(chǎn)生各個(gè)螞蟻的起點(diǎn)
      start = zeros(m,1);
      for i = 1:m
          temp = randperm(n);%功能是隨機(jī)打亂一個(gè)數(shù)字序列,也就是現(xiàn)將坐標(biāo)點(diǎn)排號(hào)再打亂,相當(dāng)于將螞蟻隨機(jī)分布在各個(gè)地點(diǎn)
          start(i) = temp(1);
      end
      ljjl(:,1) = start; 
%% 構(gòu)建解空間
      zuobiao_index = 1:n;
      % 逐個(gè)螞蟻路徑選擇
      for i = 1:m
          % 逐個(gè)地點(diǎn)路徑選擇
         for j = 2:n
             yfw = ljjl(i,1:(j - 1));           % 已訪問的地點(diǎn)集合(禁忌表)
             allow_index = ~ismember(zuobiao_index,yfw);%ismember用于判斷矩陣某個(gè)元素是否存在,用法詳見后文函數(shù)講解
             allow = zuobiao_index(allow_index);  % 待訪問的城市集合
             P = allow;
             % 計(jì)算城市間轉(zhuǎn)移概率
             for k = 1:length(allow)
                 P(k) = xxsjz(yfw(end),allow(k))^a * qfhs(yfw(end),allow(k))^b;%見文中公式
             end
             P = P/sum(P);
             % 選擇下一個(gè)訪問城市
             Plj = cumsum(P);     %cumsum函數(shù)用于累加,具體用法詳見后文函數(shù)講解
             yidong_index = find(Plj >= rand); 
             yidong = allow(yidong_index(1));
             ljjl(i,j) = yidong;
         end
      end
      % 計(jì)算各個(gè)螞蟻的路徑距離
      L = zeros(m,1);
      for i = 1:m
          Lujin = ljjl(i,:);
          for j = 1:(n - 1)
              L(i) = L(i) + jl(Lujin(j),Lujin(j + 1));
          end
          L(i) = L(i) + jl(Lujin(n),Lujin(1));
      end
      % 計(jì)算最短路徑距離及平均距離
      if ddcs == 1
          [min_L,min_index] = min(L);
          L_best(ddcs) = min_L;  
          L_ave(ddcs) = mean(L);
          Lujin_best(ddcs,:) = ljjl(min_index,:);
      else
          [min_L,min_index] = min(L);
          L_best(ddcs) = min(L_best(ddcs - 1),min_L);
          L_ave(ddcs) = mean(L);
          if L_best(ddcs) == min_L
              Lujin_best(ddcs,:) = ljjl(min_index,:);
          else
              Lujin_best(ddcs,:) = Lujin_best((ddcs-1),:);
          end
      end
%% 更新信息素
      S = zeros(n,n);
      % 逐個(gè)螞蟻計(jì)算
      for i = 1:m
          % 逐個(gè)城市計(jì)算
          for j = 1:(n - 1)
              S(ljjl(i,j),ljjl(i,j+1)) = S(ljjl(i,j),ljjl(i,j+1)) + Q/L(i);
          end
          S(ljjl(i,n),ljjl(i,1)) = S(ljjl(i,n),ljjl(i,1)) + Q/L(i);
      end
      xxsjz = (1-r) * xxsjz + S;
    % 迭代次數(shù)加1,清空路徑記錄表
    ddcs = ddcs + 1;
    ljjl = zeros(m,n);
end
%% 結(jié)果顯示
[Shortest_L,index] = min(L_best);
Shortest_Lujin = Lujin_best(index,:);
disp(['最短距離:' num2str(Shortest_L)]);
disp(['最短路徑:' num2str([Shortest_Lujin Shortest_Lujin(1)])]);
%% 繪圖
figure(1)
plot([zuobiao(Shortest_Lujin,1);zuobiao(Shortest_Lujin(1),1)],...
     [zuobiao(Shortest_Lujin,2);zuobiao(Shortest_Lujin(1),2)],'o-');
grid on
for i = 1:size(zuobiao,1)
    text(zuobiao(i,1),zuobiao(i,2),['   ' num2str(i)]);
end
text(zuobiao(Shortest_Lujin(1),1),zuobiao(Shortest_Lujin(1),2),'       起點(diǎn)');
text(zuobiao(Shortest_Lujin(end),1),zuobiao(Shortest_Lujin(end),2),'       終點(diǎn)');
xlabel('城市位置橫坐標(biāo)')
ylabel('城市位置縱坐標(biāo)')
title(['蟻群算法優(yōu)化路徑(最短距離:' num2str(Shortest_L) ')'])
figure(2)
plot(1:ddcs_max,L_best,'b',1:ddcs_max,L_ave,'r')
legend('最短距離','平均距離')
xlabel('迭代次數(shù)')
ylabel('距離')
title('各代最短距離與平均距離對(duì)比')

3.3 結(jié)果 

到此這篇關(guān)于Python&Matlab實(shí)現(xiàn)螞蟻群算法求解最短路徑問題的示例的文章就介紹到這了,更多相關(guān)Python&Matlab螞蟻群最短路徑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • django解決跨域請(qǐng)求的問題詳解

    django解決跨域請(qǐng)求的問題詳解

    這篇文章主要介紹了django解決跨域請(qǐng)求的問題詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • Python內(nèi)置函數(shù)issubclass()的具體使用

    Python內(nèi)置函數(shù)issubclass()的具體使用

    issubclass()是Python中一個(gè)非常有用的內(nèi)置函數(shù),它提供了一種簡(jiǎn)單的方式來檢查類的繼承關(guān)系,本文主要介紹了Python內(nèi)置函數(shù)issubclass()的具體使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2007-03-03
  • Python常見數(shù)據(jù)結(jié)構(gòu)詳解

    Python常見數(shù)據(jù)結(jié)構(gòu)詳解

    這篇文章主要介紹了Python常見數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下
    2014-07-07
  • Python學(xué)習(xí)教程之常用的內(nèi)置函數(shù)大全

    Python學(xué)習(xí)教程之常用的內(nèi)置函數(shù)大全

    python給我們提供了很多已經(jīng)定義好的函數(shù),下面這篇文章主要給大家介紹了關(guān)于Python學(xué)習(xí)教程之一些常用的內(nèi)置函數(shù),文中分享了關(guān)于數(shù)學(xué)函數(shù)、功能函數(shù)、類型轉(zhuǎn)換函數(shù)、字符串處理和序列處理函數(shù)的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • 深入理解Python中的*重復(fù)運(yùn)算符

    深入理解Python中的*重復(fù)運(yùn)算符

    這篇文章主要介紹了深入理解Python中的*重復(fù)運(yùn)算符,小編覺得還是挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • python項(xiàng)目--使用Tkinter的日歷GUI應(yīng)用程序

    python項(xiàng)目--使用Tkinter的日歷GUI應(yīng)用程序

    在 Python 中,我們可以使用 Tkinter 制作 GUI。如果你非常有想象力和創(chuàng)造力,你可以用 Tkinter 做出很多有趣的東西,希望本篇文章能夠幫到你
    2021-08-08
  • python字符串替換第一個(gè)字符串的方法

    python字符串替換第一個(gè)字符串的方法

    這篇文章主要介紹了python字符串替換第一個(gè)字符串的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • Python利用fitz庫(kù)提取pdf中的圖片

    Python利用fitz庫(kù)提取pdf中的圖片

    Fitz庫(kù)是一個(gè)Python圖像處理庫(kù),主要用于打開、編輯和保存PDF、TIFF和JPEG格式的圖像,它可以幫助用戶讀取和寫入PDF文件,提取PDF頁(yè)面以及在頁(yè)面上進(jìn)行標(biāo)記和注釋,本文主要介紹了如何通過Python的fitz庫(kù)提取pdf中的圖片,需要的朋友可以參考下
    2023-05-05
  • Python使用Webargs實(shí)現(xiàn)簡(jiǎn)化Web應(yīng)用程序的參數(shù)處理

    Python使用Webargs實(shí)現(xiàn)簡(jiǎn)化Web應(yīng)用程序的參數(shù)處理

    在開發(fā)Web應(yīng)用程序時(shí),參數(shù)處理是一個(gè)常見的任務(wù),Python的Webargs模塊為我們提供了一種簡(jiǎn)單而強(qiáng)大的方式來處理這些參數(shù),下面我們就來學(xué)習(xí)一下具體操作吧
    2024-02-02
  • Python處理excel與txt文件詳解

    Python處理excel與txt文件詳解

    大家好,本篇文章主要講的是Python處理excel與txt文件詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評(píng)論

安陆市| 通道| 南雄市| 康马县| 泽库县| 叶城县| 策勒县| 交城县| 石城县| 嘉峪关市| 华亭县| 孟津县| 金门县| 南宁市| 碌曲县| 南城县| 濮阳县| 香港| 富平县| 巫溪县| 柘城县| 连山| 怀集县| 靖江市| 无棣县| 青浦区| 凤凰县| 高平市| 剑河县| 都昌县| 昌平区| 嘉峪关市| 贵溪市| 日照市| 嘉祥县| 伊通| 鸡东县| 瑞安市| 巴南区| 三亚市| 哈巴河县|