Python调用Gurobi基本操作

这篇具有很好参考价值的文章主要介绍了Python调用Gurobi基本操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

接上篇学会了如何用python调用gurobipy之后,这篇总结一些学到的基本操作。

tuplelist、tupledict、multidict、创建list、

1.tuplelist方法:

tuplelist是Python list的扩展对象,使用tuplelist()不能忘记from gurobipy import *,tuplelist增加了快速筛选select功能,比传统的if...else...筛选速度快。

from gurobipy import *
import time

T1 = time.time()
Cities=[("A","B"),("A","C"),("B","C"),("B","D"),("C","D")]
Routes=tuplelist(Cities)
print(Routes.select("A","*"))
T2 =time.time()

print('程序运行时间:%s毫秒' % ((T2 - T1)*1000))

tuplelist运行结果:

C:\Users\xzr\.conda\envs\py310gurobi\python.exe F:\PycharmProjects\workspace\untitled\jizulunban\caogao.py 
<gurobi.tuplelist (2 tuples, 2 values each):
 ( A , B )
 ( A , C )
>
程序运行时间:1.9958019256591797毫秒

进程已结束,退出代码0

for...else...方法:

from gurobipy import *
import time

T1 = time.time()
Cities=[("A","B"),("A","C"),("B","C"),("B","D"),("C","D")]
Result=[]
for i,j in Cities:
    if i=="A":
        Result.append((i,j))
print(Result)
T2 =time.time()

print('程序运行时间:%s毫秒' % ((T2 - T1)*1000))

for...else...运行结果:

C:\Users\xzr\.conda\envs\py310gurobi\python.exe F:\PycharmProjects\workspace\untitled\jizulunban\caogao.py 
[('A', 'B'), ('A', 'C')]
程序运行时间:0.0毫秒

进程已结束,退出代码0

尴尬了,竟然是for...else...的运行速度更快,原因是数据量太少了体现不出效果。

2.tupledict方法:

tupledict是Python Dictionary的扩展对象,键值是tuple(元组),可以使用select、sum、prob函数。用于变量和约束。后面有详细介绍。

3.multidict方法:

multidict()创建tuplelist和tupledict的便捷方法。代码示例:

from gurobipy import *
import time

# T1 = time.time()
cities,supply,demand = multidict({
    "A":[100,20],
    "B":[150,50],
    "C":[20,300],
    "D":[10,200]})
print(cities)
print(supply)
print(demand)
# T2 =time.time()

运行结果:

C:\Users\xzr\.conda\envs\py310gurobi\python.exe F:\PycharmProjects\workspace\untitled\jizulunban\caogao.py 
['A', 'B', 'C', 'D']
{'A': 100, 'B': 150, 'C': 20, 'D': 10}
{'A': 20, 'B': 50, 'C': 300, 'D': 200}

进程已结束,退出代码0

运行结果第一行是list,第二三行是dictionary。

4.创建list:

python有多种创建list的方法:

a=[]
a.append("A")
b=[i**2 for i in range(6)] #[0,1,4,9,16,25]
c=[(i,j)for j in range(4) for i in range(j)] #[(0,1),(0,2),(1,2),(0,3),(1,3),(2,3)]
d=[i for i in range(10) if i not in b]  #[2,3,5,6,7,8]
Pairs=[]
for j in range(4):
    for i in range(j):
        Pairs.append((i,j))

对于求和,Python的Generator(生成器):

SumSquares=sum(i**2 for i in range(6)) #55

Gurobi中采用quicksum,效率更高:

obj=quicksum(cost[i,j]*x[i,j] for i,j in arcs)

5.tupledict建模示例

tupledict(Gurobi变量一般都是tupledict类型)有sum函数

from gurobipy import *
import time

# T1 = time.time()
m=Model()
x=m.addVars(3,4,vtype=GRB.BINARY,name="x")
m.addConstrs((x.sum(i,"*")<=1 for i in range(3)),name="con")
m.update()
m.write("test.lp")
# T2 =time.time()

# print('程序运行时间:%s毫秒' % ((T2 - T1)*1000))

运行后,打开“test.lp”文件查看写入的模型

\ LP format - for model browsing. Use MPS format to capture full model detail.
Minimize
 
Subject To
 con[0]: x[0,0] + x[0,1] + x[0,2] + x[0,3] <= 1
 con[1]: x[1,0] + x[1,1] + x[1,2] + x[1,3] <= 1
 con[2]: x[2,0] + x[2,1] + x[2,2] + x[2,3] <= 1
Bounds
Binaries
 x[0,0] x[0,1] x[0,2] x[0,3] x[1,0] x[1,1] x[1,2] x[1,3] x[2,0] x[2,1]
 x[2,2] x[2,3]
End

太妙了太妙了

tupledict(Gurobi变量一般都是tupledict类型)还有prob函数,用于变量和系数相乘后累加

以下表达式等效

obj=quicksum(cost[i,j]*x[i,j] for i,j in arcs)
obj=x.prod(cost)

建模建议,尽量采用稀疏方式,采用tuplelists筛选和指定合适的下标组合关系,基于这些组合关系建立变量和数据字典,利用tuplelist.select()以及tupledict.select(),tupledict.sum(),tupledict.prob()来对下标进行组合处理。

Python调用Gurobi基本操作

Python调用Gurobi基本操作

Python调用Gurobi基本操作

Python调用Gurobi基本操作

Python调用Gurobi基本操作

 Python调用Gurobi基本操作

Python调用Gurobi基本操作

  Python调用Gurobi基本操作

 Python调用Gurobi基本操作

 Python调用Gurobi基本操作

 Python调用Gurobi基本操作

 Gurobi建模举例1

 ​​​​​​​Python调用Gurobi基本操作

from gurobipy import *

# T1 = time.time()

try:
    #Create a new model
    m=Model("mip1")

    #Create variables
    x=m.addVar(vtype=GRB.BINARY,name="x")
    y=m.addVar(vtype=GRB.BINARY,name="y")
    z=m.addVar(vtype=GRB.BINARY,name="z")

    #Set objective
    m.setObjective(x+y+2*z,GRB.MAXIMIZE)

    #Add constraint:x+2y+3z<=4
    m.addConstr(x+2*y+3*z<=4,"c0")

    #Add constraint:x+y>=1
    m.addConstr(x+y>=1,"c1")

    m.optimize()

    for v in m.getVars():      #getVars获取所有变量
        print("%s %g" % (v.varName,v.x)) #(v.varName,v.x)是(变量名字,优化结果)
    print("Obj: %g" % m.objVal)

except GurobiError as e:
    print("Error code" + str(e.errno)+":"+str(e))

except AttributeError:
    print("Encountered an attribute error")


# T2 =time.time()
# print('程序运行时间:%s毫秒' % ((T2 - T1)*1000))

 运行结果

C:\Users\xzr\.conda\envs\py310gurobi\python.exe F:\PycharmProjects\workspace\untitled\jizulunban\caogao.py 
Gurobi Optimizer version 10.0.0 build v10.0.0rc2 (win64)

CPU model: Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz, instruction set [SSE2|AVX|AVX2]
Thread count: 2 physical cores, 4 logical processors, using up to 4 threads

Optimize a model with 2 rows, 3 columns and 5 nonzeros
Model fingerprint: 0x98886187
Variable types: 0 continuous, 3 integer (3 binary)
Coefficient statistics:
  Matrix range     [1e+00, 3e+00]
  Objective range  [1e+00, 2e+00]
  Bounds range     [1e+00, 1e+00]
  RHS range        [1e+00, 4e+00]
Found heuristic solution: objective 2.0000000
Presolve removed 2 rows and 3 columns
Presolve time: 0.02s
Presolve: All rows and columns removed

Explored 0 nodes (0 simplex iterations) in 0.03 seconds (0.00 work units)
Thread count was 1 (of 4 available processors)

Solution count 2: 3 2 

Optimal solution found (tolerance 1.00e-04)
Best objective 3.000000000000e+00, best bound 3.000000000000e+00, gap 0.0000%
x 1
y 0
z 1
Obj: 3

进程已结束,退出代码0

Gurobi建模举例2

 Python调用Gurobi基本操作

 

from gurobipy import *

categories,minNutrition,maxNutrition=multidict({
    "calories":[1800,2200],
    "protein":[91,GRB.INFINITY],
    "fat":[0,65],
    "sodium":[0,1779]
})

foods,cost=multidict({
    "hamburger":2.49,
    "chicken":2.89,
    "hot dog":1.50,
    "fries":1.89,
    "macaroni":2.09,
    "pizza":1.99,
    "salad":2.49,
    "milk":0.89,
    "ice cream":1.59
})

#Nutrition values for the foods
nutritionValues={
    ("hamburger","calories"):410,
    ("hamburger","protein"):24,
    ("hamburger","fat"):26,
    ("hamburger","sodium"):730,
    ("chicken","calories"):420,
    ("chicken", "protein"):32,
    ("chicken", "fat"):10,
    ("chicken", "sodium"):1190,
    ("hot dog","calories"):560,
    ("hot dog", "protein"):20,
    ("hot dog", "fat"):32,
    ("hot dog", "sodium"):1800,
    ("fries","calories"):380,
    ("fries", "protein"):4,
    ("fries", "fat"):19,
    ("fries", "sodium"):720,
    ("macaroni", "calories"): 320,
    ("macaroni", "protein"): 12,
    ("macaroni", "fat"): 10,
    ("macaroni", "sodium"): 930,
    ("pizza", "calories"): 320,
    ("pizza", "protein"): 15,
    ("pizza", "fat"): 12,
    ("pizza", "sodium"): 820,
    ("salad", "calories"): 320,
    ("salad", "protein"): 31,
    ("salad", "fat"): 12,
    ("salad", "sodium"): 1230,
    ("milk", "calories"): 100,
    ("milk", "protein"): 8,
    ("milk", "fat"): 2.5,
    ("milk", "sodium"): 125,
    ("ice cream", "calories"): 330,
    ("ice cream", "protein"): 8,
    ("ice cream", "fat"): 10,
    ("ice cream", "sodium"): 180
}

#Model
m=Model("diet")

#Create decision variables for the foods to buy
buy=m.addVars(foods,name="buy")
#也可以是:
# buy=[]
# for f in foods:
#     buy[f]=m.addVar(name=f)

#目标函数是最小化cost
m.setObjective(buy.prod(cost),GRB.MINIMIZE)
#如果使用循环结构,应该是:
# m.setObjective(sum(buy[f]*cost[f] for f in foods),GRB.MINIMIZE)

#Nutrition constraints
m.addConstrs(
    (quicksum(nutritionValues[f,c]*buy[f] for f in foods)
     == [minNutrition[c],maxNutrition[c]]
     for c in categories),"_")
#如果使用循环结构,应该是:
# for c in categories:
#     m.addRange(
#         sum(nutritionValues[f,c] * buy[f] for f in foods),minNutrition[c],maxNutrition[c],c)
#     )

def printSolution():
    if m.status == GRB.Status.OPTIMAL:
        print("\nCost:%g" % m.objval)
        print("\nBuy:")
        buyx=m.getAttr("x",buy)
        for f in foods:
            if buy[f].x>0.0001:
                print("%s %g" % (f,buyx[f]))
    else:
        print("No solution")

#solve
m.optimize()
printSolution()


# T1 = time.time()




# T2 =time.time()
# print('程序运行时间:%s毫秒' % ((T2 - T1)*1000))

 运行结果

C:\Users\xzr\.conda\envs\py310gurobi\python.exe F:\PycharmProjects\workspace\untitled\jizulunban\caogao.py 
Gurobi Optimizer version 10.0.0 build v10.0.0rc2 (win64)

CPU model: Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz, instruction set [SSE2|AVX|AVX2]
Thread count: 2 physical cores, 4 logical processors, using up to 4 threads

Optimize a model with 4 rows, 12 columns and 39 nonzeros
Model fingerprint: 0xed649f3c
Coefficient statistics:
  Matrix range     [1e+00, 2e+03]
  Objective range  [9e-01, 3e+00]
  Bounds range     [7e+01, 2e+03]
  RHS range        [7e+01, 2e+03]
Presolve removed 0 rows and 2 columns
Presolve time: 0.01s
Presolved: 4 rows, 10 columns, 37 nonzeros

Iteration    Objective       Primal Inf.    Dual Inf.      Time
       0    0.0000000e+00   1.472500e+02   0.000000e+00      0s
       4    1.1828861e+01   0.000000e+00   0.000000e+00      0s

Solved in 4 iterations and 0.03 seconds (0.00 work units)
Optimal objective  1.182886111e+01

 Python调用Gurobi基本操作

 —————————————————————————————————————————

注意:

若出现众多warning,删去warning给的路径下的带“~”的文件

若出现ERROR: Could not find a version that satisfies the requirement time (from versions: none),是找不到适应现有python版本的包

Python调用Gurobi基本操作

Python调用Gurobi基本操作文章来源地址https://www.toymoban.com/news/detail-424277.html

到了这里,关于Python调用Gurobi基本操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python文件的基本操作

    文件的基本操作 文件的读写模式 文件的读写操作相关的方法 文件的操作模式 文件的练习题 文件的操作模式

    2024年02月10日
    浏览(39)
  • Opencv+Python图像基本操作

    目录 图像的读取、显示和保存 获取图像属性  图像截取  绘图功能 画线 画矩形 画圆圈 画椭圆          画多边形 向图像添加文本 cv2.imread() ,  cv2.imshow() ,  cv2.imwrite()分别表示读取图片,显示图片,写入图片   retval = cv2.imread(文件名 [,显示控制参数]) cv2.IMREAD_UNCHANGED:不改

    2024年02月04日
    浏览(54)
  • Python中对基本文件操作

    保存数据放在磁盘中 f=open(‘文件’,‘w’)或者f=open(‘文件’,‘r’) 3.1 写数据(write) 如果文件不存在那么创建,如果存在那么就先清空,然后写入数据 对象=open(“文件”,w) 对象.write(“写入数据”) 对象.close 3.2读数据(read) 以读的方式打开文件,读取数据 对象 = open(“文

    2024年02月12日
    浏览(45)
  • Python 进阶(七): Word 基本操作

    Word 是一个十分常用的文字处理工具,通常我们都是手动来操作它,本节我们来看一下如何通过 Python 来操作。 Python 提供了   python-docx   库,该库就是为 Word 文档量身定制的,安装使用   pip install python-docx   命令即可。 首先,我们使用 Python 来创建一个 Word 文档并向其中写

    2024年02月08日
    浏览(45)
  • Python中元组的基本操作

    元组(tuple)与列表类似,也是由一系列按特定顺序排列的元素组成,但与列表不同的是它是不可变序列。 定义元组时,可以创建一个空元组,也可以创建有值元组;如果元组中只有一个元素,元素后仍需要加英文逗号。另外元组中的元素可以是不同的数据类型。 输出以上

    2024年02月16日
    浏览(37)
  • Python四种基本结构的操作

    SampleList = [] SampleList = list() append(obj) :在列表末尾添加元素obj extend(seq) :在列表末尾添加多个值,使用extend()函数,seq是一个可迭代对象,否则报错。 Insert(index,obj) :将元素obj添加到列表的index位置处。 Sample = [1,2,3,4,5] Sample.append(1) #[1,2,3,4,5,6] s = [7,8] Sample.extend(s) #[1,2,3,4,5,

    2024年02月06日
    浏览(37)
  • 【Python】GDAL基本操作/遥感大图显示

    遥感图像往往尺寸较大,无法用默认的图像浏览器加载。 GDAL是空间数据处理的开源包,支持多种数据格式的读写。 遥感图像是一种带大地坐标的栅格数据,因此,可以借用GDAL对遥感图像进行读写,本文就来记录一些相关操作。 gdal可通过荧光动力学实验室(Laboratory for Fluor

    2024年02月02日
    浏览(43)
  • Python如何连接Mysql及基本操作

    1.什么要做python连接mysql,一般是解决什么问题的 做自动化测试时候,注册了一个新用户,产生了多余的数据,下次同一个账号就无法注册了,这种情况怎么办呢?自动化测试都有数据准备和数据清理的操作,如果因此用例产生了多余数据,就需要清理数据,可以用Pyhthon连接

    2023年04月26日
    浏览(37)
  • 【100天精通python】Day19:python文件及目录操作_基本文件操作

    目录 专栏导读  1 文件的创建打开和关闭 2.1 使用内置函数open(),close()创建打开和关闭

    2024年02月15日
    浏览(45)
  • python数字图像处理基础(二)——图像基本操作、滑动条、鼠标操作

    import cv2 import numpy as np import matplotlib.pyplot as plt 图像读取 cv2.MREAD_COLOR: 彩色图像 或用1 cv2.IMREAD_GRAYSCALE:灰度图像 或用0 img = cv2.imread(‘cat.jpg’, cv2.IMREAD_GRAYSCALE) 等同于: img = cv2.imread(‘cat.jpg’, 0) 图像的显示,也可以创建多个窗口 cv2.imshow(‘img’, img) 等待时间,毫秒级,0表示

    2024年01月18日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包