**
遗传算法求解多旅行商问题
**
由单个起点回到该起点
距离矩阵.txt
0 0.253811887383951 0.242535043507850 0.512925698596292 0.414928487147296 0.396590526618182 0.878630770364692 0.652554912507814 0.626783228597083 0.535474336304776 0.536909612456887 0.952569801696550 0.758701362514837 0.780215349463893 1.24901423356044 1.03930111103319 0.953702663110730 0.409252062102601 0.861125692919666 0.803865530824578 0.515668655909866 0.671187770843502 0.793510628384868 1.00282353086678 1.22243047384930 1.35789479912949 1.48471872590703 1.47892426664312 1.05199317954197 1.11135862809190
0.253811887383951 0 0.177186610855972 0.745795918739373 0.659929736280264 0.517356010343794 0.645619791860937 0.398800498608444 0.480994966311193 0.305688599497018 0.543465884492549 0.760622578479291 0.666273933677185 0.811643916197344 1.05169694033049 0.910368042013103 0.925093175172293 0.432428732106602 0.669273022552701 0.732010739838164 0.384202357133464 0.852937827383459 1.02841587149239 1.20500009080318 1.45806165184153 1.20030864257733 1.42162152785310 1.42902104432511 1.30508692057101 1.15169262617798
0.242535043507850 0.177186610855972 0 0.636986348990561 0.645644234279461 0.352340395992675 0.659892347057167 0.495009660145279 0.384792678085549 0.326854372241941 0.369691976350368 0.711917568686030 0.532654761305047 0.636746539676047 1.00847124475999 0.803069214446578 0.765106587544341 0.568648062568089 0.839468970704627 0.902807121156356 0.560133489386443 0.911202676349650 1.02859747834386 1.24535450113960 1.45522265009438 1.37538157072187 1.59357469804042 1.27981874169819 1.25431970895813 1.29292888386720
0.512925698596292 0.745795918739373 0.636986348990561 0 0.386074405729105 0.386604553817163 1.27818847546264 1.12761084145325 0.916813215994415 0.961124708267124 0.629081634174042 1.26362250730732 0.930945350548504 0.717651685120957 1.54617041266408 1.22291952434512 0.963780269149043 0.840384025718279 1.37201297537444 1.25528670346692 1.01706460269490 0.770348169548293 0.644166648494074 0.957010592292766 0.996902253625886 1.85099509914277 1.89603241463489 1.45802369465411 0.684395940309548 1.41241171180371
0.414928487147296 0.659929736280264 0.645644234279461 0.386074405729105 0 0.603189465101538 1.29354221060054 1.05466240527238 1.01697065615116 0.950387813507750 0.831958987391791 1.35570296826868 1.10848061474488 1.00788173702373 1.65189155154449 1.40249865378073 1.23144954213924 0.547713341844000 1.15399367854321 0.943424654679306 0.787056875755586 0.389035180614302 0.383814541877341 0.638169572760469 0.809647026715821 1.57026397701526 1.54163065698288 1.75223167462468 0.658208831549288 1.03100798715949
0.396590526618182 0.517356010343794 0.352340395992675 0.386604553817163 0.603189465101538 0 0.921326524593819 0.832383279628023 0.538421373926706 0.635944472597480 0.246294707626871 0.881425060716203 0.546464679889532 0.411139631669009 1.16054271052221 0.840916172968845 0.628306722710920 0.805827160641161 1.18660740303932 1.19447638186151 0.879498576456392 0.967986903222918 0.959741489542351 1.24043256028508 1.35361066296092 1.71418396311366 1.87959342544112 1.15001511137726 1.06873500573507 1.49669207024472
0.878630770364692 0.645619791860937 0.659892347057167 1.27818847546264 1.29354221060054 0.921326524593819 0 0.335762090187427 0.407573616259723 0.343497781964380 0.748838838180556 0.261512962879987 0.565523504689343 0.932335337349007 0.463995988440015 0.572364200075994 0.863474859754117 1.01553674922038 0.801214922797599 1.13218626287940 0.814171137474314 1.49243322428276 1.67009303475586 1.84839494945239 2.09974639865356 1.29913545384161 1.73346996217164 1.19606641190698 1.91419842358840 1.66014133311071
0.652554912507814 0.398800498608444 0.495009660145279 1.12761084145325 1.05466240527238 0.832383279628023 0.335762090187427 0 0.477849075869788 0.215373250850705 0.745194385874832 0.556994425339938 0.695060502394917 0.990278043255984 0.798530711325024 0.822252823607518 1.00574691851699 0.697516799493143 0.507649439465737 0.799055089299018 0.479619972440451 1.19758037821407 1.41332588203584 1.55811854584556 1.84091598329789 1.04375483592875 1.42254320058368 1.42953826416381 1.70363902947221 1.32441575457509
0.626783228597083 0.480994966311193 0.384792678085549 0.916813215994415 1.01697065615116 0.538421373926706 0.407573616259723 0.477849075869788 0 0.278187943848748 0.342454125455535 0.348460960302249 0.219603953779853 0.536780156584609 0.639630030059290 0.429402481193841 0.528054205249667 0.913392400545545 0.970911931102324 1.17207323705722 0.815043780663036 1.29579875482518 1.40056220768470 1.62893691269791 1.82193624462406 1.51577414619392 1.84401693056883 0.979343236233052 1.58442298186216 1.62939630884483
0.535474336304776 0.305688599497018 0.326854372241941 0.961124708267124 0.950387813507750 0.635944472597480 0.343497781964380 0.215373250850705 0.278187943848748 0 0.530611708524951 0.467701124006709 0.497675660676607 0.775327099258353 0.751635803735627 0.672065300799685 0.803071912685886 0.707440972701354 0.693106943914202 0.911446153156064 0.559395776818548 1.15805212121776 1.32662766641792 1.51068030836783 1.75625850088501 1.23903910318722 1.57258512345310 1.25345748941885 1.57727930230008 1.39773088969667
0.536909612456887 0.543465884492549 0.369691976350368 0.629081634174042 0.831958987391791 0.246294707626871 0.748838838180556 0.745194385874832 0.342454125455535 0.530611708524951 0 0.662412746663747 0.301916357686213 0.268484418810363 0.928797747209684 0.594885097137343 0.417528899181838 0.924791515269031 1.17860745385307 1.27249792784532 0.927632820323918 1.17643145606007 1.19932203633939 1.46964804082456 1.59861950435994 1.72380448415337 1.96325437805932 0.944130373966284 1.31310251980213 1.64338378397910
0.952569801696550 0.760622578479291 0.711917568686030 1.26362250730732 1.35570296826868 0.881425060716203 0.261512962879987 0.556994425339938 0.348460960302249 0.467701124006709 0.662412746663747 0 0.400694287801145 0.779667761748195 0.296556446355143 0.317375711608068 0.656516703495341 1.17504285775933 1.05059980134542 1.35104860267543 1.01237188121672 1.60878828051747 1.73938610148668 1.95288967711441 2.16394330095167 1.55889916080941 1.97730991656455 0.938487578935088 1.93286767645972 1.85877887515436
0.758701362514837 0.666273933677185 0.532654761305047 0.930945350548504 1.10848061474488 0.546464679889532 0.565523504689343 0.695060502394917 0.219603953779853 0.497675660676607 0.301916357686213 0.400694287801145 0 0.379787574835485 0.638287718037815 0.296356953937987 0.312269899891039 1.09387106793838 1.19051582132443 1.37999138331647 1.02254510357287 1.42642568296535 1.48487874732097 1.74024802096226 1.89233474932970 1.73514890916545 2.05764786136445 0.767650662799213 1.61474029237183 1.81695332916564
0.780215349463893 0.811643916197344 0.636746539676047 0.717651685120957 1.00788173702373 0.411139631669009 0.932335337349007 0.990278043255984 0.536780156584609 0.775327099258353 0.268484418810363 0.779667761748195 0.379787574835485 0 0.994706459681419 0.596106848390079 0.250734128193871 1.18080561759649 1.44246038577804 1.53888092333947 1.19584594045860 1.37872637622921 1.34601478610949 1.64038520289317 1.71455297354233 1.98904071343676 2.22979736745377 0.746970151266463 1.38282596277622 1.89154479517240
1.24901423356044 1.05169694033049 1.00847124475999 1.54617041266408 1.65189155154449 1.16054271052221 0.463995988440015 0.798530711325024 0.639630030059290 0.751635803735627 0.928797747209684 0.296556446355143 0.638287718037815 0.994706459681419 0 0.414899258669753 0.814811238699875 1.45654281239925 1.25363814377507 1.59617386122303 1.27351870610235 1.90270046879930 2.03564520299005 2.24855098981110 2.45960507841371 1.71981031311017 2.18726290115220 0.928225532280122 2.22136747463655 2.12128580951920
1.03930111103319 0.910368042013103 0.803069214446578 1.22291952434512 1.40249865378073 0.840916172968845 0.572364200075994 0.822252823607518 0.429402481193841 0.672065300799685 0.594885097137343 0.317375711608068 0.296356953937987 0.596106848390079 0.414899258669753 0 0.400109402007058 1.34271113655140 1.32919028501419 1.58349541224948 1.23005082362811 1.71027922857669 1.78038582441697 2.03122151616660 2.18869146000535 1.85454829913983 2.23872593945019 0.623781663539243 1.90730276221323 2.05657547206924
0.953702663110730 0.925093175172293 0.765106587544341 0.963780269149043 1.23144954213924 0.628306722710920 0.863474859754117 1.00574691851699 0.528054205249667 0.803071912685886 0.417528899181838 0.656516703495341 0.312269899891039 0.250734128193871 0.814811238699875 0.400109402007058 0 1.33226754608361 1.49550492784515 1.65501067032889 1.30033568947974 1.58909029972355 1.58259173402459 1.86863531095303 1.95993121864551 2.04209047233874 2.34099702579344 0.526985596729155 1.63316544734187 2.05491098650794
0.409252062102601 0.432428732106602 0.568648062568089 0.840384025718279 0.547713341844000 0.805827160641161 1.01553674922038 0.697516799493143 0.913392400545545 0.707440972701354 0.924791515269031 1.17504285775933 1.09387106793838 1.18080561759649 1.45654281239925 1.34271113655140 1.33226754608361 0 0.624023740784863 0.415046096843557 0.273169193386185 0.522428136393275 0.806759025952159 0.881186233416665 1.20965424711041 1.02519700875516 1.07932962003922 1.84839697234199 1.17868246708681 0.724455321723777
0.861125692919666 0.669273022552701 0.839468970704627 1.37201297537444 1.15399367854321 1.18660740303932 0.801214922797599 0.507649439465737 0.970911931102324 0.693106943914202 1.17860745385307 1.05059980134542 1.19051582132443 1.44246038577804 1.25363814377507 1.32919028501419 1.49550492784515 0.624023740784863 0 0.429310610550151 0.367206471320024 1.12451504389132 1.42965422194989 1.46748954359623 1.82264750091251 0.547974538384343 0.933732074470715 1.93641633368025 1.79998642520639 0.976944113450559
0.803865530824578 0.732010739838164 0.902807121156356 1.25528670346692 0.943424654679306 1.19447638186151 1.13218626287940 0.799055089299018 1.17207323705722 0.911446153156064 1.27249792784532 1.35104860267543 1.37999138331647 1.53888092333947 1.59617386122303 1.58349541224948 1.65501067032889 0.415046096843557 0.429310610550151 0 0.357488991322594 0.789359424277861 1.12814819292407 1.09857142361296 1.47971496114572 0.637405971349118 0.690918513838625 2.14763821184370 1.53193220639582 0.552278649397433
0.515668655909866 0.384202357133464 0.560133489386443 1.01706460269490 0.787056875755586 0.879498576456392 0.814171137474314 0.479619972440451 0.815043780663036 0.559395776818548 0.927632820323918 1.01237188121672 1.02254510357287 1.19584594045860 1.27351870610235 1.23005082362811 1.30033568947974 0.273169193386185 0.367206471320024 0.357488991322594 0 0.794076832077647 1.07651106558538 1.15050562755660 1.48271256209378 0.842533632780032 1.04084982764590 1.79017957459317 1.43605274105727 0.848125660176736
0.671187770843502 0.852937827383459 0.911202676349650 0.770348169548293 0.389035180614302 0.967986903222918 1.49243322428276 1.19758037821407 1.29579875482518 1.15805212121776 1.17643145606007 1.60878828051747 1.42642568296535 1.37872637622921 1.90270046879930 1.71027922857669 1.58909029972355 0.522428136393275 1.12451504389132 0.789359424277861 0.794076832077647 0 0.349126897212138 0.361219754043311 0.699130652791164 1.42098555083130 1.26208883304475 2.11499417349911 0.765994934756544 0.690501374189846
0.793510628384868 1.02841587149239 1.02859747834386 0.644166648494074 0.383814541877341 0.959741489542351 1.67009303475586 1.41332588203584 1.40056220768470 1.32662766641792 1.19932203633939 1.73938610148668 1.48487874732097 1.34601478610949 2.03564520299005 1.78038582441697 1.58259173402459 0.806759025952159 1.42965422194989 1.12814819292407 1.07651106558538 0.349126897212138 0 0.323350312865288 0.429768299866242 1.76384131469586 1.60474720178243 2.09248686244487 0.417834433217053 1.01512713772324
1.00282353086678 1.20500009080318 1.24535450113960 0.957010592292766 0.638169572760469 1.24043256028508 1.84839494945239 1.55811854584556 1.62893691269791 1.51068030836783 1.46964804082456 1.95288967711441 1.74024802096226 1.64038520289317 2.24855098981110 2.03122151616660 1.86863531095303 0.881186233416665 1.46748954359623 1.09857142361296 1.15050562755660 0.361219754043311 0.323350312865288 0 0.401341655863480 1.70665931093987 1.44412704325761 2.38684642201828 0.646549431316815 0.830219329009727
1.22243047384930 1.45806165184153 1.45522265009438 0.996902253625886 0.809647026715821 1.35361066296092 2.09974639865356 1.84091598329789 1.82193624462406 1.75625850088501 1.59861950435994 2.16394330095167 1.89233474932970 1.71455297354233 2.45960507841371 2.18869146000535 1.95993121864551 1.20965424711041 1.82264750091251 1.47971496114572 1.48271256209378 0.699130652791164 0.429768299866242 0.401341655863480 0 2.09928339399997 1.84363805500027 2.45202317685808 0.413602501826177 1.22893428769451
1.35789479912949 1.20030864257733 1.37538157072187 1.85099509914277 1.57026397701526 1.71418396311366 1.29913545384161 1.04375483592875 1.51577414619392 1.23903910318722 1.72380448415337 1.55889916080941 1.73514890916545 1.98904071343676 1.71981031311017 1.85454829913983 2.04209047233874 1.02519700875516 0.547974538384343 0.637405971349118 0.842533632780032 1.42098555083130 1.76384131469586 1.70665931093987 2.09928339399997 0 0.592426401396805 2.47075085374891 2.16931580951361 0.980438325532062
1.48471872590703 1.42162152785310 1.59357469804042 1.89603241463489 1.54163065698288 1.87959342544112 1.73346996217164 1.42254320058368 1.84401693056883 1.57258512345310 1.96325437805932 1.97730991656455 2.05764786136445 2.22979736745377 2.18726290115220 2.23872593945019 2.34099702579344 1.07932962003922 0.933732074470715 0.690918513838625 1.04084982764590 1.26208883304475 1.60474720178243 1.44412704325761 1.84363805500027 0.592426401396805 0 2.82333076536943 2.02177227636457 0.614868849111616
1.47892426664312 1.42902104432511 1.27981874169819 1.45802369465411 1.75223167462468 1.15001511137726 1.19606641190698 1.42953826416381 0.979343236233052 1.25345748941885 0.944130373966284 0.938487578935088 0.767650662799213 0.746970151266463 0.928225532280122 0.623781663539243 0.526985596729155 1.84839697234199 1.93641633368025 2.14763821184370 1.79017957459317 2.11499417349911 2.09248686244487 2.38684642201828 2.45202317685808 2.47075085374891 2.82333076536943 0 2.09988112978841 2.57274759379890
1.05199317954197 1.30508692057101 1.25431970895813 0.684395940309548 0.658208831549288 1.06873500573507 1.91419842358840 1.70363902947221 1.58442298186216 1.57727930230008 1.31310251980213 1.93286767645972 1.61474029237183 1.38282596277622 2.22136747463655 1.90730276221323 1.63316544734187 1.17868246708681 1.79998642520639 1.53193220639582 1.43605274105727 0.765994934756544 0.417834433217053 0.646549431316815 0.413602501826177 2.16931580951361 2.02177227636457 2.09988112978841 0 1.42665146708738
1.11135862809190 1.15169262617798 1.29292888386720 1.41241171180371 1.03100798715949 1.49669207024472 1.66014133311071 1.32441575457509 1.62939630884483 1.39773088969667 1.64338378397910 1.85877887515436 1.81695332916564 1.89154479517240 2.12128580951920 2.05657547206924 2.05491098650794 0.724455321723777 0.976944113450559 0.552278649397433 0.848125660176736 0.690501374189846 1.01512713772324 0.830219329009727 1.22893428769451 0.980438325532062 0.614868849111616 2.57274759379890 1.42665146708738 0
经纬度矩阵.txt
120.7015202 36.37423
120.6987175 36.37457569
120.6997954 36.37591239
120.70691 36.37579616
120.7056165 36.37248342
120.7031731 36.37753964
120.6928965 36.37800457
120.6943337 36.37521499
120.6973521 36.37876006
120.6962022 36.37643544
120.7011609 36.37905063
120.6939026 36.38021291
120.6983582 36.38056159
120.7025263 36.38120084
120.6914592 36.38201441
120.6960585 36.38247931
120.7005141 36.38276987
120.6998673 36.37079794
120.6928965 36.37079794
120.6964897 36.36824059
120.6969209 36.37143727
120.7052571 36.36899618
120.7088504 36.37021674
120.7087066 36.36731063
120.7130185 36.36829872
120.6896626 36.36661314
120.6937588 36.36242812
120.6993643 36.38741865
120.7129466 36.37201847
120.7002266 36.36428816
链接: link.
遗传算法matlab程序
% Author: Joseph Kirk
% Email: jdkirk630@gmail.com
% Release: 2.0
% Release Date: 05/01/2014
function varargout = mtspf_ga(varargin)
% Initialize default configuration
defaultConfig.xy =load('经纬度.txt');
defaultConfig.dmat = load('距离矩阵.txt'); % N*N距离矩阵
defaultConfig.nSalesmen = 4;
defaultConfig.minTour = 4;
defaultConfig.popSize = 50;
defaultConfig.numIter = 6e3;
defaultConfig.showProg = true;
defaultConfig.showResult = true;
defaultConfig.showWaitbar = false;
% Interpret user configuration(配置) inputs即对输入的数据的配置
if ~nargin %输入参数个数
userConfig = struct();
elseif isstruct(varargin{1})
userConfig = varargin{1};
else
try
userConfig = struct(varargin{:});
catch
error('Expected inputs are either a structure or parameter/value pairs');
end
end
% Override(自动控制暂时失效) default(系统设定值) configuration(配置) with user inputs
configStruct = get_config(defaultConfig,userConfig);
% Extract(选取 configuration
xy = configStruct.xy;
dmat = configStruct.dmat;
nSalesmen = configStruct.nSalesmen;
minTour = configStruct.minTour;
popSize = configStruct.popSize;
numIter = configStruct.numIter;
showProg = configStruct.showProg;
showResult = configStruct.showResult;
showWaitbar = configStruct.showWaitbar;
%对输入数据的验证
if isempty(dmat)
nPoints = size(xy,1);
a = meshgrid(1:nPoints);
dmat = reshape(sqrt(sum((xy(a,:)-xy(a',:)).^2,2)),nPoints,nPoints);
end
% Verify Inputs 验证输入
[N,dims] = size(xy);
[nr,nc] = size(dmat);
if N ~= nr || N ~= nc
error('Invalid XY or DMAT inputs!')
end
n = N - 1; % Separate Start/End City
% Sanity Checks(完整性检查)
nSalesmen = max(1,min(n,round(real(nSalesmen(1)))));
minTour = max(1,min(floor(n/nSalesmen),round(real(minTour(1)))));
popSize = max(8,8*ceil(popSize(1)/8));
numIter = max(1,round(real(numIter(1))));
showProg = logical(showProg(1));
showResult = logical(showResult(1));
showWaitbar = logical(showWaitbar(1));
%%%%%%%%%%不懂%%%%%%%%%%
% Initializations for Route Break Point Selection 路径断点选择的初始化
nBreaks = nSalesmen-1;
dof = n - minTour*nSalesmen; % degrees of freedom
addto = ones(1,dof+1);
for k = 2:nBreaks
addto = cumsum(addto);
end
cumProb = cumsum(addto)/sum(addto);
%%%%%%%%%%%%%不懂%%%%%%%%%%%
% Initialize初始化 the Populations
popRoute = zeros(popSize,n); % population of routes
popBreak = zeros(popSize,nBreaks); % population of breaks
popRoute(1,:) = (1:n) + 1;
popBreak(1,:) = rand_breaks();
for k = 2:popSize
popRoute(k,:) = randperm(n) + 1; %randperm返回从1:n的无重复的随机数
popBreak(k,:) = rand_breaks();
end
% Select the Colors for the Plotted Routes 所画路径的颜色
pclr = ~get(0,'DefaultAxesColor');
clr = [1 0 0; 0 0 1; 0.67 0 1; 0 1 0; 1 0.5 0];
if nSalesmen > 5
clr = hsv(nSalesmen);
end
% Run the GA
globalMin = Inf;
totalDist = zeros(1,popSize);
distHistory = zeros(1,numIter);
tmpPopRoute = zeros(8,n);
tmpPopBreak = zeros(8,nBreaks);
newPopRoute = zeros(popSize,n);
newPopBreak = zeros(popSize,nBreaks);
if showProg
figure('Name','MTSPF_GA | Current Best Solution','Numbertitle','off');
hAx = gca;
end
if showWaitbar
hWait = waitbar(0,'Searching for near-optimal solution ...');
end
for iter = 1:numIter
% Evaluate Members of the Population 人口评估
for p = 1:popSize
d = 0;
pRoute = popRoute(p,:);
pBreak = popBreak(p,:);
rng = [[1 pBreak+1];[pBreak n]]';
for s = 1:nSalesmen
d = d + dmat(1,pRoute(rng(s,1))); % Add Start Distance
for k = rng(s,1):rng(s,2)-1
d = d + dmat(pRoute(k),pRoute(k+1));
end
d = d + dmat(pRoute(rng(s,2)),1); % Add End Distance
end
totalDist(p) = d;
end
% Find the Best Route in the Population
[minDist,index] = min(totalDist);
distHistory(iter) = minDist;
if minDist < globalMin
globalMin = minDist;
optRoute = popRoute(index,:);
optBreak = popBreak(index,:);
rng = [[1 optBreak+1];[optBreak n]]';
if showProg
% Plot the Best Route 实时展示最优路径
for s = 1:nSalesmen
rte = [1 optRoute(rng(s,1):rng(s,2)) 1];
if dims > 2, plot3(hAx,xy(rte,1),xy(rte,2),xy(rte,3),'.-','Color',clr(s,:));
else
plot(hAx,xy(rte,1),xy(rte,2),'.-','Color',clr(s,:));
end
hold(hAx,'on');
end
if dims > 2, plot3(hAx,xy(1,1),xy(1,2),xy(1,3),'o','Color',pclr);
else
plot(hAx,xy(1,1),xy(1,2),'o','Color',pclr);
end
title(hAx,sprintf('最短总路程= %1.4f',minDist));%iterion=%d,,iter
for i=1:size(xy,1) %用这个循环
text(xy(i,1),xy(i,2),['',num2str(i-1)]);
end
hold(hAx,'off');
drawnow;
end
end
% Genetic Algorithm Operators
randomOrder = randperm(popSize);
for p = 8:8:popSize
rtes = popRoute(randomOrder(p-7:p),:);
brks = popBreak(randomOrder(p-7:p),:);
dists = totalDist(randomOrder(p-7:p));
[ignore,idx] = min(dists); %#ok
bestOf8Route = rtes(idx,:);
bestOf8Break = brks(idx,:);
routeInsertionPoints = sort(ceil(n*rand(1,2)));
I = routeInsertionPoints(1);
J = routeInsertionPoints(2);
for k = 1:8 % Generate New Solutions
tmpPopRoute(k,:) = bestOf8Route;
tmpPopBreak(k,:) = bestOf8Break;
switch k
case 2 % Flip
tmpPopRoute(k,I:J) = tmpPopRoute(k,J:-1:I);
case 3 % Swap
tmpPopRoute(k,[I J]) = tmpPopRoute(k,[J I]);
case 4 % Slide
tmpPopRoute(k,I:J) = tmpPopRoute(k,[I+1:J I]);
case 5 % Modify Breaks
tmpPopBreak(k,:) = rand_breaks();
case 6 % Flip, Modify Breaks
tmpPopRoute(k,I:J) = tmpPopRoute(k,J:-1:I);
tmpPopBreak(k,:) = rand_breaks();
case 7 % Swap, Modify Breaks
tmpPopRoute(k,[I J]) = tmpPopRoute(k,[J I]);
tmpPopBreak(k,:) = rand_breaks();
case 8 % Slide, Modify Breaks
tmpPopRoute(k,I:J) = tmpPopRoute(k,[I+1:J I]);
tmpPopBreak(k,:) = rand_breaks();
otherwise % Do Nothing
end
end
newPopRoute(p-7:p,:) = tmpPopRoute;
newPopBreak(p-7:p,:) = tmpPopBreak;
end
popRoute = newPopRoute;
popBreak = newPopBreak;
% Update the waitbar
if showWaitbar && ~mod(iter,ceil(numIter/325))
waitbar(iter/numIter,hWait);
end
end
if showWaitbar
close(hWait);
end
if showResult
% Plots 画图
figure('Name','MTSPF_GA | Results','Numbertitle','off');
subplot(2,2,1);
if dims > 2, plot3(xy(:,1),xy(:,2),xy(:,3),'.','Color',pclr);
else
plot(xy(:,1),xy(:,2),'.','Color',pclr);
end
title('传感器位置');
subplot(2,2,2);
imagesc(dmat([1 optRoute],[1 optRoute]));
title('距离矩阵');
subplot(2,2,3);
rng = [[1 optBreak+1];[optBreak n]]';
for s = 1:nSalesmen
rte = [1 optRoute(rng(s,1):rng(s,2)) 1];
if dims > 2, plot3(xy(rte,1),xy(rte,2),xy(rte,3),'.-','Color',clr(s,:));
else
plot(xy(rte,1),xy(rte,2),'.-','Color',clr(s,:));
end
title(sprintf('最短总路程= %1.4f',minDist));
hold on;
end
if dims > 2, plot3(xy(1,1),xy(1,2),xy(1,3),'o','Color',pclr);
else plot(xy(1,1),xy(1,2),'o','Color',pclr); end
subplot(2,2,4);
plot(distHistory,'b','LineWidth',2);
title('历史最优解');
set(gca,'XLim',[0 numIter+1],'YLim',[0 1.1*max([1 distHistory])]);
end
% Return Output
if nargout
resultStruct = struct( ...
'xy', xy, ...
'dmat', dmat, ...
'nSalesmen', nSalesmen, ...
'minTour', minTour, ...
'popSize', popSize, ...
'numIter', numIter, ...
'showProg', showProg, ...
'showResult', showResult, ...
'showWaitbar', showWaitbar, ...
'optRoute', optRoute, ...
'optBreak', optBreak, ...
'minDist', minDist);
varargout = {resultStruct};
end
function breaks = rand_breaks()
if minTour == 1 % No Constraints on Breaks
tmpBreaks = randperm(n-1);
breaks = sort(tmpBreaks(1:nBreaks));
else % Force Breaks to be at Least the Minimum Tour Length
nAdjust = find(rand < cumProb,1)-1;
spaces = ceil(nBreaks*rand(1,nAdjust));
adjust = zeros(1,nBreaks);
for kk = 1:nBreaks
adjust(kk) = sum(spaces == kk);
end
breaks = minTour*(1:nBreaks) + cumsum(adjust);
end
end
end
四个旅行商时的最优路径
摘自: [link(https://blog.csdn.net/weixin_38130913/article/details/104471378?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param).]