一个简洁的小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车调运模型的主要内容,如果未能解决你的问题,请参考以下文章
创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)减速(车速自减)修改车牌号,查询车的载重量。 编写两个构造方法:一个没有(代码片段