基于Gurobi的订单配送问题

摘  要

在大数据时代,敏捷、准确的数据分析和预测将成为现实,各类大数据算法和AI(Artificial Intelligence,人工智能)算法不断涌现,在各行各业得到了广泛的应用。当前大数据算法可分为两类,一类是以统计和机器学习为代表的算法,另一类是以数学规划和启发式算法为代表的最优化算法。由于机器学习算法被广泛应用,对应的算法有大量的标准化工具,工程师和研究人员只需将问题建模成算法对应的形式即可应用对应的工具包。相比之下,数学规划和启发式算法则没有标准化的算法工具包可用,建模过程中,编写对应的模型代码。

最优化是利用现代数学、系统科学、计算机科学及其他学科综合使用,来研究人类从事的各种活动中处理事务的数量化规律,即在给定的约束之下如何求得某些因素的量,来使得某一指标达到最优的学科。最短路径问题是组合优化领域的经典问题之一,它广泛应用于计算机科学、交通工程、通信工程、系统工程、运筹学、信息论、控制理论等众多领域。最短路径问题是日常生活中最常见的最优化问题之一,分析最优化最短路径原理,使用python编程语言实现交通运输最短路径、行程安排最短时间、合理的工程安排等问题的解决。

关键词:最优化;订单配送;python

问题描述

在计划期内,企业需要将该周期内所有的订单按照要求配送到客户手中。通常情况下,市场中存在众多的物流供应商,且不同物流供应商零担和整车的规格和费用可能会存在差异,因此如何选择合适的物流供应商使得总配送成本最低是企业需要面对的问题。

从企业的角度,需要考虑如下两个问题,且这两个问题相互影响:

(1)不同物流订单之间如何组合;

(2)挑选物流供应商以及配送方式(零担或整车)。

问题思路

对计划周期内所有订单来说,如果给出一种可行的订单组合方案,根据物流供应商的报价,企业可以很容易制定出总成本最低的配送方案。

对单个特定的订单而言,可以很容易判断与其它订单的关系:

对计划期内的订单来说,最难处理的情况是所有的订单都可以拼单[相同起终点和相同配送时间],这时所有的订单都会出现在模型中,极大的增加了问题规模和求解难度。但现实情况,订单往往会有不同的起终点和配送时间,因此能够拼单的订单量不大,例如有{A,B,C,D,E,F,G,H}共8个订单,根据订单信息可以将订单分为{A},{B, H},{C},{D},{E,F},{G}共6个订单集合。只有元素为多个的集合可以拼单,这时由模型决定是否拼单以及配送方式。对不能拼单的订单可以直接找到最合适的配送方案(价格最低]。

预处理(不可以拼单的订单)

目的:直接找到成本最低的配送方案,即确定由哪个物流供应商采取何种方式(整车或零担)配送。

方法:

(1)零担运输,找出可以用的零担车型,主要考虑时间,地点和载量的匹配。挑选出成本最低的物流供应商。

(2)整车运输,同理找出可用的整车车型,注意考虑载量约束时需要满足整车率。从可行方案中挑选出成本最低的配送方案。

预处理(可以拼单的订单)

目的:以某一订单为标准,识别所有可以和该订单拼单的订单,把这些订单组成一个集合,在该集合上建立数学模型。

方法:对某一特定订单,遍历所有未完成订单,搜索可以拼单的订单。能否拼单取决于起终点和配送时间是否匹配。为了进一步减少模型中的变量数量,对每一个物流供应商,找到所有能够使用的零担和整车车型,不能使用的车型不会出现在变量中。

拼单订单模型

Model Parameters:

O theset of Orders.

P the set of logistics providers.

V the set of types of  trucks of а logistics provider.

M the set of the number of available trucks of а type of а logistics provider.cp
L the cost of the v-type truck of logistics provider р.
W¡ the weight of the i-th order.

Wp the capacity of v-type truck of logistics provider р.

Model Variables:

X binary variables, equals one if the order i is assigned to the m-th truck of v-type of  logistics provider p,otherwise zero.

Y binary variables, equals one if the m-th truck of v-type of logistics provider p is used, otherwisezero,

方案优势:

(1)将所有订单按照是否能够拼单分为两大类。对不能拼单的订单通过简单的处理直接找到最优的配送方案;

(2)对能够拼单的订单,建立了数学规划模型,并借助预处理进一步缩减变量数量。并且该模型可以直接被Gurobi求解;

(3)考虑到实际能够拼单的量不是很大,该方案可以很快得到问题的最优解。

参考代码

from gurobipy import *

import xlrd

import xlwt

import sys

from datetime import *

from xlrd import xldate_as_tuple

def ReadData(Orders, Logistics, LogisticsNum):

    data = xlrd.open_workbook("订单信息.xlsx")

    table = data.sheets()[0]

    nrows = table.nrows #行数

    ncols = table.ncols #列数

    for i in range(1,nrows):

        row = []

        for j in range(1,ncols):

            cell = table.cell_value(i,j)

            if table.cell(i,j).ctype == 3:

                date = datetime(*xldate_as_tuple(cell, 0))

                cell = date.strftime('%Y/%m/%d')

                row.append(cell)

            else:

                row.append(cell)

                

        d1 = datetime(int(row[3][0:4]), int(row[3][5:7]), int(row[3][8:]))

        d2 = datetime(int(row[4][0:4]), int(row[4][5:7]), int(row[4][8:]))     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值