交货任务

图片

在本文中,我们将了解Flexport如何使用数学和数据科学解决交付问题并以最低的成本准时交付商品。

考虑一个投机性场景:对于任何货运,货运代理都有十个出发点和一个目的地航班。唯一要做出的决定是是否将每个货件分配给该单个航班。如果我们没有为航班分配特定的负载,则可以以其他方式移动它。

每批货物都有数量和成本,并且航班数量有限。您可能将其视为简化的背包问题。因此,有1024-1 = 1023个可能的解决方案(我们不会将飞机发送到完全空的状态)。

我们可以创建一个电子表格以列出整个解决方案,然后选择利润最高的解决方案。但是,如果您有10个相同的出发航班却有2个航班,该怎么办?仅10批出货就提供了59,049个解决方案。

大型货运代理有十多个出发点,当然还有两个以上的航班可供选择,这导致了数万亿到数万亿的可能解决方案。其中只有数百万个可行的解决方案,这意味着传统的电子表格方法可以找到至少一个可行的解决方案。但是,我们并不需要可行的解决方案。我们需要最佳,最佳的解决方案。如何在众多可能性中找到它们?一种答案是使用整数编程。

整数编程是离散优化的一个子部分,是与受约束约束的一些目标函数最小化有关的操作研究领域。我们希望将总成本降到最低,只要将货物以正确的位置按时交付,并以ULD(单位装载设备-一种包装货物的方式)堆叠。我们努力寻求最佳解决方案,但实际上有时我们无法实现。在这种情况下,我们对良好或接近的解决方案感到满意。在这里,我们将自己局限于一个简单的模型,在该模型中可以实现最佳解决方案。

解决此问题的第一步是转向文献。科学界多年来一直在处理货运代理。我们发现了几本让人回想起我们问题的作品。我们从这些作品中采用了以下许多概念和符号,并感谢作者对这一领域的贡献。

我们首先定义目标函数。为了最大程度地降低成本,我们需要了解标准重量的概念。简而言之,标准重量是货运代理同意使用的最小重量,而与实际提供的重量无关。我们有总重量,标准重量以及超载的赔率,反之则是体重不足。标准重量乘以体重不足是一种低估,因此我们可以忽略体重不足,而将注意力放在过载系数乘以过载本身上。

目标功能是使总成本最小化,总成本定义为ULD分配的所有货物的总重量乘以负载系数。例如,如果ULD1拥塞100公斤,而ULD1的拥塞率是每公斤$ 4,那么ULD1的总成本将是$ 400。因此,我们需要一些关于超重及其价值的表示法。

yjE  -重量ULD j高于标准,并且 cjE -同一ULD的成本因素。我们需要计算yjEcjE 对所有人 j如果j1,2,3那么目标函数将是 y1Ec1E+y2Ec2E+y3Ec3E它崩溃成yjEcjE我们希望使价值最小化,因此我们的最终目标是:

minjyjEcjE


价值 cjE不是计算值。此参数是从电子表格或数据库获得的。yjE 我们定义为ULD的总过载重量 j,我们可以将其计算为ULD分配的所有耗材的总重量(表示为 yj)减去此ULD的标准重量。标准重量特定于ULD类型,并且也是一个参数。UjP  是ULD的标准重量 j以千克为单位。然后是超重的额外重量j 定义为 yjE=yjUjP
当然,ULD的总权重取决于分配给ULD的权重及其权重。因此,我们需要一个表达式来计算它,包括上面提到的细节。

这只是ULD分配的权重之和。如何指示一批货物已分配给特定的ULD?为此,我们不需要参数,而是解决方案变量。决策变量是求解器可以在最小化目标函数的同时进行控制的东西。

让参数gi 代表毛重 i以千克为单位。
例如,g4=500表示4的负载重500公斤。

xi,j  -装运时取值为1的决策变量 iULD分配 j0除此以外。因此,当我们要计算ULD 3分配的所有货运时,我们可以遍历所有变量xi,j哪里 j=3如果我们有4个货件,并且货件编号1和3被分配给ULD 3,则如下所示:

x1,3+x2,3+x3,3+x4,3=1+0+1+0=2

但是我们需要总重量,而不是数量。要获得它,只需将每个解决方案变量乘以权重参数即可。由于决策变量的值为0,因此如果未分配权重,则将重置此权重并且不将其包括在总计中。假设货物1至4的重量分别为10、50、25和5。那么ULD 3中的总重量为:

g1x1,3+g2x2,3+g3x3,3+g4x4,3=(10)(1)+(50)(0)+(25)(1)+(5)(0)=10+25=35


让我们大致写出总重量的计算。确定ULD的总重量jyj然后y1=g1x1,1+g2x2,1++gixi,1y2=g1x1,2+g2x2,2++gixi,2我们可以使用求和符号来折叠y1=gixi,1y2=gixi,2因为我们希望所有情况都如此j,我们使用“所有人”符号: 这为我们提供了总重量限制的最终形式:

yj=iIgixi,jjJ



超重


现在我们有了总重量,我们可以将公式应用于额外的负载:

yjE=yjUjPjJ



例如,如果 y1=1500U1P=1000然后超重 y1E=15001000=500公斤。将此乘以成本因子即可得出结果。乍一看,这似乎足够了,但是当ULD的整个货物的总重量不超过标准重量时,该怎么办?在这种情况下,如果我们使用“原样”公式,则过载权重将为负数。例如,如果标准重量为1650千克,分配的总重量为1000千克,则过载= 1000–1650 = -650。目标函数将此数字乘以过载的系数,得到负数。好像承运人为我们支付的运费少于标准重量的费用。

这是我们真正想要的:max(yjE,0)
这与为变量设置0相同,就像创建约束一样简单yjE>=0

yjE>=yjUjPjJyjE>=0jJ

因此,我们在数学编程中实现了max()函数:a = max(b,c),即a> = b && a> = c。让我们看看我们的定义。
目标功能:minjyjEcjE
cjE:ULD过载率 j
yjE:ULD超载 j;

Source: https://habr.com/ru/post/undefined/


All Articles