Python调用Gurobi:简单案例

  • Python调用Gurobi:Assignment Problem简单案例
    • 1. Assignment Problem Model
    • Python调用Gurobi建模求解Assignment Problem
  • OlittleRer

Python调用Gurobi:Assignment Problem简单案例

原文链接:https://blog.csdn.net/HsinglukLiu/article/details/107827469

1. Assignment Problem Model

我们考虑一个打车订单分配问题,假设有一个乘客rider集合RRR,一个司机driver的集合DDD, 我们考虑顾客数量和司机数量相等的情况,来将顾客和司机进行一对一的匹配,这个问题可以建模为一个整数规划Integer Programming,但是这个问题非常特殊,将binary constraints松弛掉,依然存在整数最优解。模型如下:

max⁡∑(i,j)∈Axijpij∑ixij=1,∀j∈D∑jxij=1,∀i∈Rxij∈{0,1},∀i∈R,j∈D\max \sum_{\left( i,j \right) \in A}{x_{ij}p_{ij}} \\ \sum_i{x_{ij}}=1, \qquad \forall j\in D \\ \sum_j{x_{ij}}=1, \qquad \forall i\in R \\ x_{ij}\in \left\{ 0,1 \right\} , \qquad \forall i\in R,j\in D max(i,j)∈A∑​xij​pij​i∑​xij​=1,∀j∈Dj∑​xij​=1,∀i∈Rxij​∈{0,1},∀i∈R,j∈D

首先我们生成一个profit矩阵,也就是两两匹配的收益矩阵

from gurobipy import *
import pandas as pd
import numpy as np
import random# generate matching value matrix
order_num = 20
profit_matrix = np.zeros((order_num, order_num))
for i in range(order_num):for j in range(order_num):if(i == j):profit_matrix[i][j] = 0else:random.seed(i * order_num + j) profit_matrix[i][j] = round(10 * random.random(), 1)
profit_matrix P = pd.DataFrame(profit_matrix)
P 

具体如下:

Python调用Gurobi建模求解Assignment Problem

我们用python调用gurobi建立上述模型,并直接调用gurobi的算法进行求解,结果如下:
注:这里主要用到的函数有:

  • model.addVar(lb, ub, vtype, name)
  • expr.addTerms(coef, var)
  • model.addConstr()
  • model.setObjective(expr, GRB.MAXIMIZE)
  • model.write('model.lp')
  • model.optimize()
  • model.getVars()
  • var.varName
  • var.x
    等常用函数,其中modelgurobipy.Model类型的对象,vargurobipy.Var类的对象,
    gurobipy.Varx属性表示变量var在当前求得的结果中的具体值。

当然还涉及到下面几个类:

  • LinExpr类: 用来构建线性表达式
  • gurobipy.Model类,用来构建model对象
# construct model object
model = Model('Assignment_Problem') # introduce decision variable by cycling
x = [[[] for i in range(order_num)] for j in range(order_num)]
for i in range(order_num):for j in range(order_num): x[i][j] = model.addVar(lb = 0,ub = 1 ,vtype = GRB.CONTINUOUS   # decision variable type,name = "x_" + str(i) + "_" + str(j)  )
#         x[i][j] = model.addVar(vtype = GRB.BINARY   # decision variable type
#                                 ,name = "x_" + str(i) + "_" + str(j)
#                                 )# objective function
obj = LinExpr(0)for i in range(order_num):for j in range(order_num): obj.addTerms(profit_matrix[i][j], x[i][j])model.setObjective(obj, GRB.MAXIMIZE)   # Constraint 1
for j in range(order_num):expr = LinExpr(0)for i in range(order_num):  expr.addTerms(1, x[i][j]) model.addConstr(expr == 1, name="D_" + str(i)) # Constraint 2
for i in range(order_num):expr = LinExpr(0)for j in range(order_num):  expr.addTerms(1, x[i][j]) model.addConstr(expr == 1, name="R_" + str(i)) # solve the constructed model
model.write('model.lp')
model.optimize()# print optimal solution
for var in model.getVars():if(var.x > 0):print(var.varName, '\t', var.x)

输出结果如下:

可以看到,即使把变量xij的类型由x_{ij}的类型由xij​的类型由GRB.BIINARY改变成GRB.CONTINOUS,最优解仍然是整数解

Warning: linear constraint 0 and linear constraint 1 have the same name "D_19"
Gurobi Optimizer version 9.0.1 build v9.0.1rc0 (win64)
Optimize a model with 40 rows, 400 columns and 800 nonzeros
Model fingerprint: 0x4f6b3c13
Coefficient statistics:Matrix range     [1e+00, 1e+00]Objective range  [1e-01, 1e+01]Bounds range     [1e+00, 1e+00]RHS range        [1e+00, 1e+00]
Presolve time: 0.01s
Presolved: 40 rows, 400 columns, 800 nonzerosIteration    Objective       Primal Inf.    Dual Inf.      Time0    1.8840000e+02   1.500000e+01   0.000000e+00      0s9    1.8650000e+02   0.000000e+00   0.000000e+00      0sSolved in 9 iterations and 0.01 seconds
Optimal objective  1.865000000e+02
x_0_15   1.0
x_1_0    1.0
x_2_16   1.0
x_3_10   1.0
x_4_13   1.0
x_5_19   1.0
x_6_4    1.0
x_7_12   1.0
x_8_18   1.0
x_9_5    1.0
x_10_17      1.0
x_11_8   1.0
x_12_3   1.0
x_13_6   1.0
x_14_9   1.0
x_15_2   1.0
x_16_7   1.0
x_17_11      1.0
x_18_1   1.0
x_19_14      1.0

作者:刘兴禄,清华大学,清华伯克利深圳学院,博士在读
联系方式:hsinglul@163.com
博客主页:https://blog.csdn.net/HsinglukLiu/article/details/107848461

OlittleRer

运小筹公众号是致力于分享运筹优化(LP、MIP、NLP、随机规划、鲁棒优化)、凸优化、强化学习等研究领域的内容以及涉及到的算法的代码实现。编程语言和工具包括Java、Python、Matlab、CPLEX、Gurobi、SCIP 等。

关注我们: 运筹小公众号

也欢迎广大同行投稿!欢迎大家关注我们的公众号“运小筹”以及粉丝群!

微信群:

QQ群:

QQ群里有我们共享的一些书籍、论文、算例等资料,欢迎大家加入。

Python调用Gurobi:Assignment Problem(指派问题)简单案例相关推荐

  1. 初学者:python调用gurobi入门混合整数规划小案例

    数学模型: ''' \ Model MIP \ LP format - for model browsing. Use MPS format to capture full model detail. ...

  2. Python调用Gurobi求解简单线性规划问题

    前言 Gurobi是一款功能强大的商用求解器,支持Python.C.C++.Java等多种语言调用,相比于Cplex,Gurobi封装更高,更加方便,但是对于初学者而言会更难一些.Gurobi与Cpl ...

  3. python调用有道翻译_python 简单的调用有道翻译

    代码 import json import requests # 翻译函数,word 需要翻译的内容 def translate(word): # 有道词典 api url = "http: ...

  4. linux 非root 安装ImageMagick 以及python调用ImageMagick将图片生成gif案例

    标题有点长,知识量拉满~ 首先进入链接 http://www.imagemagick.org/script/install-source.php 下载 下载ImageMagick.tar.gz ,下载 ...

  5. Python调用Gurobi基本操作

    接上篇学会了如何用python调用gurobipy之后,这篇总结一些学到的基本操作. tuplelist.tupledict.multidict.创建list. 1.tuplelist方法: tupl ...

  6. python爬取网易云音乐简单案例

    首先找到想要下载的歌曲表单,例如: 打开推荐 点击推荐的歌曲表单 接下来我们尝试爬取这个表单的全部歌曲名,及歌曲的MP3地址 我使用fiddler4抓包工具抓取相关信息 #encoding=utf8 ...

  7. python openpyxl 读取Excel,超简单案例python openpyxl 获取表格数据

    1. import openpyxl 导入openpyxl模块 import openpyxl #导入模块openpyxl 2. 获取的文件(×××.xlsx) 使用openpyxl下的方法获取Exc ...

  8. python调用函数实现银行ATM典型案例练习

    money = 500000 name = None name = input("请输入你的姓名:") # 定义查询函数 def query(show_header):if sho ...

  9. 手把手教你用Python调用SCIP求解最优化模型

    手把手教你用Python调用SCIP求解最优化模型 一个简单的例子 Python调用SCIP求解最优化模型的一般步骤 创建模型对象 创建决策变量 设置目标函数 创建约束 创建一般约束 创建广义约束 求 ...

最新文章

  1. php 485串口通信,485串口通信中的常见问题
  2. swift_000(Swift 的导读必看)
  3. 2021 - 10 -7 ! 二叉树的前序、中序、后序遍历 非递归思路(迭代版本)
  4. 2015年第六届蓝桥杯 - 省赛 - Java大学B组 - A. 三角形面积
  5. 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - I. 垒骰子
  6. 小论接口(interface)和抽象类(abstract class)的区别
  7. C语言试题五之计算并输出给定数组(长度为9)中每相邻两个元素之平均值的平方根之和
  8. Python3求解旋转矩阵问题
  9. antd vue form 手动校验_参与《开课吧》vue训练营笔记(Day1)
  10. Bootstrap 滚动监听插件Scrollspy 的事件
  11. 单片机ADC采样算法----中位值平均滤波法
  12. 为什么不能在scrollview中直接添加一个image,然后使animation.begin()??
  13. 需求规格说明书5.0版本
  14. 络达1562系统深度睡眠后RTC唤醒应用
  15. 正大国际琪貨召主涨沪:期货交易止损方法主要有那些
  16. 分享一下我的从业经历和工作感悟
  17. 【C认证】对标名企技术标准,大厂不是梦
  18. Poodle Centos
  19. SIM7600CE-CNSE 4G模组发送英文短信
  20. ==和equals的基本注意事项

热门文章

  1. UE4引擎源码学习笔记(一):源码整体文件结构
  2. Composure获取子层级图像:使用变换通道
  3. Vue实现动态路由导航
  4. 永恒之蓝病毒事件所引发的运维安全行业新思考
  5. linux多线程_免费Linux下载工具,你还不知道?
  6. 单片机设计智能浇水系统
  7. 【VS问题已解决】警告被视为错误 - 没有生成“object”文件
  8. 全球开发者各出奇招:我们想这样适配iPhone X
  9. 关于A6s上的无法动态修改maxLength的问题
  10. Lotus Notes 7.0找不到服务器路径