yalmip求解旅行商问题
yalmip求解旅行问题
旅行商问题描述
给定一系列城市和城市之间的距离,要求访问每一座城市一次且回到出发城市,并且使得总路程最短。
数学模型
\[\begin{aligned} \min Z=& \sum_{i=1}^{n} \sum_{j=1}^{n} d_{i j} x_{i j} \\
&\left(\begin{array}{cc}{\sum_{i=1, i \neq j}^{n} x_{i j}=1,} & {j=1, \cdots, n} \\
{\sum_{j=1, j \neq i}^{n} x_{i j}=1,} & {i=1, \cdots, n} \\
{u_{i}-u_{j}+n x_{i j} \leq n-1,} & { \quad 1<i \neq j \leq n}\\
{x_{i j}=\{0 , 1\},} & {i, j=1, \cdots, n} \\
{u_{i}\in\mathbb{R},} & {i=1, \cdots, n}\end{array}\right.\end{aligned}\]
yalmip求解模型
% 利用yamlip求解TSP问题
clear;clc;close all;
d = load('tsp_jin.txt');
n = size(d,1);
% 决策变量
x = binvar(n,n,'full');
u = sdpvar(1,n);
% 目标
z = sum(sum(d.*x));
% 约束添加
C = [];
for j = 1:n
s = sum(x(:,j))-x(j,j);
C = [C, s == 1];
end
for i = 1:n
s = sum(x(i,:)) - x(i,i);
C = [C, s == 1];
end
for i = 2:n
for j = 2:n
if i~=j
C = [C,u(i)-u(j) + n*x(i,j)<=n-1];
end
end
end
% 参数设置
ops = sdpsettings('verbose',0,'solver','cplex');
% 求解
result= optimize(C,z,ops);
if result.problem == 0
value(x)
value(z)
value(u)
else
disp('求解过程中出错');
end
if d(i,j)==d(j,i)
fprintf('a')
end
u(1)
唯大英雄能本色,是真名士自风流!
浙公网安备 33010602011771号