免疫優化算法(Immune Optimization Algorithm, IOA)在物流配送中心選址中的應用是通過模擬免疫系統的進化過程來解決選址優化問題。物流配送中心選址問題涉及到如何在給定區域內選擇最優的位置,以最大化服務覆蓋并最小化運輸成本。
免疫優化算法概述
免疫優化算法是一種啟發式優化算法,其靈感來源于生物的免疫系統。該算法通常包括以下步驟:
免疫細胞表示:在算法中,解決方案被表示為抗原(antigen),而每個抗原具有一組特定的特征值或變量(例如潛在的配送中心位置)。克隆和突變:算法模仿免疫系統中的克隆和突變過程,通過復制和改變當前的最優解(抗體),以探索新的解決方案空間。免疫選擇:根據每個抗原的適應度(在物流選址中可以是服務范圍、成本等指標的綜合評價),選擇適應性較高的抗原作為下一代解決方案。進化過程:通過重復克隆、突變和選擇過程,逐步優化找到最優解決方案。主函數代碼
%% 免疫優化算法在物流配送中心選址中的應用
%% 清空環境
clc
clear
%% 算法基本參數
sizepop=50; % 種群規模
overbest=10; % 記憶庫容量
MAXGEN=100; % 迭代次數
pcross=0.5; % 交叉概率
pmutation=0.4; % 變異概率
ps=0.95; % 多樣性評價參數
length=6; % 配送中心數
M=sizepop+overbest;
%% step1 識別抗原,將種群信息定義為一個結構體
individuals = struct('fitness',zeros(1,M), 'concentration',zeros(1,M),'excellence',zeros(1,M),'chrom',[]);
%% step2 產生初始抗體群
individuals.chrom = popinit(M,length);
trace=[]; %記錄每代最個體優適應度和平均適應度
%% 迭代尋優
for iii=1:MAXGEN
%% step3 抗體群多樣性評價
for i=1:M
individuals.fitness(i) = fitness(individuals.chrom(i,:)); % 抗體與抗原親和度(適應度值)計算
individuals.concentration(i) = concentration(i,M,individuals); % 抗體濃度計算
end
% 綜合親和度和濃度評價抗體優秀程度,得出繁殖概率
individuals.excellence = excellence(individuals,M,ps);
% 記錄當代最佳個體和種群平均適應度
[best,index] = min(individuals.fitness); % 找出最優適應度
bestchrom = individuals.chrom(index,:); % 找出最優個體
average = mean(individuals.fitness); % 計算平均適應度
trace = [trace;best,average]; % 記錄
%% step4 根據excellence,形成父代群,更新記憶庫(加入精英保留策略,可由s控制)
bestindividuals = bestselect(individuals,M,overbest); % 更新記憶庫
individuals = bestselect(individuals,M,sizepop); % 形成父代群
%% step5 選擇,交叉,變異操作,再加入記憶庫中抗體,產生新種群
individuals = Select(individuals,sizepop); % 選擇
individuals.chrom = Cross(pcross,individuals.chrom,sizepop,length); % 交叉
individuals.chrom = Mutation(pmutation,individuals.chrom,sizepop,length); % 變異
individuals = incorporate(individuals,sizepop,bestindividuals,overbest); % 加入記憶庫中抗體
end
%% 畫出免疫算法收斂曲線
figure(1)
plot(trace(:,1));
hold on
plot(trace(:,2),'--');
legend('最優適應度值','平均適應度值')
title('免疫算法收斂曲線','fontsize',12)
xlabel('迭代次數','fontsize',12)
ylabel('適應度值','fontsize',12)
%% 畫出配送中心選址圖
%城市坐標
city_coordinate=[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];
carge=[20,90,90,60,70,70,40,90,90,70,60,40,40,40,20,80,90,70,100,50,50,50,80,70,80,40,40,60,70,50,30];
%找出最近配送點
for i=1:31
distance(i,:)=dist(city_coordinate(i,:),city_coordinate(bestchrom,:)');
end
[a,b]=min(distance');
index=cell(1,length);
for i=1:length
%計算各個派送點的地址
index{i}=find(b==i);
end
figure(2)
title('最優規劃派送路線')
cargox=city_coordinate(bestchrom,1);
cargoy=city_coordinate(bestchrom,2);
plot(cargox,cargoy,'rs','LineWidth',2,...
'MarkerEdgeColor','r',...
'MarkerFaceColor','b',...
'MarkerSize',20)
hold on
plot(city_coordinate(:,1),city_coordinate(:,2),'o','LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',10)
for i=1:31
x=[city_coordinate(i,1),city_coordinate(bestchrom(b(i)),1)];
y=[city_coordinate(i,2),city_coordinate(bestchrom(b(i)),2)];
plot(x,y,'c');hold on
end
結果圖
完整代碼獲取:https://mbd.pub/o/bread/ZpiVlJhw