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)

posted on 2020-02-20 13:54  小毅哥哥Bob  阅读(354)  评论(0)    收藏  举报

导航