La tarea de la entrega de bienes.

imagen

En esta publicación, veremos cómo Flexport utiliza las matemáticas y la ciencia de datos para resolver problemas de entrega y entregar productos a tiempo al menor costo posible.

Considere un escenario especulativo: el reenviador tiene diez salidas y un vuelo de destino para cualquier envío. La única decisión que se debe tomar es si asignar cada envío a este solo vuelo. Si no asignamos una carga específica al vuelo, supongamos que es posible moverlo de otra manera.

Cada envío tiene volumen y costo, y el vuelo tiene un volumen limitado. Puede considerarlo como un problema de mochila simplificado. Entonces, hay 1024-1 = 1023 posibles soluciones (no enviaríamos el avión completamente vacío).

Podríamos crear una hoja de cálculo para enumerar la solución completa y elegir la más rentable. Pero, ¿qué pasa si tiene las mismas diez salidas, pero dos vuelos? Esto es 59,049 soluciones en solo 10 envíos.

Un reenviador grande tiene más de diez salidas y, por supuesto, más de dos vuelos para elegir, lo que lleva a billones a billones de posibles soluciones. Entre ellos, solo millones son factibles, lo que significa que el método tradicional de hoja de cálculo puede encontrar al menos una solución factible. Pero no necesitamos solo soluciones viables. Necesitamos las mejores soluciones óptimas. ¿Cómo encontrarlos entre innumerables posibilidades? Una respuesta es usar programación entera.

La programación de enteros es una subsección de optimización discreta, un área de estudio de operaciones relacionadas con la minimización de alguna función objetivo sujeta a restricciones. Queremos minimizar los costos totales, siempre que los productos se entreguen a tiempo en los lugares correctos, apilados en ULD (Dispositivo de carga unitaria, un medio de embalaje de productos). Nos esforzamos por encontrar una solución óptima, pero en la práctica a veces no podemos lograrla. En este caso, estamos satisfechos con una solución buena o cercana. Aquí nos restringimos a un modelo simple en el que se puede lograr la solución óptima.

El primer paso para resolver este problema es recurrir a la literatura. La comunidad científica ha estado lidiando con el transporte de carga durante muchos años. Encontramos varios trabajos que recuerdan mucho nuestro problema. Tomamos muchos de los siguientes conceptos y notación de estos trabajos y agradecemos a los autores por su contribución a esta área.

Comenzamos definiendo la función objetivo. Para minimizar los costos, necesitamos comprender el concepto de peso estándar. En resumen, el peso estándar es el peso mínimo con el que el transportista acepta trabajar, independientemente del peso que se ofrezca realmente. Tenemos peso total, peso estándar y probabilidades de sobrecargas y, por el contrario, bajo peso. El peso estándar multiplicado por el peso insuficiente es una subestimación, por lo que podemos ignorar el peso insuficiente y centrarnos en el coeficiente de sobrecarga multiplicado por la propia sobrecarga.

La función objetivo es minimizar el costo total, definido como el peso total de todos los bienes asignados por ULD, multiplicado por el factor de carga. Por ejemplo, si ULD1 tiene 100 kilogramos de congestión y la tasa de congestión para ULD1 es de $ 4 por kilogramo, entonces el costo total de ULD 1 será de $ 400. Entonces, necesitamos alguna notación por sobrepeso y por su valor.

PermitiryjE  es el peso de ULD j por encima del estándar ycjE  - factor de costo para el mismo ULD. Necesitamos calcularyjEcjE para todosj . Sij1,2,3 , entonces la función objetivo seráy1Ec1E+y2Ec2E+y3Ec3E . Se derrumba ayjEcjE . Queremos minimizar el valor, por lo que nuestro objetivo final:

minjyjEcjE


Valor por cjEno es un valor calculado. Este parámetro se obtiene de una hoja de cálculo o base de datos. PeroyjE lo definimos como el peso de sobrecarga total para ULDj , que podemos calcular como el peso total de todos los suministros asignados por ULD (denotarloyj ), menos el peso estándar de este ULD. El peso estándar es específico para el tipo ULD y también es un parámetro. PermitirUjP  es el peso estándar para ULDj en kilogramos. Luego, la cantidad de peso extra para ULDj define comoyjE=yjUjP .
El peso total de la ULD, por supuesto, depende de los pesos asignados a la ULD y su peso. Por lo tanto, necesitamos una expresión para calcularlo, incluidos los detalles mencionados anteriormente.

Esto es simplemente la suma de los pesos asignados por ULD. ¿Cómo indicar que se ha asignado un lote de productos a un ULD específico? Para hacer esto, no necesitamos un parámetro, sino una variable de solución. Una variable de decisión es algo que el solucionador puede controlar mientras minimiza la función objetivo.

Deja que el parámetrogi representa el peso bruto de la cargai en kilogramos.
Por ejemplo,g4=500 significa que la carga 4 pesa 500 kilogramos.

Permitirxi,j  es una variable de decisión que toma el valor 1, si el envíoi asignaron ULDj y0 contrario. Por lo tanto, cuando queremos contar todos los envíos asignados por ULD 3, podemos recorrer todas las variablesxi,j , dondej=3 . Si tuviéramos 4 envíos, y los números de envío 1 y 3 se asignaron a ULD 3, se vería así:

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

Pero necesitamos peso total, no cantidad. Para obtenerlo, simplemente puede multiplicar cada variable de solución por un parámetro de peso. Como la variable de decisión toma el valor 0, si no se le asigna un peso, este peso se restablece y no se incluye en el total. Suponga que los pesos para las cargas uno a cuatro son 10, 50, 25 y 5. Entonces el peso total en ULD 3 será:

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


Escribamos este cálculo del peso total en general. Determine el peso total de la ULDj como yj. Entoncesy1=g1x1,1+g2x2,1++gixi,1y y2=g1x1,2+g2x2,2++gixi,2. Podemos colapsar esto usando la notación de sumay1=gixi,1 y y2=gixi,2. Ya que queremos que esto sea cierto para todos los posiblesj, usamos el signo "para todos": . Esto nos da la forma final de nuestro límite de peso total:

yj=iIgixi,jjJ



Peso extra


Ahora que tenemos el peso total, podemos aplicar nuestra fórmula para la carga adicional:

yjE=yjUjPjJ



Por ejemplo, si y1=1500y y U1P=1000luego peso extra y1E=15001000=500kilogramos Multiplique esto por el factor de costo para obtener el resultado en dólares. A primera vista, esto puede parecer suficiente, pero ¿qué pasa con el caso cuando el peso total de la carga completa para ULD no excede el peso estándar? En este caso, si utilizamos la fórmula "tal cual", entonces el peso de sobrecarga sería un número negativo. Por ejemplo, si el peso estándar es de 1650 kilogramos y el peso total asignado es de 1000 kilogramos, entonces sobrecarga = 1000–1650 = -650. La función objetivo multiplica este número por un factor para sobrecargas y obtenemos un número negativo. Como si el transportista nos pagara por un envío inferior al costo de un peso estándar.

Esto es lo que realmente queremos:max(yjE,0).
Esto es lo mismo que simplemente establecer 0 para una variable, que es tan simple como crear una restricciónyjE>=0.

yjE>=yjUjPjJ, yjE>=0jJ

Entonces, implementamos la función max () en programación matemática: a = max (b, c), es decir, a> = b && a> = c. Veamos nuestras definiciones.
Función objetiva:minjyjEcjE
cjE: Relación de sobrecarga ULD j
yjE: Sobrecarga ULD j;

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


All Articles