一起学习gurobi

和小公主一起学gurobi

    • 1. 创建模型
    • 2 .创建变量
    • 3.更新变量空间
    • 4. 目标函数
    • 5. 添加约束
    • 6. 最优值,最优解查看
    • 7. 求解优化问题
    • 8.运算
    • 9.其他

后续要补充callback,dual之类的高级内容哈哈哈哈,大部分整理的都是copy的,就是自己用滴 python也在进步中
from gurobipy import *

1. 创建模型

MODEL = gurobipy.Model("Model_name")
或者 model = Model('name_')也可以这样。

2 .创建变量

x = MODEL.addVar(lb=0.0, ub=gurobipy.GRB.INFINITY, vtype=gurobipy.GRB.CONTINUOUS, name=""),其中lb=0.0,变量的下界,默认为0;ub=GRB.INFINITY,变量的上界,默认为无穷;vtype,变量的类型,默认为连续型,可改为 GRB.BINARY 0-1变量,GRB.INTEGER 整型;name=”“,变量名,默认为空。
多个变量时,可以循环这样设置

x={}
 name = 'x_' + str(i) + '_' + str(j) + '_' + str(k)
 x[i, j, k] = model.addVar(0  , 1 ,vtype=GRB.BINARY  , name=name)

3.更新变量空间

model.update()

4. 目标函数

单目标: MODEL.setObjective(expression, sense=None) sense可用选择:GRB.MINIMIZE/GRB.MAXIMIZE
多目标:MODEL.setObjectiveN(expression, index, priority=0, weight=1.0, abstol=0, reltol=0, name="")
expression: 表达式,可以是一次或二次函数类型
index: 目标函数对应的序号 (默认 0,1,2,…), 以 index=0 作为目标函数的值, 其余值需要另外设置参数
priority: 分层序列法多目标决策优先级(整数值), 值越大优先级越高
weight: 线性加权多目标决策权重(在优先级相同时发挥作用)
abstol: 分层序列法多目标决策时允许的目标函数值最大的降低量
reltol: 分层序列法多目标决策时允许的目标函数值最大的降低比率 reltol*|目标函数值|

# 1. 合成型 ######################################################
# Obj1 = x + y      weight = 1
# Obj2 = x - 5 * y    weight = -2
# MODEL.setObjectiveN(x + y, index=0, weight=1, name='obj1')
# MODEL.setObjectiveN(x -5 * y, index=1, weight=-2, name='obj2')
# 即转化为: (x + y) - 2 * (x - 5 * y) = - x + 11 * y# 2. 分层优化型(目标约束时使用) #####################################
# Obj1 = x + y      priority = 5
# Obj2 = x - 5 * y    priority = 1
# MODEL.setObjectiveN(x + y, index=0, priority=5, name='obj1')
# MODEL.setObjectiveN(x -5 * y, index=1, priority=1, name='obj2')
# 即转化为: 先优化 Obj1,再优化 Obj2(按照 priority 的大小关系)# 3. 混合优化型 ##################################################
# MODEL.setObjectiveN(x + y, index=0, weight=1, priority=5, name='obj1')
# MODEL.setObjectiveN(x -5 * y, index=1, weight=-2, priority=1, name='obj2')
# 则 先优化 Obj1 再优化 Obj2 最后相加作为目标值, 由于优先级不同, weight不会起作用# 4. 执行最优化结束后,获取目标函数值  ###############################
# MODEL.setParam(gurobipy.GRB.Param.ObjNumber, i) # 第 i 个目标
# print(MODEL.ObjNVal)  # 打印第 i 个值

分段目标, 使用折线段逼近

MODEL.setPWLObj(var, x, y)

var 指定变量的目标函数是分段线性
x 定义分段线性目标函数的点的横坐标值(非减序列)
y 定义分段线性目标函数的点的纵坐标值

MODEL.setPWLObj(x, [0, 2, 5], [0, 2, 3])
MODEL.setAttr(gurobipy.GRB.Attr.ModelSense, -1)

一起学习gurobi_第1张图片
一起学习gurobi_第2张图片

5. 添加约束

表达式约束: model.addConstr(expression, name="")
范围约束:model .addRange(expression, min_value, max_value, name="")
指示变量约束,指示变量 binvar 的值取 binval 时, 进行约束 expression: MODEL.addGenConstrIndicator(binvar, binval, expression, name="")
表达式左右可以都是变量的形式
一起学习gurobi_第3张图片

6. 最优值,最优解查看

model.ObjVal

多目标:

`# 查看多目标规划模型的目标函数值
for i in range(MODEL.NumObj):
MODEL.setParam(gurobipy.GRB.Param.ObjNumber, i)
  print(f"Obj {i+1} = {MODEL.ObjNVal}")` 
 # 查看变量取值
for var in MODEL.getVars():
   print(f"{var.varName}: {round(var.X, 3)}")

7. 求解优化问题

输出:model.write('VRPTW1.lp')
求解:model.optimize()

8.运算

lhs = LinExpr(0) 初始化一个式子,
lhs.addTerms(1, x[0, j, k]) 加入项,其中为常数乘变量
lhs.clear() 清空

quicksum:obj = quicksum(cost[i,j]*x[i,j] for i,j in arcs)
# 等价于 x.prod(cost)

9.其他

VarName.startswith(‘x’) 按变量名选

你可能感兴趣的:(python)