主要内容

。

巡回セールスマン问题:问题ベース

このこのでは,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つ以上の线が存てて综合,解にはサブツアーがれるれる( N 个のノードと N 个个のエッジがあるグラフには必ず循环が含ま含まれるのではははしい制约制约にはははしい制约制约

現在の解のエッジを使用して作成されたグラフである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

关键词トピック