1. 引入
在当今的数据驱动世界中,优化问题无处不在,从工程设计到经济模型,再到机器学习算法的调参,优化都是实现效率最大化、成本最小化或性能最优化的关键工具。
这里有一个典型的数学优化问题,目标是在给定的约束条件下,找到一组变量值,使得某个目标函数达到最小值。具体来说,我们的目标是最小化表达式 x + y*x + 2z(x、y、z均为小数),同时受到以下两个关键约束条件的限制:
(1)x + 2y + 3z <= 4:这是一个线性不等式约束,它限定了x、y和z三者之和(以特定权重)的上界。
(2)x + y >= 1:这是另一个线性不等式约束,它确保了x和y的和至少为1,为问题的解空间设定了另一个边界。
接下来,我们将详细探讨如何构建这个优化问题的数学模型,选择适合的求解工具,并通过python编程实现来找到最优解。
2. 具体代码
直接看注释就能较好理解:
# 求解目标,最小化
# x + y*x + 2 z
# 约束条件
# x + 2 *y + 3 z <= 4
# x + y >= 1
# x, y, z 为小数
import gurobipy as gp
from gurobipy import GRB
try:
# 建立模型
m = gp.Model("model-name")
# 创建变量
x = m.addVar(vtype='C', name="x")# C表示小数
y = m.addVar(vtype='C', name="y")
z = m.addVar(vtype='C', name="z")
# 求解目标
m.setObjective(x + y*x + 2 * z, GRB.MAXIMIZE)
# 增加约束条件1:
m.addConstr(x + 2 * y + 3 * z <= 4, "c0")
# 增加约束条件2:
m.addConstr(x + y >= 1, "c1")
# 求解优化问题
m.optimize()
# 得到最终结果
for v in m.getVars():
print(f"{v.VarName} {v.X:g}")
print(f"Obj: {m.ObjVal:g}")
except gp.GurobiError as e:
print(f"Error code {e.errno}: {e}")
except AttributeError:
print("Encountered an attribute error")
最终运行程序,得到结果如下,求解速度很快:
Optimal solution found (tolerance 1.00e-04)
Best objective 4.500000000000e+00, best bound 4.500185117527e+00, gap 0.0041%
x 3
y 0.5
z 0
Obj: 4.5
3. 总结
用gurobipy求解带不等式约束条件的优化问题是很方便的,偶然发现,记录一下。