1. 程式人生 > 其它 >【路徑規劃】基於nsga-II求解tsp問題matlab原始碼

【路徑規劃】基於nsga-II求解tsp問題matlab原始碼

一、tsp問題

TSP問題即旅行商問題,經典的TSP可以描述為:一個商品推銷員要去若干個城市推銷商品,該推銷員從一個城市出發,需要經過所有城市後,回到出發地。應如何選擇行進路線,以使總的行程最短。從圖論的角度來看,該問題實質是在一個帶權完全無向圖中,找一個權值最小的哈密爾頓迴路。

旅行商問題有很多種不同的問法,最近做了幾個關於TSP的題,下面總結一下。由於大部分TSP問題都是NP-Hard的,因此很難得到什麼高效的多項式級別的演算法,一般採用的演算法都偏向於暴力搜尋以及狀壓DP,這裡都採取用狀壓DP解決。大部分TSP問題所給的地點數目都非常小。

考慮經典的TSP問題,如果採用狀壓DP,將每個地點訪問與否作為二進位制1/0壓縮,不難得到狀態轉移方程:
dp[S][i] = min(dp[S][i], dp[S ^ (1 << (i - 1))][k] + dist[k][i])
S代表當前狀態,i(從1開始)表示到達當前狀態時最後訪問的是第i個地點
k為S中所有訪問的與i不同的地點。
dist表示兩點間最短路。
以及初始化:
DP[S][i] = dist[start][i](S == 1<<(i - 1))
如果初次遇到狀壓dp,感到陌生的話,就請仔細思考上面式子的含義,這是大部分TSP問題的關鍵。

二、nsga-II演算法

1 NSGA演算法

1.1Paerot支配關係

1.2 Pareto最優解定義

多目標優化問題與單目標優化問題有很大差異。當只有一個目標函式時,人們尋找最好的解,這個解優於其他所有解,通常是全域性最大或最小,即全域性最優解。而當存在多個目標時,由於目標之間存在衝突無法比較,所以很難找到一個解使得所有的目標函式同時最優,也就是說,一個解可能對於某個目標函式是最好的,但對於其他的目標函式卻不是最好的,甚至是最差的。因此,對於多目標優化問題,通常存在一個解集,這些解之間就全體目標函式而言是無法比較優劣的,其特點是:無法在改進任何目標函式的同時不削弱至少一個其他目標函式。這種解稱作非支配解(nondominated soluitons)或Pareto最優解(Pareto optimalSoluitons),定義如下:

也即沒有其他值可以支配Xu。

2、NSGA一般流程

NSGA採用的非支配分層方法,可以使好的個體有更大的機會遺傳到下一代;適應度共享策略則使得準Pareto面上的個體均勻分佈,保持了群體多樣性,克服了超級個體的過度繁殖,防止了早熟收斂。流程圖如下:

NSGA與簡單的遺傳演算法的主要區別在於:該演算法在選擇運算元執行之前根據個體之間的支配關係進行了分層。其選擇運算元、交叉運算元和變異運算元與簡單遺傳演算法沒有區別。

從圖中可以看到,演算法首先判斷種群是否全部分級,如果已經全部分級,則在分級的基礎上,使用基於擁擠策略的小生境(NIChe)技術對虛擬適應度值進行調整,並確定每個種群的虛擬適應度值,然後根據虛擬適應度值的大小,確定優先選擇進行處理的種群(遺傳演算法)。

2.1非支配排序

考慮一個目標函式個數為K(K>1)、規模大小為N的種群,通過非支配排序演算法可以對該種群進行分層,具體的步驟如下:

通過上述步驟得到的非支配個體集是種群的第一級非支配層;然後,忽略這些標記的非支配個體,再遵循步驟(1)一(4),就會得到第二級非支配;依此類推,直到整個種群被分類。

2.2虛擬適應度值的確定

在對種群進行非支配排序的過程中,需要給每一個非支配層指定一個虛擬適應度值。級數越大,虛擬適應度值越小;反之,虛擬適應度值越大。這樣可以保證在選擇操作中等級較低的非支配個體有更多的機會被選擇進入下一代,使得演算法以最快的速度收斂於最優區域。另一方面,為了得到分佈均勻的Pareto最優解集,就要保證當前非支配層上的個體具有多樣性。NSGA中引入了基於擁擠策略的小生境(NIChe)技術,即通過適應度共享函式的方法對原先指定的虛擬適應度值進行重新指定。

3、NSGAII演算法

NSGA一II演算法的基本思想為:首先,隨機產生規模為N的初始種群,非支配排序後通過遺傳演算法的選擇、交叉、變異三個基本操作得到第一代子代種群;其次,從第二代開始,將父代種群與子代種群合併,進行快速非支配排序,同時對每個非支配層中的個體進行擁擠度計算,根據非支配關係以及個體的擁擠度選取合適的個體組成新的父代種群;最後,通過遺傳演算法的基本操作產生新的子代種群:依此類推,直到滿足程式結束的條件。相應的程式流程圖如下圖所示。

3.1 快速非支配排序演算法

3.2 擁擠度和擁擠度比較運算元

擠度是指種群中給定個體的周圍個體的密度,直觀上可表示為個體。周圍僅僅包含個體。本身的最大長方形的長,用nd表示,

擁擠度的演算法如下:

3.3擁擠度比較運算元

三、部分程式碼

% function NSGA_2
clc;clear;
tic;
%% 初始化
PopSize=200;%種群大小 
MaxIteration =300;%最大迭代次數
R=50;
% location1=load('location1_100.txt');%優化100個城市
% location2=load('A_location2_100.txt');
location1=load('location1.txt');
location2=load('location2.txt');
CityNum =size(location1,2);%城市數
V=CityNum;
M=2;
pc=0.8;pm=0.9;
for i=1:PopSize
    chromosome(i,1:CityNum)=randperm(CityNum);
    chromosome(i,CityNum+1:CityNum+2)=costfunction(chromosome(i,1:CityNum),location1,location2);
end
chromosome= non_domination_sort_mod(chromosome);%將解分  最後一列為擁擠度 倒數第二列為分級數
index=find(chromosome(:,103)==1);
costrep=chromosome(index,101:102);%第一級即非劣解

%% 主迴圈
pool = round(PopSize/2);  %突變池規模

for Iteration=1:MaxIteration
    if ~mod(Iteration,10)
        fprintf('current iter:%d\n',Iteration)
        disp([' Number of Repository Particles = ' num2str(size(costrep,1))]);

            scro(2,m1)=tt;
        end
        scro_cost(1,:)=costfunction(scro(1,:),location1,location2);
        scro_cost(2,:)=costfunction(scro(2,:),location1,location2);
        offspring_var=[offspring_var;scro];%解
        offspring_cost=[offspring_cost;scro_cost];%適應度
        
    end
    offspring_chromosome(:,1:V)=offspring_var;
    offspring_chromosome(:,V+1:V+M)=offspring_cost;
    
    main_pop = size(chromosome,1);
    offspring_pop = size(offspring_chromosome,1);
    intermediate_chromosome(1:main_pop,:) = chromosome;
    intermediate_chromosome(main_pop + 1 :main_pop + offspring_pop,1 : M+V) = ...
        offspring_chromosome;
    intermediate_chromosome = ...
        non_domination_sort_mod(intermediate_chromosome);
    %% 選擇
    
    chromosome = replace_chromosome(intermediate_chromosome,PopSize);
    
    
    index=find(intermediate_chromosome(:,103)==1);
    costrep=intermediate_chromosome(index,101:102);
    cost=intermediate_chromosome(:,101:102);
        if ~mod(Iteration,1)
    
            figure (1)
            plot(costrep(:,1),costrep(:,2),'r*',cost(:,1),cost(:,2),'kx');
            xlabel('F1');ylabel('F2');
            title(strcat('Interaction ',num2str(Iteration), ' Pareto non-dominated solutions'));
            %          hold on
        end
    if ~mod(Iteration,MaxIteration)
        %             if ~mod(Iteration,1)
        fun_pf=costrep;
        [fun_pf,~]=sortrows(fun_pf,1);
        plot(fun_pf(:,1),fun_pf(:,2),'k*-');
        title(strcat('Interaction ',num2str(Iteration), ' Pareto non-dominated solutions'));
        hold on;
        grid on;
    end
end

四、模擬結果

五、參考文獻

[1]劉勝軍,耿煥同,謝飛.新型定向交叉在NSGA-Ⅱ求解多目標TSP問題中的應用[J].電子技術與軟體工程,2017(06):154.