高级算法课程作业
模型解释如下:
MTZ方法消除子环,只增加了n个决策变量和 (n-1) 2个约束,方法巧妙,方便实现且性能高效。
使用MATLAB的混合整数线性规划(MILP)求解器intlinprog来求解。
完整代码如下。
%%
clear
clc
tic%% 读取城市坐标
file = './TSP_'; % burma14 bays29 eil51 eil76 eil101
data = importdata(file);
n = data(1);
num_var = n*n + n; % 总的决策变量数目
data(1) = [];
data = reshape(data, 3, n);
data = data';%% 计算两两城市间的欧式距离
c = zeros(n, n);
for i = 1:nfor j = i:nif i == jc(i, i) = 9999999;elsec(i, j) = sqrt((data(i, 2)-data(j, 2))^2 + (data(i, 3)-data(j, 3))^2);c(j, i) = c(i, j);endend
end%% 设置约束条件、目标函数
% 等式约束
Aeq = zeros(2*n, num_var);
beq = ones(2*n, 1);% 每个点的出度为1
for i = 1:nAeq(i, (i-1)*n+1:i*n) = 1;
end% 每个点的入度为1
for i = 1:nAeq(i+n, i:n:n*n) = 1;
end% 不等式约束 MTZ
A = zeros((n-1)*(n-1) - (n-1), num_var);
b = ones((n-1)*(n-1) - (n-1), 1) .* (n-1);
cnt = 0;
for i = 2:nfor j = 2:nif i~= jcnt = cnt + 1;A(cnt, n*n+i) = 1;A(cnt, n*n+j) = -1;A(cnt, (i-1)*n+j) = n;endend
end% 01整数约束
intcon = 1:n*n;
bound_lower = zeros(num_var, 1);
bound_lower(n*n+1:num_var) = -inf;
bound_upper = ones(num_var, 1);
bound_upper(n*n+1:num_var) = inf;% 目标函数
f = zeros(num_var, 1);
f(1:n*n) = reshape(c, n*n, 1);%% 求解器求解
options = optimoptions('intlinprog','AbsoluteGapTolerance',1e-3,...'MaxTime', 1000);
[x, y]=intlinprog(f,intcon, A, b, Aeq, beq, bound_lower, bound_upper);
toc
由于部分实例 (后三个) 求解时间较长,对其设置最大求解时间,所有5个实例的求解结果如下。
burma14 | bays29 | eil51 | eil76 | eil101 |
---|---|---|---|---|
30.8785 | 9074.1480 | 436.8716 | 599.9859 | 681.2858 |
所有的运行截图在result文件下,为避免杂乱,这里仅给出burma14
的运行信息。
本文发布于:2024-01-31 10:40:21,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170666882827929.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |