亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

1 知識點

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

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

 1.1 蟻群算法步驟

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

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

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

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

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

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

1.2 蟻群算法程序

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

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

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

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

(3)更新信息素

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

(4)判斷終止

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

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

2.1 源碼實現(xiàn)

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

2.2  ACA_TSP實現(xiàn)

補充知識點:scipy.spatial.distance.cdist

#============導(dǎo)入相關(guān)庫=================
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)  # 生成點的坐標(biāo)
distance_matrix = spatial.distance.cdist(points_coordinate, points_coordinate, metric='euclidean')#函數(shù)用于計算兩個輸入集合的距離
 
 
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實現(xiàn)

3.1 流程圖

3.2 代碼實現(xiàn) 

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

%蟻群算法尋找最短路徑程序
%% 清空環(huán)境變量
clear
clc
%% 導(dǎo)入數(shù)據(jù),導(dǎo)入方式,看個人習(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];
%% 計算城市間相互距離
n = size(zuobiao,1);%城市個數(shù)
jl = zeros(n,n);%首先求得各個坐標(biāo)點的距離,這里是矩陣初始化
for i = 1:n
    for j = 1:n
        if i ~= j  %~=是不等于的意思,zuobiao矩陣中每行都有個坐標(biāo),坐標(biāo)相減用i和j區(qū)分不同的坐標(biāo)點,然后求兩點距離
            jl(i,j) = sqrt(sum((zuobiao(i,:) - zuobiao(j,:)).^2));
%上式運算如a=[2,2;1,1]=>a(1,:)-a(2,:)=>ans =1 1,然后1?+1?=2,最后開根號
        else
            jl(i,j) = 1e-4;%相等的點相減準確說是等于0的,這里設(shè)置成了一個很小的數(shù),是為了避免后面程序運算出錯
        end
    end    
end
%% 初始化參數(shù)
m = 50;         % 螞蟻數(shù)量,視情況而定,坐標(biāo)點多的話可以適當(dāng)增加螞蟻數(shù)量
a= 1;           % 信息素重要程度因子
b= 5;           % 啟發(fā)函數(shù)重要程度因子
r = 0.1;        % 信息素揮發(fā)因子
Q = 1;          % 常數(shù)
qfhs = 1./jl;    % 啟發(fā)函數(shù),將jl矩陣中每個元素轉(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);     % 各代最佳路徑的長度  
L_ave = zeros(ddcs_max,1);      % 各代路徑的平均長度  
%% 迭代尋找最佳路徑
while ddcs <= ddcs_max%在ddcs小于ddcs_max前,一直循環(huán)
%% 隨機產(chǎn)生各個螞蟻的起點
      start = zeros(m,1);
      for i = 1:m
          temp = randperm(n);%功能是隨機打亂一個數(shù)字序列,也就是現(xiàn)將坐標(biāo)點排號再打亂,相當(dāng)于將螞蟻隨機分布在各個地點
          start(i) = temp(1);
      end
      ljjl(:,1) = start; 
%% 構(gòu)建解空間
      zuobiao_index = 1:n;
      % 逐個螞蟻路徑選擇
      for i = 1:m
          % 逐個地點路徑選擇
         for j = 2:n
             yfw = ljjl(i,1:(j - 1));           % 已訪問的地點集合(禁忌表)
             allow_index = ~ismember(zuobiao_index,yfw);%ismember用于判斷矩陣某個元素是否存在,用法詳見后文函數(shù)講解
             allow = zuobiao_index(allow_index);  % 待訪問的城市集合
             P = allow;
             % 計算城市間轉(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);
             % 選擇下一個訪問城市
             Plj = cumsum(P);     %cumsum函數(shù)用于累加,具體用法詳見后文函數(shù)講解
             yidong_index = find(Plj >= rand); 
             yidong = allow(yidong_index(1));
             ljjl(i,j) = yidong;
         end
      end
      % 計算各個螞蟻的路徑距離
      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
      % 計算最短路徑距離及平均距離
      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);
      % 逐個螞蟻計算
      for i = 1:m
          % 逐個城市計算
          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),'       起點');
text(zuobiao(Shortest_Lujin(end),1),zuobiao(Shortest_Lujin(end),2),'       終點');
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('各代最短距離與平均距離對比')

3.3 結(jié)果 

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

相關(guān)文章

  • python plt如何保存為emf圖像

    python plt如何保存為emf圖像

    這篇文章主要介紹了python plt如何保存為emf圖像問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • python 實現(xiàn)插入排序算法

    python 實現(xiàn)插入排序算法

    python 插入排序算法,需要的朋友可以參考下
    2012-06-06
  • Pytorch實現(xiàn)圖像識別之?dāng)?shù)字識別(附詳細注釋)

    Pytorch實現(xiàn)圖像識別之?dāng)?shù)字識別(附詳細注釋)

    這篇文章主要介紹了Pytorch實現(xiàn)圖像識別之?dāng)?shù)字識別(附詳細注釋),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Python正則表達式?r'(.*)?are?(.*?)?.*'的深入理解

    Python正則表達式?r'(.*)?are?(.*?)?.*'的深入理解

    日常的開發(fā)工作中經(jīng)常會有處理字符串的需求,簡單的字符串處理,我們使用python內(nèi)置的字符串處理函數(shù)就可以了,但是復(fù)雜的字符串匹配就需要借助正則表達式了,這篇文章主要給大家介紹了關(guān)于Python正則表達式?r‘(.*)?are?(.*?)?.*‘的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Python微服務(wù)開發(fā)之使用FastAPI構(gòu)建高效API

    Python微服務(wù)開發(fā)之使用FastAPI構(gòu)建高效API

    微服務(wù)架構(gòu)在現(xiàn)代軟件開發(fā)中日益普及,它將復(fù)雜的應(yīng)用程序拆分成多個可獨立部署的小型服務(wù)。本文將介紹如何使用 Python 的 FastAPI 庫快速構(gòu)建和部署微服務(wù),感興趣的可以了解一下
    2023-05-05
  • python3 實現(xiàn)一行輸入,空格隔開的示例

    python3 實現(xiàn)一行輸入,空格隔開的示例

    今天小編就為大家分享一篇python3 實現(xiàn)一行輸入,空格隔開的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python?rsa和Crypto.PublicKey.RSA?模塊詳解

    python?rsa和Crypto.PublicKey.RSA?模塊詳解

    這篇文章主要介紹了python?rsa和Crypto.PublicKey.RSA?模塊,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Python?BeautifulSoup4實現(xiàn)數(shù)據(jù)解析與提取

    Python?BeautifulSoup4實現(xiàn)數(shù)據(jù)解析與提取

    Beautiful?Soup是一個Python的庫,用于解析HTML和XML文檔,提供了方便的數(shù)據(jù)提取和操作功能,下面小編就來和大家詳細聊聊如何利用BeautifulSoup4實現(xiàn)數(shù)據(jù)解析與提取吧
    2023-10-10
  • jupyter-lab設(shè)置自啟動及遠程連接開發(fā)環(huán)境

    jupyter-lab設(shè)置自啟動及遠程連接開發(fā)環(huán)境

    本文主要介紹了jupyter-lab設(shè)置自啟動及遠程連接開發(fā)環(huán)境,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Django 解決上傳文件時,request.FILES為空的問題

    Django 解決上傳文件時,request.FILES為空的問題

    這篇文章主要介紹了Django 解決上傳文件時,request.FILES為空的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05

最新評論