Gurobi求解运输问题

表上作业法求解运输问题是运筹学里面的方法,在实际过程中可以直接使用求解器,简单又快捷。

文章目录

  • 前言
  • 一、pandas是什么?
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
  • 总结


前言

Gurobi对于线性规划问题的求解是非常简单的,求解运输问题也是easy job,这个推文就是关于运输问题的求解。


一、运输问题的数学模型

使用Gurobi求解模型很重要的一点是数学模型,运输问题的数学模型是非常简单的,无论是产销平衡还是产销不平衡问题。数学模型如下

Gurobi求解运输问题_第1张图片

二、Gurobi的使用

Gurobi的使用又标准的一套流程:变量设定、设置目标函数、添加约束、模型求解和结果的输出。

具体的代码如下:

import numpy as np
from gurobipy import *

# 数据准备
supplyNum=3           #供应商数量
demandNum=4           #需求商数量
A=np.array([16,10,22])           #产量
B=np.array([8,14,12,14])         #销量
C=np.array([[4,12,4,11],[2,10,3,9],[8,5,11,6]])       #成本
supply=[i for i in range(supplyNum)]    #供应商点集合
demand=[i for i in range(demandNum)]    #零售商点集合


#构建模型
model=Model('transportation')
x={}      #创造一个决策变量的储存列表

#添加决策变量
for i in supply:
    for j in demand:
        name='x'+str(i)+'_'+str(j)
        x[i,j]=model.addVar(0,GRB.INFINITY,vtype=GRB.CONTINUOUS,name=name)

#添加目标函数
model.setObjective(sum(x[i,j]*C[i,j] for i in supply for j in demand),GRB.MINIMIZE)

#添加产量约束
for i in supply:
    model.addConstr(sum(x[i,j] for j in demand)==A[i])

#添加销量约束
for j in demand:
    model.addConstr(sum(x[i,j] for i in supply)==B[j])

# 模型求解
model.optimize()

#结果输出
for key in x.keys():
    if x[key].X>0:
        print(x[key].Varname,x[key].X)
print('最小成本为:',model.ObjVal)
 
  

最后的结果输出为:

Gurobi求解运输问题_第2张图片


总结

以上就是使用Gurobi求解运输模型的过程,这里写约束和目标函数都是使用列表推导式,也有其他的写法,这里只是因为我习惯用列表推导式,写起来会很方便,很快捷。

这个例子个人感觉很适合Gurobi初学者入门(当然,我也是初学者),比车辆路径问题的实现简单许多。

你可能感兴趣的:(python,算法)