一个简洁的小H车调运模型

不久前, 帝都B城市到处都是小H车, 理想的小H车应该是布朗运动\均匀分布,可是现实上它们就是不均匀。于是有如下问题:

观察帝都 HD区SY村区域,将其划分成10个用车点,用大数据回归预测出第二天(周一)的用车数据如下,夜晚开始调运,务必满足第二天的需求,极小化调运总里程。

数据项 符号 用车点
地区  i 1 2 3 4 5 6 7 8 9 10
X-坐标  X[i] 0 200 155 70 90 45 88 44 60 111
Y-坐标 Y[i] 0 200 30 120 199 210 21 188 70 -22
夜晚有车数 P[i] 114 223 213 234 56 777 5 30 321 222
第二天需求数 R[i]  110  345  110  333  407  233  100 100   333 123 

调运车辆走的是城市距离,B城市交通道路复杂,假设城市距离是地点之间直线距离的1.56倍。为简化起见,上面的数据刻意地使得又车总数和需求总数相等。

建模

小H车问题看似复杂,其实模型十分简单。不过五分钟内写出并测试模型,需要你:第一、熟悉混合整数规划建模,有建模经验;第二、 有一个好用的建模语言。这里用+Leapms建模语言。

用x[i][j]表示从i到j的运车数量,于是目标是极小化总的调运量,即:

  minimize  sum{i=1,...,n; j=1,...,n; i<>j} x[i][j] D[i][j]   // (1)

上面的 D[i][j]=1.56 sqrt((X[i]-X[j])^2 + (Y[i]-Y[j])^2)  是i,j之间的城市距离。

对用车点 i,夜晚保有车数 P[i] 加上调入进来的车数 sum{*}x[*][i], 减去调出的车数sum{*}x[i][*] 应该大于第二天的需求R[i], 即:

  P[i]+sum{j=1,...,10;j<>i}x[j][i]-sum{j=1,...,10;j<>i}x[i][j]>=R[i] | i=1,...,n

当然,上式子可以简化,即只有有车数 P[j]>R[j] 时才可以调出, ..

  P[i]+sum{j=1,...,10;j<>i;P[j]>R[j]}x[j][i]-sum{j=1,...,10;j<>i;P[i]>R[i]}x[i][j]>=R[i] | i=1,...,n //(2)

由(1),(2)就完成了对问题的建模。

试求解

完整模型需要补充对符号的说明(where段)和数据段(data和data_relation), 其中的data是原始数据段,data_relation是在原始数据基础上的导出数据(方便模型表达),例如D[i][j]就是由坐标数据X和Y导出的。

在+Leapms环境中,用load命令调入并解析,随后使用mip命令(混合整数规划求解命令)就得到求解结果,过程如下(其中可见到带行号的完整模型):

+Leapms>load
Current directory is "ROOT".
.........
LittleYlwBike.leap
.........
please input the filename:littleylwbike
================================================================
1: minimize -->
2: sum{i=1,...,n;j=1,...,n;i<>j;P[i]>=R[i]}-->
3: D[i][j]x[i][j] //(1)
4:
5: Subject to
6:
7: P[i]+sum{j=1,...,n;j<>i;P[j]>R[j]}x[j][i]-->
8: -sum{j=1,...,10;j<>i;P[i]>R[i]}x[i][j]-->
9: >=R[i] | i=1,...,10 //(2)
10:
11: where
12:
13: n is a number
14: X,Y,R,P are sets
15:
16: x[i][j] is a variable of nonnegative integer-->
17: | i=1,...,10;j=1,...,n;i<>j;P[i]>=R[i]
18:
19: D[i][j] is a number | i=1,...,n;j=1,...,n;i<>j
20:
21: data
22:
23: X={0 200 155 70 90 45 88 44 60 111}
24: Y={0 200 30 120 199 210 21 188 70 -22}
25: P={114 223 213 234 56 777 5 30 321 222}
26: R={110 345 110 333 407 233 100 100 333 123}
27:
28: data_relation
29:
30: n=_$(X)
31:
32: D[i][j]=1.56*(sqrt((X[i]-X[j])^2+(Y[i]-Y[j])^2))-->
33: | i=1,...,n;j=1,...,n
34:
================================================================
>>end of the file.
Parsing model:
1D
2R
3V
4O
5C
6S
7End.
..................................
number of variables=36
number of constraints=10
..................................
+Leapms>solve
The LP is solved to optimal.
找到线性规划最优解.非零变量值和最优目标值如下:
.........
x1_9*=4
x3_2*=98
x3_9*=5
x6_2*=24
x6_4*=99
x6_5*=351
x6_8*=70
x10_7*=95
x10_9*=3
.........
Objective*=83995
.........
+Leapms>

从结果上看,第6用车点调出的车辆最多。

其他

B城市很大,当问题规模扩大后模型是否还可用。我认为是可用的,本题是一个网络流模型,可解的规模很大。另外模型在真实应用时可以做很多改进,例如采用嵌套结构、剔出距离D[i][j]大于某数量的变量(谁也不会傻到从B城东北角向最西南角凋车的地步),等等。

小H车遭遇低谷,已成陌路黄瓜。所以“神马都是浮云,只有运筹永存:)”。

一个简洁的小H车调运模型的更多相关文章

  1. 微信小程序ofo小黄车+thinkphp5.0打造全栈应用

    原文地址:https://www.imooc.com/article/20310 ofo至今还没有微信小程序(很费解),每次用ofo都得去支付宝,很不方便,我用微信用的比较多,无意间在简书上面看到某人 ...

  2. 苹果版小黄车(ofo)app主页菜单效果

    代码地址如下:http://www.demodashi.com/demo/12823.html 前言: 最近又是公司项目上线一段时间了,又是到了程序汪整理代码的节奏了.刚好也用到了ofo主页菜单的效果 ...

  3. 关于小黄车(ofo共享单车)使用的问题

    小黄车即ofo共享单车,号称是全球创立最早.成长最快.规模最大的无桩共享单车创业公司,缔造了"共享单车"概念,致力于解决城市出行问题.它的出现给大家带来了方便,作为一个商业运行的公 ...

  4. hihocoder 1347 小h的树上的朋友

    传送门 时间限制:18000ms单点时限:2000ms内存限制:512MB 描述 小h拥有$n$位朋友.每位朋友拥有一个数值$V_i$代表他与小h的亲密度.亲密度有可能发生变化.岁月流逝,小h的朋友们 ...

  5. 【C语言探索之旅】 第一部分第八课:第一个C语言小游戏

    ​ 内容简介 1.课程大纲 2.第一部分第八课:第一个C语言小游戏 3.第一部分第九课预告: 函数 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写 ...

  6. 【渗透笔记】拿下某小H网的全过程

    自从班上A片小王子的7个T资源被封了以后,本小白为造福全班同学,尝试拿下个小H网,先用webrobot搜某些只有小H网才会出现的关键词 本以为直接导出放御剑里跑就行了,然并软.于是用awvs扫了一下, ...

  7. 小H和密码

    链接:https://www.nowcoder.com/acm/contest/72/B来源:牛客网 题目描述     小H在击败怪兽后,被一个密码锁挡住了去路     密码锁由N个转盘组成,编号为1 ...

  8. 一个简洁、好用的Pytorch训练模板

    一个简洁.好用的Pytorch训练模板 代码地址:https://github.com/KinglittleQ/Pytorch-Template 怎么使用 1) 更改template.py 替换 __ ...

  9. 【Wannafly挑战赛10 - B】小H和密码(DP)

    试题链接:https://www.nowcoder.com/acm/contest/72/B 题目描述     小H在击败怪兽后,被一个密码锁挡住了去路     密码锁由N个转盘组成,编号为1~N,每 ...

随机推荐

  1. 51nod 1135 原根 就是原根...

    %%% dalao Orz ,筛素数到sqrt(n),分解ϕ(p),依次枚举判断就好了 #include<cstdio> #include<cstring> #include& ...

  2. bzoj [Noi2002]Savage 扩展欧几里得

    枚举m,n^2判断 对于野人i,j,(H[i]+x*S[i])%m==(H[j]+x*S[j])%m,且x<=O[i]&&x<=O[j],他们才有可能相遇 化简得:(S[i ...

  3. netty源码学习

    概述 Netty is an asynchronous event-driven network application framework for rapid development of main ...

  4. 如何做好技术Team Leader

    背景 互联网公司的技术团队管理通常分为2个方向:技术管理和团队管理,互联网公司的技术TL与传统软件公司的PM还是有很大的区别,传统软件公司的PM更多注重于对项目的管理包括项目任务拆解.项目进度以及风险 ...

  5. 深入学习Redis(5):集群

    前言 在前面的文章中,已经介绍了Redis的几种高可用技术:持久化.主从复制和哨兵,但这些方案仍有不足,其中最主要的问题是存储能力受单机限制,以及无法实现写操作的负载均衡. Redis集群解决了上述问 ...

  6. .net core webapi 前后端开发分离后的配置和部署

    背景:现在越来越多的企业都采用了在开发上前后端分离,前后端开发上的分离有很多种,那么今天,我来分享一下项目中得的前后端分离. B/S  Saas 项目:(这个项目可以理解成个人中心,当然不止这么点功能 ...

  7. ASP.NET Core - 利用Windsor Castle实现通用注册

    问题引入 在ASP.NET Core - 依赖注入这篇文章里面,我们知道了如何利用ASP.NET Core原生的容器来实现依赖注入的,那我们为什么要替换掉默认的 IoC容器呢?从ASP.NET Cor ...

  8. 游戏服务器h2engine架构优化和跨平台设计

    H2engine的GitHub星星不知不觉已经破百了,也没有特意推广过,但是慢慢的关注的人越来越多.因为事情多,好久没有写东西了,前一段时间有了一些想法,把h2engine又更新了一下,感觉h2eng ...

  9. .NET 平台上C#语言的基本技术点

    第一次用画图3D画的知识点,有点丑..........开始Csharp之路

  10. PHP中反射的简单实用(动态代理)

    <?php class mysql{ function connect($db){ echo "连接mysql数据库${db[0]} \r\n"; } } class ora ...