dijikstra 旅行商问题_第27期:基于旅行商问题(TSP)的配送网络优化—R实现

回国后,没有时间休息,一是工作不能耽误,二是很多杂乱的事情要处理,因此,公众号很久没有更新,实在抱歉!

本期的推文是关于旅行商问题(TSP)的配送网络优化,也是因为最近在指导学生参加省大学生现代物流设计大赛,才有此推文。在此,我要特别感谢我指导的学生!

16bd3a755abc2ea199a476231c2d93da.png

一、问题描述

云通物流配送中心要配货至8个步步高门店,设计一条运输费用最低的配送路线。各节点地理坐标如下表所示:

0fc9e2f57c93a883131e5c479dc0693b.png

显然,配送路线的优化要考虑很多因素,本期只简单的运用旅行商问题(TSP)进行优化设计。

library(knitr)

library(dplyr)

library(ggplot2)

#9个节点

n

#各节点间的经度和纬度最大值

#from 0 to ...

max_x

max_y

#设置随机种子,便于结果重现

set.seed(20201130)

#读取各节点原始数据

codes

#各节点散点图展示

ggplot(codes,aes(x, y)) + geom_point()

641a36b34cf8cdc6279d545c2bee470e.png

#计算各节点距离

distance

dist_fun

  vapply(seq_along(i), function(k)distance[i[k], j[k]], numeric(1L))

}

#基于ompr包构建模型

library(ompr)

model %

#构建节点i到节点j的决策变量

  add_variable(x[i, j], i = 1:n, j = 1:n,

               type = "integer", lb =0, ub = 1) %>%

  # a helper variable for the MTZ formulationof the tsp

  add_variable(u[i], i = 1:n, lb = 1, ub = n)%>%

  # minimize travel distance

  set_objective(sum_expr(dist_fun(i, j) *x[i, j], i = 1:n, j = 1:n), "min") %>%

# 配送路线不能走相同的节点

  set_bounds(x[i, i], ub = 0, i = 1:n) %>%

# 离开每个节点

  add_constraint(sum_expr(x[i, j], j = 1:n) ==1, i = 1:n) %>%

   # 到达每个节点

  add_constraint(sum_expr(x[i, j], i = 1:n) ==1, j = 1:n) %>%

  #确保没有子汇总(弧约束)

  add_constraint(u[i] >= 2, i = 2:n) %>%

  add_constraint(u[i] - u[j] + 1 <= (n - 1)* (1 - x[i, j]), i = 2:n, j = 2:n)

model

#计算结果如下

e04339b948dfd9cd2b6d93e09847d2a8.png

#我们使用GPLK算法计算该混合整数规划问题

library(ompr.roi)

library(ROI.plugin.glpk)

result

d60d2b83b9bff3e0e0d483614b07c7fd.png

result

#Status: optimal

#Objective value: 25.79845

solution %

 filter(value > 0)

kable(head(solution, 9))

#配送路线如下

5951d02389add1e05fef534b01a04c6c.png

#将各配送节点连接并可视化

paths %

 rename(from = i, to = j) %>%

 mutate(trip_id = row_number()) %>%

 tidyr::gather(property, idx_val, from:to) %>%

 mutate(idx_val = as.integer(idx_val)) %>%

 inner_join(codes, by = c("idx_val" = "id"))

kable(head(arrange(paths, trip_id), 6))

#结果

f3c080b97cc26fe70dc33f138de7a537.png

ggplot(codes, aes(x, y)) +

 geom_point() +

 geom_line(data = paths, aes(group = trip_id)) +

ggtitle(paste0("Optimal route with cost: ",round(objective_value(result), 2)))

830efb544033e820f2dc27823a130c79.png

参考文献:

Michael Hahsler&KurtHornik.TSP Infrastructure for the Traveling Salesperson Problem,Journal of StatisticalSoftware, 2007(12).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值