运筹系列93:VRP精确算法

1. MTZ模型

MTZ是Miller-Tucker-Zemlin inequalities的缩写。除了定义是否用到边 x i j x_{ij} xij外,还需要定义一个 u i u_i ui用来表示此时车辆的当前载货量。注意这里x变量需要定义为有向。
这里定义为pickup问题,代码为:

using JuMP, HiGHSk = 3 # number of vehicles
N = 11 # number of points, 0 as depot
Q = 4 # vehicle capacity
q = ones(Int,N);q[1]=0 # demand
CVRP = Model(HiGHS.Optimizer)
set_silent(CVRP)
@variable(CVRP,x[1:N,1:N],Bin)
@variable(CVRP,u[1:N],lower_bound = 0, upper_bound = Q)
# 约束1:出度约束
for i in 2:N@constraint(CVRP, sum(x[i,1:i-1]) + sum(x[i,i+1:N]) == 1)@constraint(CVRP, sum(x[1:i-1,i]) + sum(x[i+1:N,i]) == 1)
end
@constraint(CVRP, sum(x[1,1:N]) == k)
# 约束2:流量约束。若存在i->j,则u_j-u_i==q_j;否则u_j-q_j和u_i没有关系。此外,需要有u_j-q_j>=0
for i=2:N, j=[2:i-1;i+1:N]@constraint(CVRP,u[i] - u[j] + Q*x[i,j] <= Q-q[j])
end
for i in 2:N@constraint(CVRP,q[i] <= u[i] <= Q)
end@objective(CVRP,Min, sum(x[i,j]*distmat[i,j] for i=1:N,j=1:N))
@time optimize!(CVRP)

MTZ的求解速度不快,10个点3辆车都需要3秒左右时间。

2. 分支定界法

使用Two-index vehicle flow formulations。按照tsp的方式使用行生成法速度极慢(cut的效率太低),因此考虑使用branch-and-cut直接求解。需要cut的主要有2个:1)容量约束;2)subtour约束。如下例子:

using TSPLIB,JuMP, HiGHS, Distances
N = 13
Q = 4
k = 3
m = Model(HiGHS.Optimizer)
set_silent(m)
@variable(m, x[1:N,1:N]>=0,Bin)
@objective(m, Min, sum(x[i,j]*distmat[i,j] for i=1:N,j=1:N))
@constraint(m, x[1,1] == 0)
@constraint(m, sum(x[1,j] for j in 2:N) == k)
@constraint(m, sum(x[j,1] for j in 2:N) == k)
for i=2:N for j in 1:N;@constraint(m, x[i,j]+x[j,i] <= 1);end@constraint(m, sum(x[i,j] for j in 1:N) == 1)@constraint(m, sum(x[j,i] for j in 1:N) == 1)
end
optimize!(m)
draw_vrp(x)

在这里插入图片描述

接下来定义寻找tour的函数,以及branch and cut的代码:

# find all subtours
function tours(x)g = JuMP.value.(x)# 第一步,找到所有从1出发的tourabnormal_paths = []paths = []path = [1]left = collect(1:N)while truev, idx = findmax(g[path[end],left])if v==0breakelseg[left[idx],path[end]]=0g[path[end],left[idx]]=0push!(path,left[idx])endif path[end]==1if length(path)>Q+2;push!(abnormal_paths,path);endpush!(paths,path)path = [1]setdiff!(left,path[2:end-1])endend# 第二步,找到所有孤立的环(subtour)left = collect(1:N)for path in paths;setdiff!(left,path);endwhile length(left)>0   path = [left[1]]while truev, idx = findmax(g[path[end],left])if idx == 1breakelseg[left[idx],path[end]]=0g[path[end],left[idx]]=0push!(path,left[idx])endendsetdiff!(left,path)push!(paths,path)push!(abnormal_paths,path)endreturn paths,abnormal_paths
endpaths,abnormal_paths = tours(x)
while length(abnormal_paths) > 0for path in pathss = setdiff(path,1)sn = setdiff(2:N,s)@constraint(m, sum(x[i,j] for i in s, j in setdiff(1:N,s)) >= ceil(length(s)/Q))@constraint(m, sum(x[i,j] for i in sn, j in setdiff(1:N,sn)) >= ceil(length(sn)/Q))endoptimize!(m)paths,abnormal_paths = tours(x)
end
draw_vrp(x)

在这里插入图片描述

3. set-partitioning方法

方法很直观,把所有的子路径用TSP问题求解(使用Concorde库),然后用set-partitioning方法选择最合适的几条路线组合成VRP的结果。

using JuMP, HiGHS, Combinatorics, Concorde k = 3
N = 13 #34
Q = 4 #13function getRoutes(k,N,Q)Qm = N-1-(k-1)*Qroute_dists = Dict()# 求解所有子路径的最优解for q in Qm:Qfor c in combinations(2:N,q)c_index_tour,c_tour_length = Concorde.solve_tsp(floor.(Int,distmat[[1;c],[1;c]].*100)) c_tour = [1;c][c_index_tour]route_dists[c_tour] = c_tour_lengthendendroute_dists
end
@time route_dists = getRoutes(k,N,Q);
CVRP = Model(HiGHS.Optimizer)
set_silent(CVRP)
routes = collect(keys(route_dists))
route_dists = collect(values(route_dists))
rn = length(routes)
@variable(CVRP,x[1:rn],Bin)
@objective(CVRP,Min, sum(x[i]*route_dists[i] for i in 1:rn))
a = zeros(Int,rn,N)
for i in 1:rn,j in routes[i];a[i,j]=1;end
for j in 2:N;@constraint(CVRP,sum(x[i]*a[i,j] for i in 1:rn)==1);end
@constraint(CVRP,sum(x)==k)
@time optimize!(CVRP)
rs = routes[findall(x->x>0.1,value.(x))]
plt.figure(figsize=(10,7)) 
plt.scatter(pos[1:N,1],pos[1:N,2],c="red")
for i in 1:N;plt.text(pos[i,1], pos[i,2], i);end
for r in rsl = pos[[r;1],:]PyPlot.plot(l[:,1], l[:,2], color="b")
end

在这里插入图片描述

4. 关于测试数据

测试案例可参考 http://vrp.atd-lab.inf.puc-rio.br/index.php/en/。
我们这里用的数据为:

pos = [121.472641	31.231707
123.429092	41.796768
125.324501	43.886841
126.642464	45.756966
116.405289	39.904987
117.190186	39.125595
111.75199	40.84149
106.23248	38.48644
112.549248	37.857014
114.502464	38.045475
117.000923	36.675808
113.665413	34.757977
108.948021	34.263161
114.298569	30.584354
118.76741	32.041546
117.283043	31.861191
112.982277	28.19409
115.892151	28.676493
120.15358	30.287458
119.306236	26.075302
113.28064	23.125177
121.520076	25.030724
110.19989	20.04422
108.320007	22.82402
106.504959	29.533155
102.71225	25.040609
106.713478	26.578342
104.065735	30.659462
103.83417	36.06138
101.77782	36.61729
91.1145	29.64415
87.61688	43.82663
114.16546	22.27534
113.54913	22.19875];function dis(i,j)A = pos[i,:];B = pos[j,:]sqrt(sum((A-B).^2))
endfunction drawTree(t,n)plt.figure(figsize=(10,7)) plt.scatter(pos[1:n,1],pos[1:n,2],c="red")for i in 1:n;plt.text(pos[i,1], pos[i,2], i);endfor i in 1:length(t)l = pos[collect(t[i]),:]PyPlot.plot(l[:,1], l[:,2], color="b")end
endfunction draw_vrp(x)xv = value.(x)t = []for i in 1:size(x)[1],j in 1:size(x)[1]if xv[i,j]>0.1;push!(t,(i,j));endenddrawTree(t,size(x)[1])
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库系统概论-第11章并发控制

允许多个用户同时使用同一个数据库的数据库系统称为多用户数据库系统。 事务可以一个一个地中行执行&#xff0c;即每个时刻只有一个事务运行&#xff0c;其他事务必须等到这个事务结束以后方能运行。 单处理机系统中&#xff0c;事务的并行执行实际上是这些并行事务的并行操…

windows下载jdk并安装步骤(保姆级教程)

一、下载jdk 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 二、双击下载好的jdk 更改安装目录然后点击下一步 然后会弹出jre的安装&#xff0c;需要选择路径&#xff08;注意&#xff1a;这里的路径必须跟前面的jdk在…

ocr数据不够,怎么造数据

1.确定特定字体类型&#xff1b; 2.收集合适的图片作为背景 3.在背景图上填写特定字体的字符内容 1&#xff09;字体无法确认时怎么办&#xff1f; 方法一&#xff1a;可以将文本行裁剪出来去网站上确认&#xff0c;网站链接&#xff1a;字体识别-在线扫一扫图片找字体-搜字…

将huggingface的大模型转换为safetensor格式

很多huggingface的大语言模型都是pytorch的格式&#xff0c;但是mindie需要safetensor格式&#xff0c;另外mindieservice加载原始的baichuan2-13b的模型出错&#xff0c;后来排查是bfloat16数据格式的问题&#xff0c;所以这次转换要一次性转为float16的格式。 上代码&#x…

计算机网络:如何隐藏真实的IP和MAC地址?

目录 一、什么是MAC地址二、什么是IP地址三、如何隐藏真实的MAC地址四、如何隐藏真实的IP地址 一、什么是MAC地址 MAC地址&#xff0c;全称为媒体访问控制地址&#xff08;Media Access Control Address&#xff09;&#xff0c;是一种用于网络通信的唯一标识符。它是由IEEE 8…

PLC网关如何选择?plc网关作用-天拓四方

一、PLC网关在工业自动化领域的重要性和作用 PLC网关在工业自动化领域的重要性和作用不言而喻。作为工业自动化系统的重要组成部分&#xff0c;PLC网关起到了关键的桥梁作用&#xff0c;实现了PLC与其他设备、系统之间的数据传输和通信。 首先&#xff0c;PLC网关的重要性体现…

【华为OD机试】 约瑟夫问题(C++/Java/Python)

题目 题目描述 输入一个由随机数组成的数列(数列中每个数均是大于 0 的整数,长度已知),和初始计数值 m。 从数列首位置开始计数,计数到 m 后,将数列该位置数值替换计数值 m, 并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。 如果计数到…

最像人声的语音合成模型-ChatTTS

目录 写在前面 一、使用ChatTTS 二、优点 三、局限 写在前面 最像人声的AI来了&#xff01;语音开源天花板ChatTTS火速出圈&#xff0c;3天就斩获9k个star。截至发稿前&#xff0c;已经25.9k个star了。这是专门为对话场景设计的语音生成模型&#xff0c;用于LLM助手对话任务…

SUSE linux的启动过程介绍

引导Linux系统涉及不同的组件和任务。在固件和硬件初始化过程&#xff08;取决于机器的架构&#xff09;之后&#xff0c;内核通过引导加载程序GRUB2启动。此后&#xff0c;引导过程完全由操作系统控制并由systemd处理。systemd提供了一组“target”&#xff0c;用于为日常使用…

微信开放平台(第三方平台)

特征&#xff1a; 统一管理&#xff1a; 可以统一管理和操作多个公众号和小程序&#xff0c;提供批量化、集中化的服务。 代开发和运营&#xff1a; 为公众号和小程序提供代开发和运营服务&#xff0c;例如提供自动回复、模板消息、用户管理等功能。 接口调用&#xff1a; 通过…

基于深度学习的模糊图像还原

基于深度学习的模糊图像还原 模糊图像还原&#xff08;Image Deblurring&#xff09;是计算机视觉中的一个重要任务&#xff0c;旨在从模糊的图像中恢复出清晰的图像。模糊可以由于多种原因产生&#xff0c;例如相机抖动、运动模糊、焦点失准等。传统的图像去模糊方法通常依赖…

搭建抖音微短剧系统:源码部署与巨量广告回传全解析

在数字化浪潮中&#xff0c;抖音微短剧已成为内容创作的新宠。想要搭建一个高效的抖音微短剧系统&#xff0c;并实现与巨量广告的有效回传吗&#xff1f;本文将为您详细解析源码部署与广告回传的关键步骤。 一、源码部署&#xff1a;构建短剧系统的基石 源码是软件开发的起点…

vscode远程连接Ubantu

一、首先用VM虚拟机打开一个Linux系统 二、打开VScode 在扩展里安装 安装后&#xff0c;打开Linux查看IP地址 在VScode 中新建连接主机 输入linux_nameip地址 -A 然后输入Linux的登录密码 就可以远程操控 Linux了 可以在终端中远程控制Linux 点击左上角的打开文件夹可以很…

什么是 Azure OpenAI?

目录 一、说明 二、什么是 Azure OpenAI 2.1 网络结构 2.2 、为什么使用 Azure OpenAI 2.3 如何使用 Azure OpenAI 三、从哪里开始 Azure OpenAI 之旅 3.1 关于 Azure OpenAI&#xff0c;我还需要了解什么 3.2 RBAC 权限和角色 3.3 演示 1&#xff1a;在公共数据上应用…

【面试题】网络 http、https协议(第一篇)

1.简述HTTP协议 HTTP&#xff0c;全名超文本传输协议&#xff0c;是一个用于客户端与服务器之间进行数据传输的应用层协议&#xff0c;可以传输文本、图片、音视频等超文本内容。 1.HTTP使用TCP作为传输层协议&#xff0c;因此具有可靠性&#xff0c; 2.除此之外&#xff0c…

聚合项目学习

首先建立一个总的工程目录&#xff0c;里边后期会有我们的父工程、基础工程(继承父工程)、业务工程&#xff08;依赖基础工程&#xff09;等模块 1、在总工程目录中&#xff08;open一个空的文件夹&#xff09;&#xff0c;首先建立一个父工程模块&#xff08;通过spring init…

4面体空间内直链4点结构分布与占比

在30个点的4面体空间内取4个点&#xff0c;有30*29*28*27/2427405种取法&#xff0c;要求得到的4个点必须在直链上。只有144个结构符合要求&#xff0c;在平移操作下不重合的结构有36个。 这36个结构可以按照旋转对称性进一步分成3组0&#xff0c;1&#xff0c;4&#xff0c;每…

Anisble Playbook

文章目录 一、Playbook简介三种常见的数据格式Playbook特点YAML语言介绍 二、Playbook核心组件host组件remote_user组件task列表和action组件gather_factsHandlers notifyignore_errors 三、playbook命令playbook命令tags 标签 四、Playbook中的变量setup模块中的变量Playbook命…

vue3 【提效】自动路由(含自定义路由) unplugin-vue-router 实用教程

不再需要为每一个路由编写冗长的 routes 配置啦&#xff0c;新建文件便可自动生成路由&#xff01; 使用方法 1. 安装 unplugin-vue-router npm i -D unplugin-vue-router2. 修改 vite 配置 vite.config.ts import VueRouter from unplugin-vue-router/viteplugins 中加入 V…

消费疲软,预期一下债券的平均收益

在预测消费疲软对债券平均收益的影响时&#xff0c;我们需要考虑多个因素&#xff0c;包括宏观经济环境、货币政策、通胀预期以及债券市场的具体表现等。以下是对债券平均收益的预期分析&#xff1a; 宏观经济环境与货币政策&#xff1a; 当前中国经济增速已转向高质量发展阶段…