【Python】 gurobipy 学习笔记5——qiucksum函数

本节讲述quicksum函数的使用。

使用qiucksum可以进行简单的快速求和。

1.quicksum的基础使用(单一变量累加)


#qiucksum的基础使用(与sum功能相近)
m=Model()
xij=m.addVars(5,5,name="xij")
m.addConstrs(quicksum(xij[i,j] for j in range(5))<=5 for i in range(5))
m.update()
m.write("quicksum_practice1.lp")

输出约束:
 R0: xij[0,0] + xij[0,1] + xij[0,2] + xij[0,3] + xij[0,4] <= 5
 R1: xij[1,0] + xij[1,1] + xij[1,2] + xij[1,3] + xij[1,4] <= 5
 R2: xij[2,0] + xij[2,1] + xij[2,2] + xij[2,3] + xij[2,4] <= 5
 R3: xij[3,0] + xij[3,1] + xij[3,2] + xij[3,3] + xij[3,4] <= 5
 R4: xij[4,0] + xij[4,1] + xij[4,2] + xij[4,3] + xij[4,4] <= 5

在这里,sum函数也可以起到同样的效果:

m.addConstrs(sum(x[i,j] for j in range(5))<=5 for i in range(5))

2.用quicksum处理系数*变量的情况

from gurobipy import *
from numpy import *

#设置系数
ind=random.randint(2,10)
#创建模型
m=Model()
#创建变量
zij=m.addVars(4,vtype=GRB.BINARY,name="zij")
#目标函数
m.setObjective(ind*quicksum(zij[i] for i in range(4)),GRB.MINIMIZE)
m.update()

m.write("quicksum_practice3.lp")

输出结果:
Minimize
  8 zij[0] + 8 zij[1] + 8 zij[2] + 8 zij[3]
Subject To
Bounds
Binaries
 zij[0] zij[1] zij[2] zij[3]
End

3.用quicksum处理多个变量相乘的情况

下面给出一段完整的模型编写代码,可以从中看到quicksum的使用方法:


#创建模型
m=Model()
#创建变量
zij=m.addVars(4,3,vtype=GRB.BINARY,name="zij")
qij=m.addVars(4,3,vtype=GRB.BINARY,name="qij")
#创建约束
m.addConstrs((zij.sum(i,"*") <=2 for i in range(4)),name="c0")
m.addConstrs((qij.sum(i,"*")>=3 for i in range(4)),name="c1")
#创建目标,此处完成了通过quicksum实现变量相乘,并将其加入到目标函数中的目的
m.setObjective(quicksum(zij[i,j]*qij[i,j] for i in range(4) for j in range(3)),GRB.MAXIMIZE)
#更新与获取解
m.update()
m.write("quicksum_practice2.lp")
m.optimize()
outcome=m.getVars()
print(outcome)

公式结果:

\ LP format - for model browsing. Use MPS format to capture full model detail.
Maximize
 [ 2 zij[0,0] * qij[0,0] + 2 zij[0,1] * qij[0,1] + 2 zij[0,2] * qij[0,2]
   + 2 zij[1,0] * qij[1,0] + 2 zij[1,1] * qij[1,1] + 2 zij[1,2] * qij[1,2]
   + 2 zij[2,0] * qij[2,0] + 2 zij[2,1] * qij[2,1] + 2 zij[2,2] * qij[2,2]
   + 2 zij[3,0] * qij[3,0] + 2 zij[3,1] * qij[3,1] + 2 zij[3,2] * qij[3,2]
   ] / 2 
Subject To
 c0[0]: zij[0,0] + zij[0,1] + zij[0,2] <= 2
 c0[1]: zij[1,0] + zij[1,1] + zij[1,2] <= 2
 c0[2]: zij[2,0] + zij[2,1] + zij[2,2] <= 2
 c0[3]: zij[3,0] + zij[3,1] + zij[3,2] <= 2
 c1[0]: qij[0,0] + qij[0,1] + qij[0,2] >= 3
 c1[1]: qij[1,0] + qij[1,1] + qij[1,2] >= 3
 c1[2]: qij[2,0] + qij[2,1] + qij[2,2] >= 3
 c1[3]: qij[3,0] + qij[3,1] + qij[3,2] >= 3
Bounds
Binaries
 zij[0,0] zij[0,1] zij[0,2] zij[1,0] zij[1,1] zij[1,2] zij[2,0] zij[2,1]
 zij[2,2] zij[3,0] zij[3,1] zij[3,2] qij[0,0] qij[0,1] qij[0,2] qij[1,0]
 qij[1,1] qij[1,2] qij[2,0] qij[2,1] qij[2,2] qij[3,0] qij[3,1] qij[3,2]
End

以上,关于quicksum函数的讲解就结束了。

希望感兴趣的大家帮我盘一盘,sum、prod和quicksum函数在使用上的异同之处,等我想明白了也会分享分享的,但是目前我没什么实践经验,理解还比较浅显。

上期内容:

【Python】 gurobipy 学习笔记4——prod函数_胡琪琪爱编程的博客-CSDN博客

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年12月26日
下一篇 2023年12月26日

相关推荐