。
このこのでは,0-1整数计画法を使て古典的な巡回セールスマン问题をししを明します。この问题はます。この问题は,一盏の先(大市)を通讯して最短の闭じられられツアー(パス)ををます。このこの合,200の访问先がますががが,nstops.
変数を容易に変更して异なるサイズの问题を取得できます。最初の问题を解くと,解にサブツアーがあることがわかります。これは,见つけた最适解では访问先をすべて通过する1つの最最适化を再実実ししし
この问题に対するソルバーベースのアプローチについてについては,巡回セールスマン问题:ソルバーベースを参照してください。
介绍线路计画法
可能なの経路(つまり,访问先のすべての明显なペア)を生成します。
各各経路の距离距离を计算しし
〖lop-muppy〗最小ツアー内の経路経路のツアー内の各経路のツアーツアーの距离のの计ツアーツアーツアーのの距离の计
決定変数は2進数であり,各経路に関連付けられています。ここで、1 はツアー上に存在する経路を表し、各 0 はツアー上に存在しない経路を表します。
訪問先がすべてツアーに含まれていることを確認するには,各訪問先が2つの経路上に必ず配置されるように線形制約を含めます。これは訪問先に1回到着し,訪問先から1回出発することを意味します。
アメリカ合国本土の粗い粗い表现表现にランダムな先先生成します。
加载('usborder.mat'那'X'那'是'那“xx”那“yy”);RNG(3,'twister')%在缅因州和佛罗里达州停靠,并且是可重复的nStops = 200;%您可以使用任何数字,但问题大小尺度为n ^ 2stopslon = zeros(nstops,1);%分配NSTOPS的X坐标stopslat = stopslon;%allocate y-cocordinatesn = 1;而(n <= nstops)xp = rand * 1.5;yp = rand;如果Inpolygon(XP,YP,X,Y)如果在边界内,%tteststopsLon (n) = xp;stopsLat (n) = yp;n = n + 1;结尾结尾
访问先が200箇所あるため,経路は19,900,つまり19,900の2値値がします(#次数= 200箇所から2箇箇选ぶ组み合并)。
すべての経路(つまり,访问先のすべてのペア)を生成します。
IDXS = NCHOOSEK(1:NSTOPS,2);
経路の距離をすべて計算します。ピタゴラスルールを使用するために地球は平坦であると仮定します。
drawtext (dixs (:,1) - dixs (:,2)), color0000ff;......stopsLon (idx(: 1))——stopsLon (idx (:, 2)));lendist =长度(经销);
この经销
ベクトルの定義により,ツアーの長さは次のようになります。
dist'*旅行
ここで旅行
はは解の経路を表すがベクトルですですこれが最最するツアー距离距离距离距离距离距离距离距离距离距离距离距离
访问先を表し。访问先を,経路をエッジとしてグラフを作物。
g =图表(IDXS(:,1),IDXS(:,2));
グラフプロットを使先表示しますますエッジます。
图hGraph = plot(G,'xdata',stopslon,'ydata',stopslat,“线型”那'没有任何'那'nodelabel', {});抓住在%绘制外界绘图(x,y,'r-')举行从
経路経路候补を表すバイナリ化化,最最化问题を化,最最化问题を。
TSP = OptimProblem;trips = Optimvar('旅行',贷款人,1,'类型'那“整数”那'indowbound',0,'上行'1);
目的関数を問題に含めます。
tsp。目标=距离' *旅行;
各訪問先には2つの経路が結合されているという線形制約を作成します。つまり,各訪問先に到着する経路と各訪問先から出発する経路が存在しなければならないということです。
グラフ表現を使用して,訪問先と接続されているすべてのエッジを見つけることにより,訪問先で開始または終了する経路をすべて特定します。各訪問先について,その訪問先の経路の合計は2と等しいという制約を作成します。
constr2trips = optimconstr (nStops, 1);为了stop = 1:nStops wherhidxs = outedges(G,stop);%识别与停止相关联的旅行CONSTR2TRIPS(STOP)= SUM(TRIPS(WHINDXS))== 2;结尾tsp.constraints.Constr2trips = Constr2.Rips;
問題を解く準備が整いました。反復出力を非表示にするには,既定の表示をオフにします。
opts = Optimoptions(“intlinprog”那“显示”那“关闭”);Tspsol =解决(TSP,“选项”,选择)
tspsol =结构与字段:旅行:[19900×1双]
解の経路をエッジとして使し,新しいグラフを作用成し。これを行うに,厳密厳密にでない値が含まれる料备份てにを丸めを丸め,结果の値逻辑
に変换します。
tspsol.trips =逻辑(圆形(tspsol.trips));GSOL = Graph(IDXS(Tspsol.Trips,1),IDXS(Tspsol.Trips,2));
新しいグラフを既存のプロットに重ね合わせ,そのエッジを強調表示します。
抓住在突出显示(高音,GSOL,“线型”那' - ')标题('与副表的解决方案')
地址上で确认ように,解には复ののツアーががががますます。これまでに指定れれ制约はは,これらのサブツアーの生物を回避するはできませんん。は,途方もない数码不锈钢制约必要なりますますます。
サブツアーの制約をすべて追加することはできないため,反復法を使用します。現在の解にあるサブツアーを検出し,不等式制約を追加してこれらの特定のサブツアーの発生を回避します。このようにすることで,数回の反復で適切なツアーを見つけることができます。
サブサブツアー内にますつの点があるあるサブ作作者人,これらの5つの点の间に现正文は4つ以以というによってサブツアー消去しししいうによってサブを消去ししますます。
さらには,これらの5つの点のに存すべての线を,これらこれら线が4つを超えてないように解をしますますます。解に5つ以上の线が存てて综合,解にはサブツアーがれるれる( 个のノードと 个个のエッジがあるグラフには必ず循环が含ま含まれるのではははしい制约制约にはははしい制约制约
現在の解のエッジを使用して作成されたグラフであるGsol
内の连结要素を特价して,サブツアーを検出し。conncomp
は,各エッジが属するサブツアーの数を示すベクトルを返します。
TouriDXS = Conncomp(GSOL);numtours = max(touridxs);%子台楼数fprintf('# of subtours: %d\n',numtours);
小圈子数量:27个
线形サブツアー消去し,1つのサブのみががソルバーソルバー缲り返し缲り返します。
子台楼的添加约束的%索引k = 1;而numtours> 1%重复,直到只有一个子系统%添加子大楼约束为了II = 1:NumTours Insubtour =(TouriDXS == II);当前子系统中的%边缘一个= (inSubTour (idx), 2);%完整的图形指数,两端在子大学中CONSTRNAME =.“subtourconstr”+ num2str (k);tsp.Constraints.(constrname) = sum(trips(a)) <= (nnz(inSubTour) - 1);K = K + 1;结尾再次尝试优化[TSPSOL,FVAL,EXITFLAG,输出] =求解(TSP,“选项”,选择);tspsol.trips =逻辑(圆形(tspsol.trips));GSOL = Graph(IDXS(Tspsol.Trips,1),IDXS(Tspsol.Trips,2));%plot新解决方案rugk.linestyle =.'没有任何';%删除先前突出显示的路径突出显示(高音,GSOL,“线型”那' - ')绘制%这次有多少子流?TouriDXS = Conncomp(GSOL);numtours = max(touridxs);%子台楼数fprintf('# of subtours: %d\n',numtours)结尾
分游数量:20
7个
9个
9个
3
二
7个
二
#分游:1
标题('消除了副表的解决方案');抓住从
解,これ実行な表しかかかかかか。
disp(output.absolutegap)
0.
00