主要内容

이번역번역이지는최신내용을담고담고않습니다않습니다。최신최신내용을영문영문으로여기를클릭클릭

여행하는외판원문제:문제기반

이예제에서는이진정수계획법을사용하여전형적인여행하는외판원문제를푸는방법보여보여문제를푸는방법을보여보여이문제는여러경유지(도시)를거쳐원래도시로돌아오는최단순회경로를것이것것것것것것것것것입니다이것것입니다것입니다이경우경우에는개의가있지만,사용자용자nstops.변수를변경하여손쉽게문제의규모를정할수있습니다。초기문제를풀면해에경로경로가있음을확인할수있습니다。즉,문제에서구한최적해가모든점을통과하는하나연속적인경로를제공에이아니라,연속되지않은개의루프가지고있음을합니다。그런다음,하위경로를확인하고제약조건을추가한후하위경로가제거될때까지최적화를다시실행하는반복적인작업을하게될것입니다。

이문제에대한솔버기반접근법은여행하는외판원문제:솔버기반항목을참조하십시오。

문제정식화

다음과같이정수선형계획법을사용하는하는여행하는외판원문제를정식화

  • 가능한모든여행(旅行),즉서로다른모든경유지쌍을합니다생성。

  • 각여행의거리를계산합니다。

  • 00

  • 결정변수는이진변수이고각여행과연결되어있습니다。여기서1은경로에존재하는나타내고,0은경로에존재하지않는을나타냅니다。

  • 경로에모든경유지가포함되도록하기위해각경유지가정확히두개의여행에존재하도록규정하는선형제약조건을포함시켜야합니다。이는각경유지에서도착과출발이각각한번씩일어남을의미합니다。

경유지생성하기

대략적으로미대륙을나타내는다각형내부에임의경유지를생성합니다。

加载('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개의경유지가있으므로여행횟수는19900개입니다。즉,이진변수가19900개임을의미합니다(변수개수= 200개중에서2개를선택하는경우의수)。

모든모든,즉모든경유지쌍을합니다。

IDXS = NCHOOSEK(1:NSTOPS,2);

피타고라스규칙을사용할수있도록지구가평평하다고간주하고모든여행거리를계산합니다。

drawtext (dixs (:,1) - dixs (:,2)), color0000ff;......stopsLon (idx(: 1))——stopsLon (idx (:, 2)));lendist =长度(经销);

위와같이经销벡터에대한정의를사용하면경로길이는다음과다음과。

dist'*旅行

여기서旅行는해에서구한여행를나타내는내는이진벡터벡터。이경로의길이가바로최소최소화하고자하고자하는의거리

그래프생성및지도그리기

문제를그래프로나타냅니다。경유지를노드로노드로나타내고여행여행간선으로나타내는내는그래프를생성

图G = (idx (: 1), idx (:, 2));

그래프플롯을사용하여경유지를표시합니다。그래프간선없이노드를플로팅합니다。

图hGraph = plot(G,'xdata',stopslon,'ydata',stopslat,“线型”'没有任何''nodelabel', {});抓住%绘制外界情节(x, y,'r-')举行

변수와문제생성하기

잠재잠재여행을내는이진최적화변수를갖는화화를생성합니다。

TSP = OptimProblem;trips = Optimvar('旅行',贷款人,1,'类型'“整数”'indowbound',0,'上行'1);

문제에목적함수를시킵니다시킵니다。

tsp。目标=距离' *旅行;

제약조건

각경유지마다도착하는여행과출발하는여행이각각하나씩있어야하므로,경유지마다두개의여행이연결되어있는선형제약조건을생성합니다。

그래프표현을사용해경유지에연결된모든간선찾아해당경유지에서시작하거나끝나는모든여행을식별식별경유지경유지마다해당경유지에대한여행합을을합합합하는하는제약조건을생성생성생성

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),[],numnodes(g));% Gsol = graph(idxs(tspsol.trips,1),idxs(tspsol.trips,2));%在大多数情况下也有效

기존플롯에새그래프를중첩하고간선을강조표시합니다。

抓住突出显示(高音,GSOL,“线型”' - ')标题('与副表的解决方案'

지도에서알수있듯이해에는여러하위경로가있습니다。지금까지지정한제약은이러한하위하위경로의의발생막지막지막지어떤하위경로발생도허용않으려면엄청나게많은수제약제약조건이필요제약조건이이것것입니다。

하위경로제약조건

모든하위경로제약조건조건가할할없으므로반복법을사용하십시오。현재해에서경로를검출후후부등식조건가하여특정하위경로가발생발생않도록합니다。이렇게하면하면몇번의반복으로적합한경로경로를수수수

부등식제약조건을사용하여하위경로를제거합니다。하이에대한예로,위경로에5개의점이있다고하면이점을연결하는5개의직선이하위경로를생성하게됩니다。이5개의점사이의직선의개수4개가보다작거나같아야함을나타내는부등식제약조건을만들어이하위경로를제거하십시오。

이5개점사이의모든직선을찾은후존재하는직선의개수가4개를넘지않도록해에제약조건을적용합니다。5개해에이상의직선이존재하면해에하위경로가생기기때문에이는올바른제약조건입니다( N 개노드와 N 개간선이포함된그래프는항상순환을포함함)。

현재해에서간선을사용하여하여생성한그래프Gsol의연결성분을식별하여하위경로를검출합니다。conncomp는각간선이속한하위경로개수를가진벡터벡터를반환합니다

TouriDXS = Conncomp(GSOL);numtours = max(touridxs);%子台楼数fprintf('# of subtours: %d\n',numtours);
小圈子数量:27个



子台楼的添加约束的%索引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),[],numnodes(g));% 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.

이작다는사실은은가최적이거나거나의총이최적최적가깝다는것것의미의미의미의미

관련항목