Gurobi是一种优化软件,用于解决各种数学规划和整数规划问题。它提供了高性能的数学规划求解器,可用于最大化或最小化目标函数的线性规划、混合整数规划、二次规划、约束规划等问题。
注:1~4步骤对应的相关函数见流程图;下面示例也会有所体现
import gurobipy as gb
# 创建一个新的模型 调用内置函数Model()创建模型
model = gb.Model()
① 定义变量;定义问题中所有的变量,指定限制如上下界等,变量过多常用循环限制;
# 创建变量
x = {}
# 下标1~3;双循环将下标都表示出来
for i in range(1, 4):
for j in range(1, 4):
# 这一行代码的作用是,向数学优化模型中添加一个名为"xij"的新的二元变量x[i,j],其取值范围为[0,1]。
x[i, j] = model.addVar(lb=0, ub=1, name=f'x{i}{j}')
解释:model.addVar() 是一个用于向优化模型中添加变量的方法;并且可以指定这些变量的:名称、类型、上下界等特性;上述代码中传入了三个参数;lb=0代表变量下界为0,ub=1代表变量上界为1,name=f’x{i}{j}'代表变量的名称为x的索引i和j的字符串组合。
为了更好的理解上述代码,复习python字典(键值对)
x = {} # 创建了一个字典
x['key1'] = 'value1' # [ ] 的形式出来了
x['key2'] = 'value2'
print(x) # 输出: {'key1': 'value1', 'key2': 'value2'}
但是我们想要x[i][j]的形式;这样我们就需要用到嵌套字典的知识,如下
x = {'a': {'kk': 1, 'why': 2}, 'b': {'hq': 3, 'qwe': 4}}
这样;我们可以使用 x[‘a’][‘kk’] 来访问 x 中第一个字典(即键为 ‘a’ 的字典)中键为 ‘kk’ 的值。这将返回值 1; x[i][j] 这样的语法,则假定 x 是一个嵌套字典,并且 i 和 j 是其键。因此,x[i][j] 表示获取嵌套字典 x 中键为 i 的值,然后再获取该值所对应的嵌套字典中键为 j 的值。
我们题解就是用到了嵌套字典的形式;上面项目就是生成一个个变量参数x[i][j]
② 定义目标函数;此处为最小化某种目标
# 设置目标函数
model.setObjective(sum(x[i, j] for i in range(1, 4) for j in range(1, 4)), gb.GRB.MINIMIZE)
解释:使用 gurobi 提供的 GRB.MINIMIZE 模式(固定写法),表示我们要最小化目标函数。该目标函数是由两个嵌套的 for 循环所定义的,循环变量 i 和 j 分别遍历范围为 [1, 4) 的整数集合,因此这个目标函数的形式可以理解为
minimize: x[1, 1] + x[1, 2] + x[1, 3] + x[2, 1] + x[2, 2] + x[2, 3] + x[3, 1] + x[3, 2] + x[3, 3]
其中 x[i, j] 表示模型中的决策变量,它们的值可以是任意实数,并且在其他约束条件下可能会被限制。通过最小化这个目标函数,我们希望找到一组值使得所有决策变量的总和尽可能地小。
③ 定义约束条件;将s.t.中的约束条件表示出来即可;
for i in range(1, 4):
model.addConstr(sum(x[i, j] for j in range(1, 4)) == 1, name=f'c{i}')
for j in range(1, 4):
model.addConstr(sum(x[i, j] for i in range(1, 4)) == 1, name=f'c{j+3}')
解释: model.addConstr() 用于添加约束条件;① sum(x[i, j] for j in range(1, 4)) == 1;表示在所有列(j)上,第 i 行上的决策变量 x[i, j] 的总和必须等于 1。也就是说,每一行上只能选择一个 x[i, j] 变量为 1,其他都必须为 0;
其中还有一个约束条件:在① 定义变量的时候已经解决了【范围】;
④ 执行优化函数;固定写法
# 执行优化函数
model.optimize()
⑤ 检查求解状态并获取结果;最后获取相应的结果即可
# 检查求解状态
if model.status == gb.GRB.OPTIMAL:
# 打印最优解
print('最优解是:')
for i in range(1, 4):
for j in range(1, 4):
print(f'x{i}{j}: {x[i, j].x}')
print('目标函数值:', model.objVal)
else:
print('未找到最优解。')
# 基础步骤
import gurobipy as gb
model = gb.Model()
# 流程步骤
# ① 定义变量
x = {}
for i in range(1, 4):
for j in range(1, 4):
x[i, j] = model.addVar(lb=0, ub=1, name=f'x{i}{j}')
# ② 定义目标函数
model.setObjective(sum(x[i, j] for i in range(1, 4) for j in range(1, 4)), gb.GRB.MINIMIZE)
# ③ 定义约束条件
for i in range(1, 4):
model.addConstr(sum(x[i, j] for j in range(1, 4)) == 1, name=f'c{i}')
for j in range(1, 4):
model.addConstr(sum(x[i, j] for i in range(1, 4)) == 1, name=f'c{j+3}')
# ④ 执行优化函数
model.optimize()
# ⑤ 检查求解状态并获取结果
if model.status == gb.GRB.OPTIMAL:
# 打印最优解
print('最优解是:')
for i in range(1, 4):
for j in range(1, 4):
print(f'x{i}{j}: {x[i, j].x}')
print('目标函数值是:', model.objVal)
else:
print('未找到最优解。')
这篇Gurobi教程写的不错