zoukankan      html  css  js  c++  java
  • 一个简洁的小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车遭遇低谷,已成陌路黄瓜。所以“神马都是浮云,只有运筹永存:)”。

  • 相关阅读:
    RequireJS进阶(二)
    JavaScript判断元素为数字的奇异写法
    RequireJS进阶(三)
    RequireJS进阶(一)
    读Ext之十四(Ext元素)
    JavaScript中__proto__与prototype的关系
    工作流术语
    一个例子(Hello World)
    无题
    再谈调用子流程(1)
  • 原文地址:https://www.cnblogs.com/leapms/p/10128077.html
Copyright © 2011-2022 走看看