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

Posted 基础运筹学/混合整数规划

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简洁的小H车调运模型相关的知识,希望对你有一定的参考价值。

一个简洁的小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车调运模型的主要内容,如果未能解决你的问题,请参考以下文章

mpvue 初体验之改写车标速查小程序

js简洁代码片段

编写代码片段的更简洁的方法

20个简洁的 JS 代码片段

20个简洁的 JS 代码片段

创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)减速(车速自减)修改车牌号,查询车的载重量。 编写两个构造方法:一个没有(代码片段