TSP問題中產(chǎn)生新解的方法
(1)交換法:隨機(jī)選擇兩個點(diǎn),交換這兩個點(diǎn)的位置

(2)移位法:隨機(jī)選擇三個點(diǎn),將前兩個點(diǎn)之間的點(diǎn)移位到第三個點(diǎn)后

(3)倒置法:隨機(jī)選擇兩個點(diǎn),將這兩個點(diǎn)之間的順序完全顛倒

(4)整塊交換法:隨機(jī)選擇四個點(diǎn),將前兩個點(diǎn)之間的元素和后兩個點(diǎn)之間的元素交換位置

附四種方法的代碼:
function [path1,kind,cc] = gen_new_path(path0,varargin)
? ?% path0: 原來的路徑
? ?n = length(path0);
? ?if nargin == 1
? ? ? ?p1 = 0.25; ?% 使用交換法產(chǎn)生新路徑的概率
? ? ? ?p2 = 0.25; ?% 使用移位法產(chǎn)生新路徑的概率
? ? ? ?p3 = 0.25; ?% 使用倒置法產(chǎn)生新路徑的概率
? ?else
? ? ? ?p1 = varargin{1}; ?% 使用交換法產(chǎn)生新路徑的概率
? ? ? ?p2 = varargin{2}; ?% 使用移位法產(chǎn)生新路徑的概率
? ? ? ?p3 = varargin{3}; ?% 使用倒置法產(chǎn)生新路徑的概率
? ?end
? ?% 剩下的概率就是整塊交換法的概率
? ?% 根據(jù)上述概率隨機(jī)選擇產(chǎn)生新路徑的方法
? ?r = rand(1); % 隨機(jī)生成一個[0 1]間均勻分布的隨機(jī)數(shù)
? ?if ?r< p1 ? ?% 使用交換法產(chǎn)生新路徑
? ? ? ?c1 = randi(n); ? % 生成1-n中的一個隨機(jī)整數(shù)
? ? ? ?c2 = randi(n); ? % 生成1-n中的一個隨機(jī)整數(shù)
? ? ? ?path1 = path0; ?% 將path0的值賦給path1
? ? ? ?path1(c1) = path0(c2); ?%改變path1第c1個位置的元素為path0第c2個位置的元素
? ? ? ?path1(c2) = path0(c1); ?%改變path1第c2個位置的元素為path0第c1個位置的元素
? ? ? ?kind = 1;
? ? ? ?cc{1} = c1;
? ? ? ?cc{2} = c2;
? ?elseif r < p1+p2 % 使用移位法產(chǎn)生新路徑
? ? ? ?c1 = randi(n); ? % 生成1-n中的一個隨機(jī)整數(shù)
? ? ? ?c2 = randi(n); ? % 生成1-n中的一個隨機(jī)整數(shù)
? ? ? ?c3 = randi(n); ? % 生成1-n中的一個隨機(jī)整數(shù)
? ? ? ?sort_c = sort([c1 c2 c3]); ?% 對c1 c2 c3從小到大排序
? ? ? ?c1 = sort_c(1); ?c2 = sort_c(2); ?c3 = sort_c(3); ?% c1 < = c2 <= ?c3
? ? ? ?tem1 = path0(1:c1-1);
? ? ? ?tem2 = path0(c1:c2);
? ? ? ?tem3 = path0(c2+1:c3);
? ? ? ?tem4 = path0(c3+1:end);
? ? ? ?path1 = [tem1 tem3 tem2 tem4];
? ? ? ?kind = 2;
? ? ? ?cc{1} = c1;
? ? ? ?cc{2} = c2;
? ? ? ?cc{3} = c3;
? ?elseif r < p1+p2+p3 ?% 使用倒置法產(chǎn)生新路徑
? ? ? ?c1 = randi(n); ? % 生成1-n中的一個隨機(jī)整數(shù)
? ? ? ?c2 = randi(n); ? % 生成1-n中的一個隨機(jī)整數(shù)
? ? ? ?if c1>c2 ?% 如果c1比c2大,就交換c1和c2的值
? ? ? ? ? ?tem = c2;
? ? ? ? ? ?c2 = c1;
? ? ? ? ? ?c1 = tem;
? ? ? ?end
? ? ? ?tem1 = path0(1:c1-1);
? ? ? ?tem2 = path0(c1:c2);
? ? ? ?tem3 = path0(c2+1:end);
? ? ? ?path1 = [tem1 fliplr(tem2) tem3]; ? %矩陣的左右對稱翻轉(zhuǎn) fliplr,上下對稱翻轉(zhuǎn) flipud
? ? ? ?kind = 3;
? ? ? ?cc{1} = c1;
? ? ? ?cc{2} = c2;
? ?else ?% 整塊交換法
? ? ? ?c1 = randi(n); ? % 生成1-n中的一個隨機(jī)整數(shù)
? ? ? ?c2 = randi(n); ? % 生成1-n中的一個隨機(jī)整數(shù)
? ? ? ?c3 = randi(n); ? % 生成1-n中的一個隨機(jī)整數(shù)
? ? ? ?c4 = randi(n); ? % 生成1-n中的一個隨機(jī)整數(shù)
? ? ? ?sort_c = sort([c1 c2 c3 c4]); ?% 對c1 c2 c3從小到大排序
? ? ? ?c1 = sort_c(1); ?c2 = sort_c(2); ?c3 = sort_c(3); ? c4 = sort_c(4);% c1 < = c2 <= ?c3<= ?c4
? ? ? ?tem1 = path0(1:c1-1);
? ? ? ?tem2 = path0(c1:c2);
? ? ? ?tem3 = path0(c2+1:c3);
? ? ? ?tem4 = path0(c3+1:c4);
? ? ? ?tem5 = path0(c4+1:end);
? ? ? ?path1 = [tem1 tem4 tem3 tem2 tem5];
? ? ? ?kind = 4;
? ? ? ?cc{1} = c1;
? ? ? ?cc{2} = c2;
? ? ? ?cc{3} = c3;
? ? ? ?cc{4} = c4;
? ?end
end