如何在 Python 上使用 PuLP GLPK 为混合整数线性规划 (MILP) 的决策变量编写 IF 条件?

2024-01-05

我正在尝试使用 PuLP 上的混合整数线性规划和 Python 上的 GLPK 求解器来解决优化问题。到目前为止,我已经成功解决了带有约束的基本优化问题,例如:

prob = LpProblem("MILP", LpMinimize)
x1 = LpVariable("x1",lowBound=0, cat = 'Binary')
x2 = LpVariable("x2", cat = 'Continuous')
prob += 4*x1 + x2, "Objective Function"
prob += x2 - 4*x1 <= 0
prob += x2 - 2*x1 >= 0
status = prob.solve()
LpStatus[status]
value(x1), value(x2), value(prob.objective)

这给出了最佳结果,其中 x1 = 1.0、x2 = 3.0 且目标函数 = 7.0

我想弄清楚的是如何用一个解决优化问题if例如,以下约束条件:

x1 > 0 IF x2 > 2

或类似的东西:

x1 > 0 IF x2 == 3

基本上,如何将 if 条件语句集成到 MILP 约束中。


您要查找的搜索词是“指示变量”或“big-M 约束”。

据我所知,PULP 不直接支持指示变量,因此大 M 约束是可行的方法。

一个简单的例子: x1 <= 0 IF x2 > 2

from pulp import *

prob = LpProblem("MILP", LpMaximize)
x1 = LpVariable("x1", lowBound=0, upBound=10, cat = 'Continuous')
x2 = LpVariable("x2", lowBound=0, upBound=10, cat = 'Continuous')

prob += 0.5*x1 + x2, "Objective Function"

b1 = LpVariable("b1", cat='Binary')

M1 = 1e6
prob += b1 >= (x1 - 2)/M1

M2 = 1e3
prob += x2 <= M2*(1 - b1)

status = prob.solve()
print(LpStatus[status])
print(x1.varValue, x2.varValue, b1.varValue, pulp.value(prob.objective))

我们想要一个约束x1 <= 0存在时x2 > 2. When x2 <= 2不存在这样的约束(x1可以是正数也可以是负数)。

首先我们创建一个二进制变量:

b1 = LpVariable("b1", cat='Binary')

选择这个来代表条件x2 > 2。实现此目的的最简单方法是添加约束:

M1 = 1e6
prob += b1 >= (x2 - 2)/M1

Here M1是大M值。需要选择这样的值,以便获得最大可能的值x2表达方式(x2-2)/M is <=1。它应该尽可能小,以避免数值/缩放问题。这里可以使用值 10 (x2上限为 10)。

要了解此约束的工作原理,请考虑以下情况,对于 x2x2>2右手边会强制b1大于 0 - 作为二进制变量,它将被强制为 1。

最后,我们需要构建所需的约束:

M2 = 1e3
prob += x1 <= M2*(b1 - 1)

再次为了理解这个约束是如何工作的,请考虑以下情况,如果 b1 为真(1) 约束处于活动状态并变为:x1 <= 0。如果 b1 为假('0'),则约束变为x1 <= M2, 假如M2足够大,这不会有任何影响(这里它可以小到 10x1上限已经为 10。

在上面的完整代码中,如果您改变系数x1在目标函数中你应该注意到b1被激活/去激活并且附加约束应用于x1正如预期的那样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Python 上使用 PuLP GLPK 为混合整数线性规划 (MILP) 的决策变量编写 IF 条件? 的相关文章

随机推荐

  • 如何通过引用获取对象的大小?

    假设我有一堂课 class Foo 我还有另一个功能 void getf Foo f std cout lt
  • Facebook 点赞按钮 - 隐藏计数?

    In the 设置对话框 http developers facebook com docs reference plugins like对于 Like Button 布局只有两种选择 替代方案1 https web archive org
  • redux框架wordpress调用变量

    我已经通过 wordpress 安装了 redux 插件 非常棒 我一直在使用demo内容来熟悉框架 但我不知道如何调用模板中的数据 我已经使用选项树很长时间了 并发现了这一点 这是我认为正确的呼唤 但我想不是 这是我认为可以上传徽标的代码
  • 策略模式的功能类比是什么?

    免责声明 我不使用函数式语言 只是试图理解 FP 的某些部分 Google 建议使用 lambda 的一阶函数可以提供与策略模式提供的类似功能的文章 然而我们需要以某种方式匹配数据和相应的 lambda 通过 OO 设计 这是自动完成的虚拟
  • Chef服务器密码重置

    我在我的 Linux 机器上安装并运行了我自己的 Chef 服务器 当我访问厨师服务器用户界面时 它询问我用户名和密码 不幸的是我忘记了密码 我知道我的用户名是admin 我怎样才能恢复我的密码 用户界面中也没有忘记密码选项 我更改了默认密
  • 仅针对此过程登录 Windows 网络共享 (SMB)

    在整个用户会话中 例如 登录 Windows 网络共享 SMB 很容易 net use WNetAddConnection2 etc 有没有类似的方法只会影响我当前的流程 也许是某种令牌系统 如果确实没有其他选择 整个会话身份验证是可以的
  • 如何使用 Facebook(或其他 ID)登录我的 ASP.NET 应用程序?

    像 SO 这样的网站如何允许您通过 Facebook OpenID Google Blogger Twitter 等验证自己的身份 我正在编写一个 ASP NET C 站点 除了提供任何其他站点具有的常规普通用户名 密码之外 我希望能够接受
  • 如何禁用“ActiveX 控件可能不安全”弹出窗口

    在 我的电脑 上的 HTML 文件中 我尝试在脚本中使用 Scripting FileSystemObject 如何禁用弹出窗口 此页面上的任何 ActiveX 控件对于脚本编写可能不安全 Internet 选项 安全窗格允许将 初始化并编
  • 是否可以缩短自定义视图名称?

    假设我创建了一个名为的自定义视图MyView并想在 xml 中使用它 视图位于com example包裹 我需要做这样的事情
  • 用逗号分割以及如何从分割中的引号中排除逗号

    蟒蛇2 7代码 cStr aaaa bbbb ccc ddd newStr cStr split print newStr gt aaaa bbbb ccc ddd 但是 我想要这个结果 result aaa bbb ccc ddd 解决方
  • Angular 9 生产构建错误 - 需要伪类或伪元素

    Angular 9 项目 ng 服务工作正常 但是当我进行生产构建时出现以下错误 块 runtime 5d6d7c5bcca533f7263c js 运行时 1 46 kB 条目 渲染 块 1 main d2b72f349c71c888a6
  • Hsqldb 存储过程

    我正在尝试在内存 Hsqldb 数据库中设置一个存储过程以进行测试 我正在使用的存储过程是在 MySql 中开发的 因此我想使用 HSqlDb 设置它以适应我的测试套件 我正在尝试创建该过程的简化版本 但目前还没有任何乐趣 程序是 CREA
  • Tensorflow Metal 插件已注册错误

    我已经使用安装了 Tensorflow 和 Metal 插件pip在 Mac Mini 2020 M1 上 pip3 install tensorflow macos tensorflow metal pip3 uninstall nump
  • 如何限制 while 循环中的项目

    这是我的项目中的 while 循环 div class index a href img width 200 height 171 alt src a div
  • jQuery 多次点击事件

    我被迫使用从外部服务器加载的脚本 该脚本基本上添加了一个元素 div class myClass 并绑定一个click的方法 事情是 在click与元素关联的函数 它们有一个return false声明在最后 我也有自己的脚本 我正在尝试添
  • 如何在 OSX 上卸载 pip?

    我运行了以下命令 easy install pip sudo pip install setuptools no use wheel upgrade 如何反转这两个命令以使我的 python 在 OSX 中恢复到其原始状态 删除 pip 作
  • R Shiny:数据表行的鼠标悬停文本

    有没有办法在将鼠标悬停在数据表显示中的行 记录 上时显示鼠标悬停文本 在 StackOverflow 上解决了一些类似的问题后 我发现了 2 个示例代码 一个显示列单元格的悬停文本 另一个在鼠标悬停时突出显示整行 显示列单元格悬停文本的示例
  • 示例 XSD 失败并显示“错误:未找到元素 X 的声明”

    尽管我是 xml 解析领域的新手 但我能够xsd创建有效的c 并成功编译和链接 但编译器优化 了实例化 所以 从第一步开始 我尝试你好世界CodeSynthesis 中的 xml 示例 http www codesynthesis com
  • 如何查看有关 Firebase JavaScript 客户端正在执行的操作的更多详细信息?

    我想更深入地了解 Firebase JavaScript 客户端库正在做什么 我正在使用 Firebase 开发一个 JavaScript 应用程序 该应用程序必须处理很多复杂性 例如 它必须处理网络中断和间歇性高延迟期 客户端库正在处理这
  • 如何在 Python 上使用 PuLP GLPK 为混合整数线性规划 (MILP) 的决策变量编写 IF 条件?

    我正在尝试使用 PuLP 上的混合整数线性规划和 Python 上的 GLPK 求解器来解决优化问题 到目前为止 我已经成功解决了带有约束的基本优化问题 例如 prob LpProblem MILP LpMinimize x1 LpVari