【数学建模】物资调度的线性约束条件优化模型

1. 问题描述

某地区各县市的分布情况如图所示,图中的边表示连接各县市的公路,边权值表示车辆通过该路段所需的时间。

这里写图片描述

现在 D1, D2, D3 三地突发自然灾害,每天需要应急物资分别为 100 吨、80 吨和 60 吨;而能提供应急物资的县市为 A1, A2, …, A12,它们每天能提供 (30, 15, 15, 20, 35, 40, 30, 20, 10, 25, 25, 30) 吨的应急物资。
如果 A1, A2, …, A12 各地所提供的应急物资,其成本分别为 (2, 4, 5, 3, 1, 6, 2, 3, 6, 1, 5, 5)
万元/ 吨,请设计一份经济快速的应急物资运送方案,使得每天都能保证 D1, D2, D3 三地对应急物资的需求。

2. 基本假设与符号约定

为了简化问题和方便讨论,除问题中给出的假设外,我们进一步做如下的假设和说明:
(1)假设所有物资对于灾区人民的价值是相同的。
在此,我们也约定文中所用符号如下:

这里写图片描述

运输物资的吨数:

运输吨数28( A1 )34( A2 )21( A3 )30( A4 )17( A5 )25( A6 )39( A7 )40( A8 )7( A9 )14( A10 )10( A11 )3( A12 )
D1 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
D2 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24
D3 x25 x26 x27 x28 x29 x30 x31 x32 x33 x34 x35 x36

3. 问题的分析与模型的建立

  • 问题的分析

显然,给定的问题是一个优化问题,目标是经济快速的应急物资运送方案。分析题意可知,运送的总代价是时间代价T和成本代价W的和,而时间的代价是由每个物品运达的时间总和决定的,也就是县市到受灾地t运输的吨数x与所花费的时间的乘积x*t。成本代价就是运输吨数x与每吨的成本w的乘积x*w。这两部分相互制约:时间代价越低,成本代价可能就会越高,反之依然。因此,原问题要求在时间代价和成本代价之间找到一种平衡,使得总代价最小。
我们通过函数F(x)=aT(x)+bW(x)(a+b=1,a0,b0)来对总代价也就是经济快速进行量化,结合实际情况对a,b参数的值进行调整,a的值越大越侧重于节约时间,b值越大越侧重于节约成本。
需要注意的是,因A12提供物资不能于当日到达,所以第一天需要单独考虑。

(1)节点重编码
对题目所给路径模型各节点进行编码,编码后网络图如下:
这里写图片描述
这里写图片描述

(2)求最短时间
通过floyd算法(源程序见附录1)求解提供应急物资的县市对应结点到达突发自然灾害的地区对应结点的最短时间,所得结果如下表格所示:

最短时间28( A1 )34( A2 )21( A3 )30( A4 )17( A5 )25( A6 )39( A7 )40( A8 )7( A9 )14( A10 )10( A11 )3( A12 )
D1 78461112.517.511.5162222.528
D2 11124637161313.519.52025.5
D3 748211711520211632

(3)数学模型建立

x=(x1,x2...x36)

F(x)=aT(x)+bW(x)

T(x)=i=136xit(i)

W(x)=i=112(x1+xi+12+xi+24)w(i)

等式约束条件:
x1+x2...+x12=100x13+x13...+x24=100x25+x24...+x36=100

不等式约束条件:
x1+x13+x2530x2+x14+x2615x3+x15+x2715x4+x16+x2820x5+x17+x2935x6+x18+x3040x7+x19+x3130x8+x20+x3220x9+x21+x3310x10+x22+x3425x11+x23+x3525x12+x24+x3630

(4)编程求解结果
a=1,b=0时:

运输吨数28( A1 )34( A2 )21( A3 )30( A4 )17( A5 )25( A6 )39( A7 )40( A8 )7( A9 )14( A10 )10( A11 )3( A12 )
D1 3015152000007.998612.001400
D2 00003540002.00142.998600
D3 000000302000100

F(x)=1962.5

a=0,b=1时:

运输吨数28( A1 )34( A2 )21( A3 )30( A4 )17( A5 )25( A6 )39( A7 )40( A8 )7( A9 )14( A10 )10( A11 )3( A12 )
D1 12.17896.46045.74438.370914.1984012.17898.3709010.43239.766112.2990
D2 10.05885.01314.48516.697811.7359010.05886.697808.36887.68329.2007
D3 7.76233.52653.20694.93149.065707.76234.931406.19895.74526.8694

F(x)=685

a=0.5,b=0.5时:

运输吨数28( A1 )34( A2 )21( A3 )30( A4 )17( A5 )25( A6 )39( A7 )40( A8 )7( A9 )14( A10 )10( A11 )3( A12 )
D1 3010.36671514.633300007.815122.184900
D2 00003540002.18492.815100
D3 04.633305.36670030200000

F(x)=1358.8

ab总代价F(x)
101962.5
01710
0.50.51358.8

(5)总结分析
上图表格分别展示了侧重于考虑时间,侧重于考虑成本,以及综合考虑时间与成本的分配方案。其中a=0.5,b=0.5仅为综合考虑时间与成本时的一种情况,要获得具体的分配方案,则需依据实际情况对a,b参数进行赋值。
通过表格1可以观察到A12提供应急物资到三个受灾地区所需时间均大于24小时,其余地区都可在当天内运达。因A12提供物资不能于当日到达,A12所提供物资将计入次日提供物资量。由于灾害发生后第一天内不能接收到A12的物资,所以第一天需单独考虑。
因此计算第一天分配方案时,则需要除去A12所对应的三个变量,得到部分总代价值如下表:

abF(x)
101962.5
01710
0.50.51358.8

floyd:

#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;
const int INF=99999999;
const int maxn=100;
float dis[100][100];
int n,m;
void Init()
{
      for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                 if(i==j)dis[i][j]=0;
                 else dis[i][j]=INF;
            }
}
void Floyd()
{
      for(int k=1;k<=n;k++)
           for(int i=1;i<=n;i++)
              for(int j=1;j<=n;j++)
                   if(dis[i][j]>dis[i][k]+dis[k][j])
                      dis[i][j]=dis[i][k]+dis[k][j];
}
int main()
{
      scanf("%d%d",&n,&m);
      Init();
      int a,b;
      float c;
      for(int i=1;i<=m;i++)
      {
            scanf("%d%d%f",&a,&b,&c);
            dis[a][b]=c;
            dis[b][a]=c;
      }
      Floyd();
      cout<<"check:"<<endl;
      while(1)
      {
           scanf("%d%d",&n,&m);
           if(n==0 && m==0)break;
           cout<<dis[n][m]<<endl;
      }
}

MATLAB求解线性规划模型:

   a=1;
   b=0;
   f=[7*a+2*b;   8*a+4*b;   4*a+5*b;   6*a+3*b;   11*a+1*b;   12.5*a+6*b;   17.5*a+2*b;      11.5*a+3*b;   16*a+6*b;   22*a+1*b;   22.5*a+5*b;   
     11*a+2*b;  12*a+4*b;   4*a+5*b;   6*a+3*b;    3*a+1*b;      7*a+6*b;     16*a+2*b;     13*a+3*b; 13.5*a+6*b; 19.5*a+1*b;     20*a+5*b;
      7*a+2*b;   4*a+4*b;   8*a+5*b;   2*a+3*b;   11*a+1*b;      7*a+6*b;     11*a+2*b;      5*a+3*b;   20*a+6*b;   21*a+1*b;     16*a+5*b; ];
   A=[1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 
      0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
      0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 
      0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
      0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
      0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 
      0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 
      0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 
      0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0  
      0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 
      0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 
      ];
   b=[30 15 15 20 35 40 30 20 10 25 25 ];
   Aeq=[1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 ];
   beq=[100 80 60];
   lb=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
   [x,fval]=linprog(f,A,b,Aeq,beq,lb,[])
  • 18
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值