A tarefa da entrega de mercadorias

imagem

Neste post, veremos como o Flexport usa a matemática e a ciência de dados para resolver problemas de entrega e entregar mercadorias no prazo, com o menor custo possível.

Considere um cenário especulativo: o remetente tem dez partidas e um voo de destino para qualquer remessa. A única decisão a ser tomada é se deve atribuir cada remessa a esse único voo. Se não atribuirmos uma carga específica ao voo, suponha que seja possível movê-la de outra maneira.

Cada remessa tem volume e custo, e o voo é limitado em volume. Você pode pensar nisso como um problema simplificado de mochila. Portanto, existem 1024-1 = 1023 soluções possíveis (não enviaríamos o avião completamente vazio).

Poderíamos criar uma planilha para listar toda a solução e escolher a mais rentável. Mas e se você tiver as mesmas dez partidas, mas dois vôos? São 59.049 soluções em apenas 10 remessas.

Um grande despachante tem mais de dez partidas e, é claro, mais de dois vôos para escolher, o que leva a trilhões a trilhões de possíveis soluções. Entre eles, apenas milhões são viáveis, o que significa que o método tradicional de planilha pode encontrar pelo menos uma solução viável. Mas não precisamos apenas de soluções viáveis. Precisamos das melhores e melhores soluções. Como encontrá-los entre inúmeras possibilidades? Uma resposta é usar a programação inteira.

A programação inteira é uma subseção da otimização discreta, uma área de estudo de operações relacionada à minimização de algumas funções objetivas sujeitas a restrições. Queremos minimizar os custos totais, desde que as mercadorias sejam entregues pontualmente nos lugares certos, empilhadas em ULD (Dispositivo de Carga da Unidade - um meio de embalar mercadorias). Nós nos esforçamos por uma solução ideal, mas na prática às vezes não conseguimos alcançá-la. Nesse caso, estamos satisfeitos com uma solução boa ou próxima. Aqui nos restringimos a um modelo simples no qual a solução ideal é alcançável.

O primeiro passo para resolver este problema é recorrer à literatura. A comunidade científica lida com o encaminhamento de frete há muitos anos. Encontramos vários trabalhos que lembram muito o nosso problema. Tiramos muitos dos seguintes conceitos e notações desses trabalhos e agradecemos aos autores por sua contribuição a essa área.

Começamos definindo a função objetivo. Para minimizar os custos, precisamos entender o conceito de peso padrão. Em resumo, o peso padrão é o peso mínimo com o qual o remetente concorda em trabalhar, independentemente do peso realmente oferecido. Temos peso total, peso padrão e chances de sobrecargas e, inversamente, baixo peso. O peso padrão vezes o baixo peso é uma subestimação, para que possamos ignorar o baixo peso e focar no fator de sobrecarga multiplicado pela própria sobrecarga.

A função objetivo é minimizar o custo total, definido como o peso total de todas as mercadorias atribuídas pela ULD, multiplicado pelo fator de carga. Por exemplo, se o ULD1 tiver 100 kg de congestionamento e a taxa de congestionamento do ULD1 for de US $ 4 por quilograma, o custo total do ULD 1 será de US $ 400. Portanto, precisamos de alguma notação por estar acima do peso e por seu valor.

Deixe seryjE  - peso ULD j acima do padrão e cjE - fator de custo para o mesmo ULD. Precisamos calcularyjEcjE para todos j. E sej1,2,3então a função objetivo será y1Ec1E+y2Ec2E+y3Ec3E. Desmorona parayjEcjE. Queremos minimizar o valor, portanto, nosso objetivo final:

minjyjEcjE


Valor para cjEnão é um valor calculado. Este parâmetro é obtido de uma planilha ou banco de dados. MasyjE definimos como o peso total de sobrecarga para ULD j, que podemos calcular como o peso total de todos os suprimentos atribuídos pela ULD (denotá-lo yj), menos o peso padrão deste ULD. O peso padrão é específico para o tipo ULD e também é um parâmetro. Deixe serUjP  é o peso padrão para ULD jem quilogramas. Em seguida, a quantidade de peso extra para ULDj definido como yjE=yjUjP.
O peso total do ULD, é claro, depende de quais pesos são atribuídos ao ULD e seu peso. Portanto, precisamos de uma expressão para calculá-lo, incluindo os detalhes mencionados acima.

Esta é simplesmente a soma dos pesos atribuídos pela ULD. Como indicar que um lote de mercadorias foi atribuído a um ULD específico? Para fazer isso, não precisamos de um parâmetro, mas de uma variável de solução. Uma variável de decisão é algo que o solucionador pode controlar enquanto minimiza a função objetivo.

Deixe o parâmetrogi representa peso bruto iem quilogramas.
Por exemplo,g4=500significa que uma carga de 4 pesa 500 kg.

Deixe serxi,j  - uma variável de decisão que assume o valor 1, se a remessa iatribuído por ULD je 0de outra forma. Assim, quando queremos contar todas as remessas atribuídas pelo ULD 3, podemos percorrer todas as variáveisxi,jOnde j=3. Se tivéssemos 4 remessas e os números de remessa 1 e 3 fossem atribuídos ao ULD 3, ficaria assim:

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

Mas precisamos de peso total, não de quantidade. Para obtê-lo, você pode simplesmente multiplicar cada variável da solução por um parâmetro de peso. Como a variável de decisão assume o valor 0, se não for atribuído um peso, esse peso será redefinido e não incluído no total. Suponha que os pesos das cargas de um a quatro sejam 10, 50, 25 e 5. Em seguida, o peso total na ULD 3 será:

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


Vamos escrever este cálculo do peso total em geral. Determinar o peso total do ULDj Como yj. Entãoy1=g1x1,1+g2x2,1++gixi,1e y2=g1x1,2+g2x2,2++gixi,2. Podemos recolher isso usando a notação de somay1=gixi,1 e y2=gixi,2. Como queremos que isso seja verdade para todos os possíveisj, usamos o sinal "para todos": . Isso nos dá a forma final do nosso limite de peso total:

yj=iIgixi,jjJ



Peso extra


Agora que temos o peso total, podemos aplicar nossa fórmula para a carga extra:

yjE=yjUjPjJ



Por exemplo, se y1=1500e e U1P=1000então peso extra y1E=15001000=500quilogramas. Multiplique isso pelo fator de custo para obter o resultado em dólares. À primeira vista, isso pode parecer suficiente, mas e o caso em que o peso total de toda a carga para ULD não excede o peso padrão? Nesse caso, se usássemos a fórmula "como está", o peso da sobrecarga seria um número negativo. Por exemplo, se o peso padrão for 1650 kg e o peso total designado for 1000 kg, sobrecarga = 1000-1650 = -650. A função objetivo multiplica esse número por um fator para sobrecargas e obtemos um número negativo. Como se a transportadora nos pagasse enviando menos do que o custo de um peso padrão.

Aqui está o que realmente queremos:max(yjE,0).
É o mesmo que definir 0 para uma variável, o que é tão simples quanto criar uma restriçãoyjE>=0.

yjE>=yjUjPjJ, yjE>=0jJ

Portanto, implementamos a função max () na programação matemática: a = max (b, c), ou seja, a> = b && a> = c. Vejamos nossas definições.
Função objetiva:minjyjEcjE
cjE: Taxa de sobrecarga ULD j
yjE: Sobrecarga de ULD j;

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


All Articles