可参考mathworks推销员行程问题

此示例说明如何使用二元整数规划来求解经典的销售员差旅问题。此问题涉及找到一条历经一系列停留点(城市)的最短环程(路径)。在本例中有 200 个停留点,但您可以很轻松地更改 nStops 变量以得到不同规模的问题。对最初的问题进行求解后得到的解会包含子环程。这意味着找到的最优解并没有给出一条穿过所有点的连续路径,而是有几个独立的环路。然后,您将使用迭代过程来确定子环程,添加约束,并重新运行优化,直到消除子环程。

要了解如何通过基于求解器的方法处理此问题,请参阅推销员行程问题:基于求解器。

问题表示
将要进行整数线性规划的销售员差旅问题表示如下:

生成所有可能的行程,意味着经过所有不同停留点对组。

计算每次行程的距离。

要最小化的代价函数是行程中每次旅行的旅行距离之和。

决策变量是与每个行程相关联的二元变量,其中每个 1 表示环程中存在的一次行程,每个 0 表示不在环程中的一次行程。

为确保环程包括每个经停留点,应加入这样一个线性约束:每个停留点都正好涉及两段行程。这意味着一段行程到达该停留点,一段行程离开该停留点。

load('usborder.mat','x','y','xx','yy');
rng(3,'twister') % Makes stops in Maine & Florida, and is reproducible
nStops = 200; % You can use any number, but the problem size scales as N^2
stopsLon = zeros(nStops,1); % Allocate x-coordinates of nStops
stopsLat = stopsLon; % Allocate y-coordinates
n = 1;
while (n <= nStops)xp = rand*1.5;yp = rand;if inpolygon(xp,yp,x,y) % tTest if inside the borderstopsLon(n) = xp;stopsLat(n) = yp;n = n+1;end
endidxs = nchoosek(1:nStops,2);dist = hypot(stopsLat(idxs(:,1)) - stopsLat(idxs(:,2)), ...stopsLon(idxs(:,1)) - stopsLon(idxs(:,2)));
lendist = length(dist);G = graph(idxs(:,1),idxs(:,2));figure
hGraph = plot(G,'XData',stopsLon,'YData',stopsLat,'LineStyle','none','NodeLabel',{});
hold on
% Draw the outside border
plot(x,y,'r-')
hold offtsp = optimproblem;
trips = optimvar('trips',lendist,1,'Type','integer','LowerBound',0,'UpperBound',1);tsp.Objective = dist'*trips;constr2trips = optimconstr(nStops,1);
for stop = 1:nStopswhichIdxs = outedges(G,stop); % Identify trips associated with the stopconstr2trips(stop) = sum(trips(whichIdxs)) == 2;
end
tsp.Constraints.constr2trips = constr2trips;opts = optimoptions('intlinprog','Display','off');
tspsol = solve(tsp,'options',opts)tspsol.trips = logical(round(tspsol.trips));
Gsol = graph(idxs(tspsol.trips,1),idxs(tspsol.trips,2));hold on
highlight(hGraph,Gsol,'LineStyle','-')
title('Solution with Subtours')tourIdxs = conncomp(Gsol);
numtours = max(tourIdxs); % Number of subtours
fprintf('# of subtours: %d\n',numtours);% Index of added constraints for subtours
k = 1;
while numtours > 1 % Repeat until there is just one subtour% Add the subtour constraintsfor ii = 1:numtoursinSubTour = (tourIdxs == ii); % Edges in current subtoura = all(inSubTour(idxs),2); % Complete graph indices with both ends in subtourconstrname = "subtourconstr" + num2str(k);tsp.Constraints.(constrname) = sum(trips(a)) <= (nnz(inSubTour) - 1);k = k + 1;        end% Try to optimize again[tspsol,fval,exitflag,output] = solve(tsp,'options',opts);tspsol.trips = logical(round(tspsol.trips));Gsol = graph(idxs(tspsol.trips,1),idxs(tspsol.trips,2));% Plot new solutionhGraph.LineStyle = 'none'; % Remove the previous highlighted pathhighlight(hGraph,Gsol,'LineStyle','-')drawnow% How many subtours this time?tourIdxs = conncomp(Gsol);numtours = max(tourIdxs); % Number of subtoursfprintf('# of subtours: %d\n',numtours)
endtitle('Solution with Subtours Eliminated');
hold offdisp(output.absolutegap)

matlab解决推销员行程问题(可参考mathworks网站)相关推荐

  1. 弹簧压缩 时间 matlab,用matlab解决弹簧振子摆动与时间的关系

    用matlab解决弹簧振子摆动与时间的关系 用 matlab 解决弹簧振子摆动与时间的关系 学 院:光电信息 班 级:应用物理(111160102) 姓 名:王梅 学 号:11116010224201 ...

  2. 微信的行程卡服务器异常,行程卡打不开服务器崩了解决方法 行程卡短信查询步教程...

    今天滚天游戏网小编为大家带来行程卡打不开服务器崩了解决方法 行程卡短信查询步教程,希望能帮助到大家. 部分地区的健康码程序也无法打开,比如山东电子健康码.信息提示,由于当前访问人数过多,小程序可能会出 ...

  3. matlab生产计划问题,用MATLAB解决综合生产计划编制过程中的优化问题

    第 18卷第 3期 2005年 6月 常 州 工 学 院 学 报 Journal of Changzhou Institute of Technology Vol. 18 No. 3 Jun. 200 ...

  4. matlab多种分配方案_基于Matlab解决m个人n项任务的最优分派

    龙源期刊网 http://www.qikan.com.cn 基于 Matlab 解决 m 个人 \n 项任务的最优分 派 作者:史 历 来源:<商场现代化> 2010 年第 03 期 [ ...

  5. matlab二维势阱简谐振动程序,常规解法与MATLAB解决一维无限深势阱中的粒子问题...

    龙源期刊网 http://www.doczj.com/doc/ddcba3222d60ddccda38376baf1ffc4ffe47e2cd.html 常规解法与MATLAB解决一维无限深势阱中的粒 ...

  6. 利用Matlab 解决二维矩阵问题

    写在前面 Matlab是一款非常强大的数学计算工具,学习并使用它进行处理一些数据运算,将会非常之高效. 今天有同学问我了一道关于利用Matlab 解决二维矩阵问题,利用空闲时间给他解答,希望能帮助到他 ...

  7. 燃油运输问题matlab,运输问题用matlab解决

    摘要本文主要研究的是货物运输的最短路径问题,利用图论中的 Floyd 算法.Kruskal 算法,以及整数规划的方法建立相关问题的模型,通过 matlab,lingo 编程求解出最终 结果...... ...

  8. svr代码matlab,matlab解决svr代码.docx

    matlab解决svr代码.docx 多元线性回归和BP神经网络及决策向量机之间的比较,个人理解:多元线性回归:就是多个属性的线性组合,在组合时,通过不断调节每个属性的权重来使多元线性回归函数更多的适 ...

  9. matlab 多目标非线性,第二章—Matlab解决悬置多目标解耦的非线性优化问题

    第二章-Matlab解决悬置多目标解耦的非线性优化问题 悬置系统的多方向解耦率优化可以简化为一个多目标非线性优化问题. 解决多目标的非线性优化问题,此问题可以归结为如下模型: min γ (x) 使得 ...

最新文章

  1. 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)...
  2. 特定场景下SQL的优化
  3. 跨域加了header也解决不了?
  4. underscore.js源码解析2
  5. MVC 1.0的可能方法
  6. 计算机图形学Web前端笔记-定位并移动到指定坐标点(two.js理论及实现)
  7. spring security3(转)
  8. 自定义Java定时器(基于ScheduledExecutorService)
  9. AWS 与 Elastic 矛盾再升级!
  10. Django组件--cookie与session
  11. linux源码安装mysql
  12. Android典型界面设计——ViewPage+Fragment实现区域顶部tab滑动切换
  13. 8位单片机003兼容替换意法半导体STM8S003F3P6
  14. 重磅来袭!Typora官方主题+自定义主题完美整合
  15. python自动翻译pdf_python pdf一键翻译脚本
  16. 又一次移植最新lvgl8到esp32的踩坑记录
  17. 广东工业大学 Anyviewce C语言 习题八
  18. mc服务器语音,《我的世界》语音聊天Mod安装使用教程
  19. flink的Savepoint
  20. getenv、setenv函数

热门文章

  1. 上线群聊功能 阿里搞不赢的社交美团能行吗?
  2. CSR867x — 使用Sink Configuration Tool配置按键
  3. 历经四个月,谷歌联盟的PIN码问题终于解决了
  4. [IOS APP]江南三部曲-格非有声文学
  5. 中国移动电视显示android,中国移动电视机无线网络连接不上啥起因
  6. PHP之各种SQL注入源码
  7. uniapp 微信登录取消授权,以及不等待你做出授权选择就执行方法体
  8. Docker Image 基础使用命令
  9. git 清除本地远程被删除的分支
  10. flowable 查询完成的流程_flowable流程引擎初体验,完成一个请假流程