后续要补充callback,dual之类的高级内容哈哈哈哈,大部分整理的都是copy的,就是自己用滴 python也在进步中
from gurobipy import *
MODEL = gurobipy.Model("Model_name")
或者 model = Model('name_')
也可以这样。
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)
model.update()
单目标: 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)
表达式约束: model.addConstr(expression, name="")
范围约束:model .addRange(expression, min_value, max_value, name="")
指示变量约束,指示变量 binvar 的值取 binval 时, 进行约束 expression: MODEL.addGenConstrIndicator(binvar, binval, expression, name="")
表达式左右可以都是变量的形式
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)}")
输出:model.write('VRPTW1.lp')
求解:model.optimize()
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)
VarName.startswith(‘x’) 按变量名选