TSP with Miller-Tucker-Zemlin (MTZ) model

2024-01-02 16:40
文章标签 model tsp miller zemlin tucker mtz

本文主要是介绍TSP with Miller-Tucker-Zemlin (MTZ) model,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

高级算法课程作业

目录

      • 1. TSP with MTZ模型及解释
      • 2. 求解TSP with MTZ
      • 3. 实验总结与心得

1. TSP with MTZ模型及解释

在这里插入图片描述

模型解释如下:

  1. 目标函数z,对应TSP问题哈密顿回路各有向路径的距离之和;
  2. 约束1的数学含义是任意节点 (城市) i i i 的出度为1,在TSP问题中对应着每个城市只有一个出边;
  3. 约束2的数学含义是任意节点 (城市) j j j 的入度为1,在TSP问题中对应着每个城市只有一个入边。约束1和约束2限制了每个城市最多访问一次,且必须被访问一次。
  4. 约束3为了消除子环约束。约束3分为两部分:
    u i − u j + n x i j ≤ n − 1 u_i-u_j+nx_{ij}\leq n-1 uiuj+nxijn1:若一条可行的访问路径中经过 < i , j > <i, j> <i,j>,即 x i j = 1 x_{ij}=1 xij=1,则不等式等价变换为 u i ≤ u j − 1 u_i\leq u_j-1 uiuj1,即 u i < u j u_i< u_j ui<uj。当一条路径存在重复节点(形成环)时,例如 i → j → k → i i\rightarrow j \rightarrow k \rightarrow i ijki,则有 u i < u j < u k < u i u_i<u_j<u_k<u_i ui<uj<uk<ui,出现矛盾 u i < u i u_i<u_i ui<ui。故 u i − u j + n x i j ≤ n − 1 u_i-u_j+nx_{ij}\leq n-1 uiuj+nxijn1能限制路径不包含任意环;
    由于TSP问题本身是一个经过所有节点的最大的环,我们的目的是消除子环而不是消除 (最大的) 环,故使用 1 < i ≠ j ≤ n 1<i \neq j \leq n 1<i=jn,即剔除第一个节点,只针对剩余节点,使其不能成环 (是子环),从而实现消除子环 。

MTZ方法消除子环,只增加了n个决策变量和 (n-1) 2个约束,方法巧妙,方便实现且性能高效。

2. 求解TSP with MTZ

使用MATLAB的混合整数线性规划(MILP)求解器intlinprog来求解。
完整代码如下。

%%
clear
clc
tic%% 读取城市坐标
file = './TSP_data/burma14.txt';  % 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个实例的求解结果如下。

burma14bays29eil51eil76eil101
30.87859074.1480436.8716599.9859681.2858

所有的运行截图在result文件下,为避免杂乱,这里仅给出burma14的运行信息。

在这里插入图片描述

3. 实验总结与心得

  1. 通过对经典规划问题TSP的建模与求解,了解了TSP问题的建模方式;
  2. 学习并理解了TSP问题建模的核心难点,即如何消除子环,并对MTZ方法的原理进行了剖析;
  3. 用求解器求解TSP问题,进一步熟悉了MATLAB混合整数规划求解器的编程。

这篇关于TSP with Miller-Tucker-Zemlin (MTZ) model的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/563047

相关文章

MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)

1、MVC MVC(Model-View-Controller) 是一种常用的架构模式,用于分离应用程序的逻辑、数据和展示。它通过三个核心组件(模型、视图和控制器)将应用程序的业务逻辑与用户界面隔离,促进代码的可维护性、可扩展性和模块化。在 MVC 模式中,各组件可以与多种设计模式结合使用,以增强灵活性和可维护性。以下是 MVC 各组件与常见设计模式的关系和作用: 1. Model(模型)

【uva】116-Unidirectional TSP(动态规划,路径问题)

一道很基础的动态规划,不过需要考虑路径(而且是最小字典序)。 转移方程很好写: d[i][j] = min(dp[i + 1][ j] ,dp[i + 1][j - 1] ,dp[i + 1][ j - 1]) + mat[j[i]; dp[i][j]代表走到第i列第行的时候距离最后一行的最短距离; 13991881 116 Unidirectional TSP Accepted C

基于SA模拟退火算法的多车辆TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述        基于SA模拟退火算法的多车辆TSP问题求解matlab仿真,三个车辆分别搜索其对应的最短路径,仿真后得到路线规划图和SA收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 (完整程序运行后无水印)

diffusion model 合集

diffusion model 整理 DDPM: 前向一步到位,从数据集里的图片加噪声,根据随机到的 t t t 决定混合的比例,反向要慢慢迭代,DDPM是用了1000步迭代。模型的输入是带噪声图和 t,t 先生成embedding后,用通道和的方式加到每一层中间去: 训练过程是对每个样本分配一个随机的t,采样一个高斯噪声 ϵ \epsilon ϵ,然后根据 t 对图片和噪声进行混合,将加噪

旅行商问题 | Matlab基于混合粒子群算法GA-PSO的旅行商问题TSP

目录 效果一览基本介绍建模步骤程序设计参考资料 效果一览 基本介绍 混合粒子群算法GA-PSO是一种结合了遗传算法(Genetic Algorithm, GA)和粒子群优化算法(Particle Swarm Optimization, PSO)的优化算法。在解决旅行商问题(Traveling Salesman Problem, TSP)时,这种混合算法可以结合两种算法的优点

Segment Anything Model(SAM)中的Adapter是什么?

在META团队发布的Segment Anything Model (SAM) 中,Adapter 是一种用于提升模型在特定任务或领域上的性能的机制。具体来说,SAM 是一个通用的分割模型,能够处理多种不同类型的图像分割任务,而 Adapter 的引入是为了更好地让模型适应不同的任务需求。 Adapter 的主要功能是: 模块化设计:Adapter 是一种小规模的、可插拔的网络模块,可以在不改

Vue学习:v-model绑定文本框、单选按钮、下拉菜单、复选框等

v-model指令可以在组件上使用以实现双向绑定,之前学习过v-model绑定文本框和下拉菜单,今天把表单的几个控件单选按钮radio、复选框checkbox、多行文本框textarea都试着绑定了一下。 一、单行文本框和多行文本框 <p>1.单行文本框</p>用户名:<input type="text" v-model="inputMessage"><p>您的用户名是:{{inputMe

Java memory model(JMM)的理解

总结:JMM 是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。目的是保证并发编程场景中的原子性、可见性、有序性。 总结的很精辟! 感谢Hollis总结

使用RMMapper将.plist文件转成model模型

在项目开发中, 有时我们会用到.plist, 这个时候可能会使用这个plist,拿出来用model去绑定它来对应项目MVC, 我们可以引入RMMapper,废话不多说,看代码先。 在git clone RMMapper,操作不多说了哈, 不会的可以私信我,会详细给你支招。 一、创建一个类TaskPlist基于NSObject, 代码如下: .h #import <Foundation

在Yolov8中model.export后self.export=false问题(记录)

遇到一个问题是自己创建了新的Detect检测头,但是在导出模型时,想要修改输出格式,在yolo中可以通过if self.export:来修改网络的返回值格式 当使用model.export()导出时,理论上会自动将export设置为True 但是在实际中发现export=false,于是通过调试发现在ultralytics/engine/exporter.py中 for m in model