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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

离散蚁群算法实例(求解旅行商问题)

發布時間:2024/9/30 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 离散蚁群算法实例(求解旅行商问题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

蟻群算法

??????蟻群算法原理
萬字長文帶你了解蟻群算法及求解復雜約束問題【源碼實現】

?????上面這篇博文的蟻群算法是實數編碼。今天講解下離散編碼的蟻群算法。
?????算法原理不再解釋,直接上算例。

旅行商問題

????? 旅行商問題(TSP 問題)。假設有一個旅行商人要拜訪全國31個省會城市,他需要選擇所要走的路徑,路徑的限制是每個城市只能拜訪-一次, 而且最后要回到原來出發的城市。路徑的選擇要求是:所選路徑的路程為所有路徑之中的最小值。

matlab求解

%%%%%%%%%%%%%%%%%%%%蟻群算法解決TSP問題%%%%%%%%%%%%%%%%%%%%%%%%%%clear all; %清除所有變量 close all; %清圖 citys=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...3238 1229;4196 1044;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 2376;...3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;...2370 2975]; %31個省會城市坐標%%%%%%%%%%%%%%%%%%%%%%%計算城市間相互距離%%%%%%%%%%%%%%%%%%%%%%% %% 計算距離 n = size(citys,1);%n=31 D = zeros(n,n);%因為是計算兩兩之間的距離,所以矩陣為31*31 for i = 1:nfor j = 1:nif i ~= jD(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));elseD(i,j) = 1e-4; %對角矩陣 距離為0,我將對角矩陣賦值一個很小的距離,不影響計算。因為前文圖中公式里有距離的倒數 endend end%%%%%%%%%%%%%%%%%%%%%%%%%初始化參數%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 初始化參數 m = 50; % 螞蟻數量 alpha = 1; % 信息素重要程度因子 beta = 5; % 啟發函數重要程度因子 rho = 0.1; % 信息素揮發因子 Q = 1; % 常系數 Eta = 1./D; % 啟發函數 Tau = ones(n,n); % 信息素矩陣 Table = zeros(m,n); % 路徑記錄表 iter = 1; % 迭代次數初值 iter_max = 200; % 最大迭代次數 Route_best = zeros(iter_max,n); % 各代最佳路徑 Length_best = zeros(iter_max,1); % 各代最佳路徑的長度 Length_ave = zeros(iter_max,1); % 各代路徑的平均長度 %%%%%%%%%%%%%%%%%%%%%%%%%迭代%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 迭代尋找最佳路徑 while iter <= iter_max% 隨機產生各個螞蟻的起點城市start = zeros(m,1);for i = 1:m %遍歷每一個螞蟻temp = randperm(n);%randperm(n)產生1-n的隨機序列start(i) = temp(1); %起始點賦值endTable(:,1) = start; %% Table路徑記錄表 citys_index = 1:n;% 逐個螞蟻路徑選擇for i = 1:m% 逐個城市路徑選擇for j = 2:ntabu = Table(i,1:(j - 1)); % 已訪問的城市集合(禁忌表)allow_index = ~ismember(citys_index,tabu);%取出未訪問過的城市索引 allow = citys_index(allow_index); % 待訪問的城市集合P = allow;% 計算城市間轉移概率for k = 1:length(allow)P(k) = Tau(tabu(end),allow(k))^alpha * Eta(tabu(end),allow(k))^beta;endP = P/sum(P);% 輪盤賭法選擇下一個訪問城市Pc = cumsum(P); target_index = find(Pc >= rand); target = allow(target_index(1));Table(i,j) = target;endend% 計算各個螞蟻的路徑距離Length = zeros(m,1);for i = 1:mRoute = Table(i,:);for j = 1:(n - 1)Length(i) = Length(i) + D(Route(j),Route(j + 1));endLength(i) = Length(i) + D(Route(n),Route(1));end% 計算最短路徑距離及平均距離if iter == 1[min_Length,min_index] = min(Length);Length_best(iter) = min_Length; Length_ave(iter) = mean(Length);Route_best(iter,:) = Table(min_index,:);else[min_Length,min_index] = min(Length);Length_best(iter) = min(Length_best(iter - 1),min_Length);Length_ave(iter) = mean(Length);if Length_best(iter) == min_LengthRoute_best(iter,:) = Table(min_index,:);elseRoute_best(iter,:) = Route_best((iter-1),:);endend% 更新信息素Delta_Tau = zeros(n,n);% 逐個螞蟻計算for i = 1:m% 逐個城市計算for j = 1:(n - 1)Delta_Tau(Table(i,j),Table(i,j+1)) = Delta_Tau(Table(i,j),Table(i,j+1)) + Q/Length(i);endDelta_Tau(Table(i,n),Table(i,1)) = Delta_Tau(Table(i,n),Table(i,1)) + Q/Length(i);endTau = (1-rho) * Tau + Delta_Tau;% 迭代次數加1,清空路徑記錄表iter = iter + 1;Table = zeros(m,n); end%% VI. 結果顯示 [Shortest_Length,index] = min(Length_best); Shortest_Route = Route_best(index,:); disp(['最短距離:' num2str(Shortest_Length)]); disp(['最短路徑:' num2str([Shortest_Route Shortest_Route(1)])]);%% VII. 繪圖 figure(1) plot([citys(Shortest_Route,1);citys(Shortest_Route(1),1)],...[citys(Shortest_Route,2);citys(Shortest_Route(1),2)],'o-'); grid on for i = 1:size(citys,1)text(citys(i,1),citys(i,2),[' ' num2str(i)]); end text(citys(Shortest_Route(1),1),citys(Shortest_Route(1),2),' 起點'); text(citys(Shortest_Route(end),1),citys(Shortest_Route(end),2),' 終點'); xlabel('城市位置橫坐標') ylabel('城市位置縱坐標') title(['蟻群算法優化路徑(最短距離:' num2str(Shortest_Length) ')']) figure(2) plot(1:iter_max,Length_best,'b',1:iter_max,Length_ave,'r:') legend('最短距離','平均距離') xlabel('迭代次數') ylabel('距離') title('各代最短距離與平均距離對比')

python求解

#!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Author: yudengwu(余登武) # @Date : 2021/5/28 #@email:1344732766@qq.com import numpy as np from tqdm import tqdm#進度條設置 import matplotlib.pyplot as plt import matplotlib as mpl import matplotlib; matplotlib.use('TkAgg') mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默認字體 mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示為方塊的問題 import math#====================距離文件================= C=[1304 ,2312,3639 ,1315,4177 ,2244,3712 ,1399,3488, 1535,3326, 1556,3238 ,1229,4196 ,1044,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,2376,3394 ,2643,3439,3201,2935,3240,3140,3550,2545,2357,2778,2826,2370 ,2975] #31個省會城市坐標 C=np.array(C).reshape(-1,2)#shape=(31, 2)#===============蟻群算法 TSP求解==================== class ACA_TSP(object):def __init__(self,C):self.C = C # 城市坐標self.AntCount = 100 #螞蟻數量self.city_count = self.C.shape[0] # 城市數量self.alpha = 1 # 信息素重要程度因子self.beta = 2 # 啟發函數重要程度因子self.rho = 0.1 # 揮發速度self.MAX_iter = 100 # 最大迭代次數self.Distance=self.calculate_distance(self.C[:,0], self.C[:,1])#任意兩個城市距離間隔矩陣 shape=(31, 31)self.Q = 1# 初始信息素矩陣,全是為1組成的矩陣self.pheromonetable = np.ones((self.city_count, self.city_count))# 候選集列表,存放100只螞蟻的路徑(一只螞蟻一個路徑),一共就Antcount個路徑,一共是螞蟻數量*31個城市數量self.candidate = np.zeros((self.AntCount, self.city_count)).astype(int)# path_best存放的是相應的,每次迭代后的最優路徑,每次迭代只有一個值self.path_best = np.zeros((self.MAX_iter, self.city_count))# 存放每次迭代的最優距離self.distance_best = np.zeros(self.MAX_iter)#城市間的距離def calculate_distance(self,X, Y):"""建立一個citycount-citycount二維數組,存放每對城市之間的距離.注意,因為要根據距離矩陣求啟發函數 η \eta ηij( η \eta ηij為城市i和城市j之間距離的倒數),所有距離矩陣的對角線不能為0,我把對角線設置為inf,其實只要不為零就可以。計算城市兩輛之間的歐式距離,結果用numpy矩陣存儲:param X: 城市的X坐標,np.array數組:param Y: 城市的Y坐標,np.array數組"""distance_matrix = np.zeros((self.city_count, self.city_count))for i in range(self.city_count):for j in range(self.city_count):if i == j:distance_matrix[i][j] = np.infelse:dis = np.sqrt((X[i] - X[j]) ** 2 + (Y[i] - Y[j]) ** 2) # 歐式距離計算distance_matrix[i][j] = disreturn distance_matrixdef main(self):# 倒數矩陣etable = 1.0 / self.Distancefor iter in tqdm(range(self.MAX_iter)):#遍歷每一次迭代# first:螞蟻初始點選擇if self.AntCount <= self.city_count:# np.random.permutation隨機排列一個數組的self.candidate[:, 0] = np.random.permutation(range(self.city_count))[:self.AntCount]else:m = self.AntCount - self.city_countn = 2self.candidate[:self.city_count, 0] = np.random.permutation(range(self.city_count))[:]while m > self.city_count:self.candidate[self.city_count * (n - 1):self.city_count * n, 0] = np.random.permutation(range(self.city_count))[:]m = m - self.city_countn = n + 1self.candidate[self.city_count * (n - 1):self.AntCount, 0] = np.random.permutation(range(self.city_count))[:m]length = np.zeros(self.AntCount) # 每次迭代的N個螞蟻的距離值# second:選擇下一個城市選擇for i in range(self.AntCount):#遍歷每一次螞蟻# 移除已經訪問的第一個元素unvisit = list(range(self.city_count)) # 列表形式存儲沒有訪問的城市編號visit = self.candidate[i, 0] # 當前所在點,第i個螞蟻在第一個城市unvisit.remove(visit) # 在未訪問的城市中移除當前開始的點for j in range(1, self.city_count): # 訪問剩下的city_count個城市,city_count次訪問protrans = np.zeros(len(unvisit)) # 每次循環都更改當前沒有訪問的城市的轉移概率矩陣1*30,1*29,1*28...# 下一城市的概率函數for k in range(len(unvisit)):# 計算當前城市到剩余城市的(信息素濃度^alpha)*(城市適應度的倒數)^beta# etable[visit][unvisit[k]],(alpha+1)是倒數分之一,pheromonetable[visit][unvisit[k]]是從本城市到k城市的信息素protrans[k] = np.power(self.pheromonetable[visit][unvisit[k]], self.alpha) * np.power(etable[visit][unvisit[k]], (self.alpha + 1))# 累計概率,輪盤賭選擇cumsumprobtrans = (protrans / sum(protrans)).cumsum()cumsumprobtrans -= np.random.rand()# 求出離隨機數產生最近的索引值k = unvisit[list(cumsumprobtrans > 0).index(True)]# 下一個訪問城市的索引值self.candidate[i, j] = kunvisit.remove(k)length[i] += self.Distance[visit][k]visit = k # 更改出發點,繼續選擇下一個到達點length[i] += self.Distance[visit][self.candidate[i, 0]] # 最后一個城市和第一個城市的距離值也要加進去"""更新路徑等參數"""# 如果迭代次數為一次,那么無條件讓初始值代替path_best,distance_best.if iter == 0:self.distance_best[iter] = length.min()self.path_best[iter] = self.candidate[length.argmin()].copy()else:# 如果當前的解沒有之前的解好,那么當前最優還是為之前的那個值;并且用前一個路徑替換為當前的最優路徑if length.min() > self.distance_best[iter - 1]:self.distance_best[iter] = self.distance_best[iter - 1]self.path_best[iter] = self.path_best[iter - 1].copy()else: # 當前解比之前的要好,替換當前解和路徑self.distance_best[iter] = length.min()self.path_best[iter] = self.candidate[length.argmin()].copy()"""信息素的更新"""# 信息素的增加量矩陣changepheromonetable = np.zeros((self.city_count, self.city_count))for i in range(self.AntCount):for j in range(self.city_count - 1):# 當前路徑比如城市23之間的信息素的增量:1/當前螞蟻行走的總距離的信息素changepheromonetable[self.candidate[i, j]][self.candidate[i][j + 1]] += self.Q / length[i]# Distance[candidate[i, j]][candidate[i, j + 1]]# 最后一個城市和第一個城市的信息素增加量changepheromonetable[self.candidate[i, j + 1]][self.candidate[i, 0]] += self.Q / length[i]# 信息素更新的公式:pheromonetable = (1 - self.rho) * self.pheromonetable + changepheromonetableprint("蟻群算法的最優路徑", self.path_best[-1] + 1)print("迭代", self.MAX_iter, "次后", "蟻群算法求得最優解", self.distance_best[-1])aca_tsp=ACA_TSP(C) aca_tsp.main()

算出來的不是最優解,目前我對離散蟻群算法理解還不是很深,所以寫出來的代碼可能不是很好。先這樣吧。

作者:余登武。一個電氣專業的計算機選手。原創不易,禁止轉載。

總結

以上是生活随笔為你收集整理的离散蚁群算法实例(求解旅行商问题)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 五月天激情国产综合婷婷婷 | 国产综合久久久久 | 日韩欧美中文在线观看 | 欧美夜夜操 | 女生毛片| 亚洲在线观看免费 | 国产精品白嫩极品美女 | 国内成人自拍视频 | 黄色大片免费的 | 天堂男人网| 精品一区二区久久久久蜜桃 | 婷婷导航 | 欧洲性生活视频 | 秋霞成人av | 欧美精品一二三四区 | 激情小说五月天 | av软件在线观看 | 国产国产乱老熟女视频网站97 | 亚洲少妇一区二区 | 成人不卡视频 | 国产精品一二三四区 | 精久久久久久久 | 中国zzji女人高潮免费 | 丁香婷婷激情 | 久久久久久欧美 | 99精品在线看| 中国黄色1级片 | 韩国无码av片在线观看网站 | 91午夜在线| 女人脱下裤子让男人桶 | 天堂av在线中文 | www.黄在线观看| av伊人久久 | 中文字幕av亚洲精品一部二部 | 丰满少妇一级 | 午夜视频福利在线观看 | 亚洲成人av免费观看 | 国产午夜精品在线观看 | 久久免费高清视频 | 玉足脚交榨精h文 | 999精品视频| 日日干日日射 | 悟空影视大全免费高清观看在线 | 国产黑丝精品 | 日韩欧美视频免费在线观看 | 欧美激情不卡 | 国产精品怡红院 | 亚洲AV无码成人精品国产一区 | 五月天堂婷婷 | 91片看 | 日韩成人免费观看 | 成人图片小说 | 91精品国产综合久久香蕉 | 午夜婷婷 | 成人视品 | 国产免费一区二区三区视频 | 国产又粗又硬又黄的视频 | 国产又粗又硬又长又爽的演员 | 91久久久国产精品 | 日本va欧美va国产激情 | 专干老肥女人88av | 精品91自产拍在线观看二区 | 国产a级免费 | 一区二区不卡视频 | 伊人激情在线 | wwwwxxx日本| 在线精品国产 | 国产xxxx性hd极品 | 闷骚老干部cao个爽 av九九九 | 日韩在线三区 | 日产mv免费观看 | 丰满人妻一区二区 | 成年人av在线 | 无码精品久久久久久久 | 日本免费一区二区三区四区五六区 | 亚洲欧美成人综合 | 汗汗视频 | 国产成人无码精品 | 精品久久久免费 | 少妇无内裤下蹲露大唇视频 | 超碰最新在线 | 97精品一区二区三区 | 懂色av一区二区三区在线播放 | 国产综合精品在线 | 色欲国产精品一区二区 | 强伦轩人妻一区二区电影 | 日本老师巨大bbw丰满 | 3d动漫精品啪啪一区二区免费 | 亚洲四区 | 亚洲美女色| 久久久久久久久久久久久女过产乱 | 亚洲精品视频导航 | 美女草逼视频 | 亚洲久久一区 | 日产精品一区二区 | 国av在线| 亚洲人成无码网站久久99热国产 | 日韩av女优在线观看 | 久久精品在线播放 |