2021-05-03

A题相关解题思路

本人能力有限,此内容仅为个人理解,如有错误,欢迎指正

所用参数及说明

  1. A i j A_{ij} Aij其中i=1~6分别表示6个物资储备库,j分别表示饮用水、食品等物资, A i j A_{ij} Aij表示为各个储备库中的各种物资现存数量。

  2. B i B_i Bi受灾点的群众人数,i=1~10。

  3. T i j T_{ij} Tij为运输时间,i=16,j=110。表示各个储备库到受灾点的运输时间。

  4. D n j D_{nj} Dnj为各个受灾点的物资需求量,由第一问求出。

  5. C i j C_{ij} Cij为惩罚成本,i=1,2,分别表示未满足需求单位惩罚成本(千元)和不同受灾点间未满足需求差值的单位惩罚成本(千元)。
    惩罚成本具体为啥意思,我也不懂,暂且认为是个常数吧

建模设计

前提条件假设
  • 首先考虑的是物资的优先级,对于优先级高的物资(食品、水、药品),不惜运输成本,只考虑时间,在最快的时间内送达受灾地。
    Ψ ( x ) \Psi{(x)} Ψ(x) 表示优先等级, Ψ ( x ) = 1 , 2 , 3 \Psi{(x)}=1,2,3 Ψ(x)=1,2,3共分为三级。水、食品、药品为一级,棉被、绷带为二级,帐篷为第三级。

  • 对应受灾人数的数量,安排运送物资的优先级,符合公平性规则。

  • 若储备库里的物资充足,则某一受灾点的某种所需物资将全部由一个储备库负责。若某个储备库中的某种物资不够某一受灾点的全部需求 ,则尽量不要超过三个储备库去调用物资。也不知道说的清不清楚,没看懂可以来问我

  • 由于大规模突发灾害通常导致交通设施的损毁,则运输时间更长的路径所需成本增加。 E i j = λ T + k E_{ij}=\lambda{T}+k Eij=λT+k 其中 E E E为物资库i到受灾点j的运输增加成本 λ \lambda λ k k k均为常数。

  • 假设对所有受灾点同时进行物资运输,运输所需的车辆、人力资源充足。

  • 受灾人数不会出现大量的增加。

模型建立

G 1 ( x ) G_1{(x)} G1(x)为速度目标函数,求解关于 G 1 ( x ) G_1{(x)} G1(x)的最小值。
我的思路是这样:

对受灾点B1——B10按人数降序排列,结合表 T i j T_{ij} Tij,选出每个受灾点 B i B_{i} Bi对应的最短时间 t 1 t1 t1,然后比较 t t t所对应的 A i j A_{ij} Aij物资是否充足( A i j > = D i j A_{ij}>=D_{ij} Aij>=Dij)。若物资充足,则 A i A_{i} Ai将物资直接运往 B i B_{i} Bi;若不足,则选取剩下的时间里,所对应的最短时间(t2、t3···),以此类推。(贪心算法)

伪代码:

for i in 1:10
	min=100000
	for m in 1:6
		if T[m][i]<min
			K[m]=T[m][i] //将所用时间列存储起来
			min=T[m][i]  //选出用时最短的时间
            n++   //最短时间t1所对应的第n号储备库
            sort(K)  //对时间序列进行升序排序,当t1所对应的存储库物资不够时,则使用t2所对应的存储库
        K->A //将用时和储备库对应起来
    for j in 1:6  //这里的j指所需的物品,1~6分别为饮用水、食品、帐篷、棉被、绷带和药品
    	if A[n][j]>=D[i][j] //A[n][j]指t1对应储备库存放j类物品数量,而D为第i个受灾点的需求量
    	  	A[n][j]-A=D[i][j]  //物资送出,重置A[n][j]
    	  	sum_time+=T[n][i]  
    	else 
    		n=k->1;   //此时n为K中第二个数,即第二短的时间所对应的储备库序号

        输出sum_time

进一步考虑: 如果物资并非特别紧急,必须考虑运输及经济成本。同时,按上述贪心算法会出现人数较少的受灾点分不到物资。仅有药品、食品、水是充足的。棉被和帐篷不足。所以,我个人认为,用贪心算法求最快速度仅仅适用于优先级较高的物品。

所以,对于优先级较低的物资,用 F ( x ) F{(x)} F(x)来表示棉被、帐篷、绷带的运输策略,则 F ( x ) = G 2 + G 3 + G 4 F{(x)}=G_2+G_3+G_4 F(x)=G2+G3+G4。其中 G 2 G_2 G2为时间成本, G 3 G_3 G3为道路受损的额外成本, G 4 G_4 G4为公平性准则下的惩罚成本。

首先是公平性罚分 G 4 G_4 G4,按照各受灾点的人数权重占总受灾人数的比重 ω i \omega_i ωi= B i ∑ i = 1 10 B i \frac{B_i} { \sum_{i=1}^{10} B_i} i=110BiBi来确定各个受灾点应获得多少物资。重新定义帐篷、棉被和绷带的编号分别为1,2,3, γ j \gamma_j γj( j = 1 , 2 , 3 j=1,2,3 j=1,2,3)分别表示这些物资的总数。则各个受灾点应获得的物资数量为 u i j u_{ij} uij= ∑ i = 0 10 \sum_{i=0}^{10} i=010 ∑ j = 1 3 \sum_{j=1}^3 j=13 ω i × γ j {\omega_i }\times{\gamma_j} ωi×γj.而惩罚函数则为:

                    G 4 G_4 G4= C i × C_i \times Ci× ( D i j − u i j ) (D_{ij}-u_{ij}) (Dijuij)

其次是时间和道路的额外成本,由前文提到道路损坏的额外成本由运输时间决定。所以下一步是要确定时间,这是一个最优化问题,按理说应该用非线性规划求解。所以,我按照这种思路建模:

第i个储备库向第j个受灾点的货物供应量第 n n n种货物的量为 S i j n S_{ij}^n Sijn n n n=1,2,3),第i个仓库到第j个市场的时间为 T i j T_{ij} Tij。这里,我们的目标是最小化时间和每一种货物供应量的乘积的结果:

m i n G 2 = ∑ i = 1 6 ∑ j = 1 10 ∑ n = 1 3 S i j n T i j min \quad G_2=\sum_{i=1}^6\sum_{j=1}^{10}\sum_{n=1}^3S_{ij}^nT_{ij} minG2=i=16j=110n=13SijnTij

s . t . = { ∑ i = 1 6 S i j n ≤ A i n , n = 1 , 2 , 3 ∑ j = 1 10 S i j n ≤ u ( j ) , j = 1 , 2...10 S i j n ≥ 0 s.t.=\left\{ \begin{aligned} \sum_{i=1}^6 S_{ij}^n \leq A_i^n&, n=1,2,3 \\ \sum_{j=1}^{10}S_{ij}^n \leq u(j)&, j=1,2...10 \\ S_{ij}^n \geq0 \end{aligned} \right. s.t.=i=16SijnAinj=110Sijnu(j)Sijn0,n=1,2,3,j=1,2...10

关于求解非线性规划,可以调用遗传算法得到较为准确的结果。但这里面数据量较少,可以直接使用matlab里的函数接口:
[ x , f v a l ] = f m i n c o n ( f u n , x 0 , A , b , A e q , b e q , l b , u b , n o n l c o n , o p t i o n s ) [x,fval]=fmincon(fun,x_0 ,A,b,Aeq,beq,lb,ub,nonlcon,options) [x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

最后,是道路的额外损坏成本,即 G 3 G_3 G3= E E E( G 1 G_1 G1)

F ( x ) = G 2 + G 3 + G 4 F(x)=G_2+G_3+G_4 F(x)=G2+G3+G4

总结一下,对于优先级高的物资采用贪心算法,只追求速度。对于优先级较低的采用非线性规划。这只是我个人对A题的建模思路,后面肯定还有较大的修改。要是有好的思路也可以一起交流。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值