用gurobipy求解带不等式约束条件的优化问题

42 篇文章 0 订阅
1 篇文章 0 订阅

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求解带不等式约束条件的优化问题是很方便的,偶然发现,记录一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值