A题相关解题思路
本人能力有限,此内容仅为个人理解,如有错误,欢迎指正
所用参数及说明
-
A i j A_{ij} Aij其中i=1~6分别表示6个物资储备库,j分别表示饮用水、食品等物资, A i j A_{ij} Aij表示为各个储备库中的各种物资现存数量。
-
B i B_i Bi受灾点的群众人数,i=1~10。
-
T i j T_{ij} Tij为运输时间,i=16,j=110。表示各个储备库到受灾点的运输时间。
-
D n j D_{nj} Dnj为各个受灾点的物资需求量,由第一问求出。
-
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}) (Dij−uij)
其次是时间和道路的额外成本,由前文提到道路损坏的额外成本由运输时间决定。所以下一步是要确定时间,这是一个最优化问题,按理说应该用非线性规划求解。所以,我按照这种思路建模:
第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=1∑6j=1∑10n=1∑3SijnTij
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=1∑6Sijn≤Ainj=1∑10Sijn≤u(j)Sijn≥0,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题的建模思路,后面肯定还有较大的修改。要是有好的思路也可以一起交流。