MTSPV_GA可變多個(gè)旅行商問題(M - TSP)遺傳算法(GA)
找到了(附近)的M - TSP的變化(即具有最佳的解決方案 可變數(shù)量的推銷員)設(shè)立GA在搜索 的最短路徑(最小距離為推銷員需要前往 每個(gè)城市一次,并返回其起始位置) 摘要: 1。每個(gè)業(yè)務(wù)員一套獨(dú)特的城市,并完成 回城的路線,他開始從 2。每個(gè)城市訪問過的一個(gè)業(yè)務(wù)員 輸入: XY(浮動(dòng))是一個(gè)城市位置的NX2矩陣,其中N是城市數(shù)量 DMAT(浮動(dòng))是NxN的矩陣點(diǎn)的距離或成本點(diǎn) MIN_TOUR(標(biāo)量整數(shù))是任何推銷員的最低游覽長(zhǎng)度 POP_SIZE(標(biāo)量整數(shù))人口規(guī)模(應(yīng)該是能被4整除) NUM_ITER(標(biāo)量整數(shù))是算法運(yùn)行所需的迭代數(shù) 如果真正SHOW_PROG(標(biāo)量邏輯)顯示GA進(jìn)展 SHOW_RES(標(biāo)量邏輯)的GA結(jié)果顯示,如果為true 輸出: OPT_RTE(整型數(shù)組)是由算法發(fā)現(xiàn)的最佳途徑 OPT_BRK(整型數(shù)組)是路線破發(fā)點(diǎn)的名單(這些指定的指數(shù) 到用來獲取個(gè)人業(yè)務(wù)員路線路線) MIN_DIST(標(biāo)浮動(dòng))由推銷員走過的總距離 路由/斷點(diǎn)詳情: 如果有10個(gè)城市和3個(gè)推銷員,一個(gè)可能的途徑/休息 組合可能是:RTE = [5 6 9 1 4 2 8 10 3 7],brks = [3 7] 兩者合計(jì),這些代表的解決方案[5 6 9] [1 4 2 8] [10 3 7] 指定為如下3推銷員路線: 。業(yè)務(wù)員1旅游城市5到6日至9日,回到5 。業(yè)務(wù)員2旅游城市1至4日至2日至8回1 。業(yè)務(wù)員3旅游城市10至3日至7回10 function varargout = mtspv_ga(xy,dmat,min_tour,pop_size,num_iter,show_prog,show_res) % MTSPV_GA Variable Multiple Traveling Salesman Problem (M-TSP) Genetic Algorithm (GA) % Finds a (near) optimal solution to a variation of the M-TSP (that has a % variable number of salesmen) by setting up a GA to search for the % shortest route (least distance needed for the salesmen to travel to % each city exactly once and return to their starting locations) % % Summary: % 1. Each salesman travels to a unique set of cities and completes the % route by returning to the city he started from % 2. Each city is visited by exactly one salesman % % Input: % XY (float) is an Nx2 matrix of city locations, where N is the number of cities % DMAT (float) is an NxN matrix of point to point distances or costs % MIN_TOUR (scalar integer) is the minimum tour length for any of the salesmen % POP_SIZE (scalar integer) is the size of the population (should be divisible by 4) % NUM_ITER (scalar integer) is the number of desired iterations for the algorithm to run % SHOW_PROG (scalar logical) shows the GA progress if true % SHOW_RES (scalar logical) shows the GA results if true % % Output: % OPT_RTE (integer array) is the best route found by the algorithm % OPT_BRK (integer array) is the list of route break points (these specify the indices % into the route used to obtain the individual salesman routes) % MIN_DIST (scalar float) is the total distance traveled by the salesmen % % Route/Breakpoint Details: % If there are 10 cities and 3 salesmen, a possible route/break % combination might be: rte = [5 6 9 1 4 2 8 10 3 7], brks = [3 7] % Taken together, these represent the solution [5 6 9][1 4 2 8][10 3 7], % which designates the routes for the 3 salesmen as follows: % . Salesman 1 travels from city 5 to 6 to 9 and back to 5 % . Salesman 2 travels from city 1 to 4 to 2 to 8 and back to 1 % . Salesman 3 travels from city 10 to 3 to 7 and back to 10 % % Example: % n = 35; % xy = 10*rand(n,2); % min_tour = 3; % pop_size = 40; % num_iter = 5e3; % a = meshgrid(1:n); % dmat = reshape(sqrt(sum((xy(a,:)-xy(a',:)).^2,2)),n,n); % [opt_rte,opt_brk,min_dist] = mtspv_ga(xy,dmat,min_tour,pop_size,num_iter,1,1); % % Author: Joseph Kirk % Email: jdkirk630@gmail.com % Release: 1.1 % Release Date: 9/21/08 % Process Inputs and Initialize Defaults
nargs = 7; for k = nargin:nargs-1 switch k case 0 xy = 10*rand(40,2); case 1 N = size(xy,1); a = meshgrid(1:N); dmat = reshape(sqrt(sum((xy(a,:)-xy(a',:)).^2,2)),N,N); case 2 min_tour = 3; case 3 pop_size = 80; case 4 num_iter = 5e3; case 5 show_prog = 1; case 6 show_res = 1; otherwise end end % Verify Inputs
N = size(xy,1); [nr,nc] = size(dmat); if N ~= nr || N ~= nc error('Invalid XY or DMAT inputs!') end n = N; % Sanity Checks
min_tour = max(1,min(n,round(real(min_tour(1))))); pop_size = max(8,8*ceil(pop_size(1)/8)); num_iter = max(1,round(real(num_iter(1)))); show_prog = logical(show_prog(1)); show_res = logical(show_res(1)); % Initialize the Populations
pop_rte = zeros(pop_size,n); % population of routes pop_brk = cell(pop_size,1); % population of breaks for k = 1:pop_size pop_rte(k,:) = randperm(n); pop_brk{k} = randbreak(); end tmp_pop_rte = zeros(8,n); tmp_pop_brk = cell(8,1); new_pop_rte = zeros(pop_size,n); new_pop_brk = cell(pop_size,1); % Select the Colors for the Plotted Routes
clr = hsv(floor(n/min_tour)); % Run the GA
global_min = Inf; total_dist = zeros(1,pop_size); dist_history = zeros(1,num_iter); if show_prog pfig = figure('Name','MTSPV_GA | Current Best Solution','Numbertitle','off'); end for iter = 1:num_iter % Evaluate Each Population Member (Calculate Total Distance) for p = 1:pop_size d = 0; p_rte = pop_rte(p,:); p_brk = pop_brk{p}; salesmen = length(p_brk)+1; rng = [[1 p_brk+1];[p_brk n]]'; for s = 1:salesmen d = d + dmat(p_rte(rng(s,2)),p_rte(rng(s,1))); for k = rng(s,1):rng(s,2)-1 d = d + dmat(p_rte(k),p_rte(k+1)); end end total_dist(p) = d; end % Find the Best Route in the Population
[min_dist,index] = min(total_dist); dist_history(iter) = min_dist; if min_dist < global_min global_min = min_dist; opt_rte = pop_rte(index,:); opt_brk = pop_brk{index}; salesmen = length(opt_brk)+1; rng = [[1 opt_brk+1];[opt_brk n]]'; if show_prog % Plot the Best Route figure(pfig); for s = 1:salesmen rte = opt_rte([rng(s,1):rng(s,2) rng(s,1)]); plot(xy(rte,1),xy(rte,2),'.-','Color',clr(s,:)); title(sprintf(['Total Distance = %1.4f, Salesmen = %d, ' ... 'Iterations = %d'],min_dist,salesmen,iter)); hold on end hold off end end % Genetic Algorithm Operators
rand_grouping = randperm(pop_size); for p = 8:8:pop_size rtes = pop_rte(rand_grouping(p-7:p),:); brks = pop_brk(rand_grouping(p-7:p)); dists = total_dist(rand_grouping(p-7:p)); [ignore,idx] = min(dists); best_of_8_rte = rtes(idx,:); best_of_8_brk = brks{idx}; rte_ins_pts = sort(ceil(n*rand(1,2))); I = rte_ins_pts(1); J = rte_ins_pts(2); for k = 1:8 % Generate New Solutions tmp_pop_rte(k,:) = best_of_8_rte; tmp_pop_brk{k} = best_of_8_brk; switch k case 2 % Flip tmp_pop_rte(k,I:J) = fliplr(tmp_pop_rte(k,I:J)); case 3 % Swap tmp_pop_rte(k,[I J]) = tmp_pop_rte(k,[J I]); case 4 % Slide tmp_pop_rte(k,I:J) = tmp_pop_rte(k,[I+1:J I]); case 5 % Change Breaks tmp_pop_brk{k} = randbreak(); case 6 % Flip, Change Breaks tmp_pop_rte(k,I:J) = fliplr(tmp_pop_rte(k,I:J)); tmp_pop_brk{k} = randbreak(); case 7 % Swap, Change Breaks tmp_pop_rte(k,[I J]) = tmp_pop_rte(k,[J I]); tmp_pop_brk{k} = randbreak(); case 8 % Slide, Change Breaks tmp_pop_rte(k,I:J) = tmp_pop_rte(k,[I+1:J I]); tmp_pop_brk{k} = randbreak(); otherwise % Do Nothing end end new_pop_rte(p-7:p,:) = tmp_pop_rte; new_pop_brk(p-7:p) = tmp_pop_brk; end pop_rte = new_pop_rte; pop_brk = new_pop_brk; end if show_res
% Plots figure('Name','MTSPV_GA | Results','Numbertitle','off'); subplot(2,2,1); plot(xy(:,1),xy(:,2),'k.'); title('City Locations'); subplot(2,2,2); imagesc(dmat(opt_rte,opt_rte)); title('Distance Matrix'); salesmen = length(opt_brk)+1; subplot(2,2,3); rng = [[1 opt_brk+1];[opt_brk n]]'; for s = 1:salesmen rte = opt_rte([rng(s,1):rng(s,2) rng(s,1)]); plot(xy(rte,1),xy(rte,2),'.-','Color',clr(s,:)); title(sprintf('Total Distance = %1.4f',min_dist)); hold on; end subplot(2,2,4); plot(dist_history,'b','LineWidth',2) title('Best Solution History'); set(gca,'XLim',[0 num_iter+1],'YLim',[0 1.1*max([1 dist_history])]); end % Return Outputs
if nargout varargout{1} = opt_rte; varargout{2} = opt_brk; varargout{3} = min_dist; end % Generate Random Set of Breaks
function breaks = randbreak() salesmen = ceil(floor(n/min_tour)*rand); num_brks = salesmen - 1; dof = n - min_tour*salesmen; % degrees of freedom addto = ones(1,dof+1); for kk = 2:num_brks addto = cumsum(addto); end cum_prob = cumsum(addto)/sum(addto); num_adjust = find(rand < cum_prob,1)-1; spaces = ceil(num_brks*rand(1,num_adjust)); adjust = zeros(1,num_brks); for kk = 1:num_brks adjust(kk) = sum(spaces == kk); end breaks = min_tour*(1:num_brks) + cumsum(adjust); end end |
|