如何在 Julia 中使用 JuMP 提取优化问题矩阵 A,b,c

2023-11-29

我使用符号变量和约束在 Julia-JuMP 中创建了一个优化模型,例如以下

using JuMP
using CPLEX

# model
Mod = Model(CPLEX.Optimizer) 

# sets
I = 1:2;

# Variables
x = @variable( Mod , [I] , base_name = "x" ) 
y = @variable( Mod , [I] , base_name = "y" )  

# constraints
Con1 = @constraint( Mod , [i in I] , 2 * x[i] + 3 * y[i] <= 100 )

# objective
ObjFun = @objective( Mod , Max , sum( x[i] + 2 * y[i] for i in I) ) ;

# solve 
optimize!(Mod)

我猜想 JuMP 在传递给求解器 CPLEX 之前以将 c'*x subj to Ax

A
2×4 Array{Int64,2}:
 2  0  3  0
 0  2  0  3

b
2-element Array{Int64,1}:
 100
 100

c
4-element Array{Int64,1}:
 1
 1
 2
 2

在 MATLAB 中,函数 prob2struct 可以做到这一点https://www.mathworks.com/help/optim/ug/optim.problemdef.optimizationproblem.prob2struct.html

有没有JuMP函数可以做到这一点?


据我所知,这并不容易实现。

问题存储在底层MathOptInterface(MOI)特定数据结构。例如,约束总是存储为MOI.AbstractFunction - in - MOI.AbstractSet。对于MOI.ObjectiveFunction。 (参见 MOI 文档:https://jump.dev/MathOptInterface.jl/dev/apimanual/#Functions-1)

但是,您可以尝试以矩阵向量形式重新计算目标函数项和约束。

例如,假设您仍然拥有JuMP.Model Mod,您可以检查目标函数通过输入更接近:

using MathOptInterface
const MOI = MathOptInterface

# this only works if you have a linear objective function (the model has a ScalarAffineFunction as its objective)
obj = MOI.get(Mod, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}())

# take a look at the terms 
obj.terms
# from this you could extract your vector c
c = zeros(4)
for term in obj.terms
    c[term.variable_index.value] = term.coefficient
end
@show(c)

这确实给出了:c = [1.;1.;2.;2.].

您可以对底层 MOI 执行类似的操作。限制条件.

# list all the constraints present in the model
cons = MOI.get(Mod, MOI.ListOfConstraints())
@show(cons)

在这种情况下,我们只有一种类型的约束,即(MOI.ScalarAffineFunction{Float64} in MOI.LessThan{Float64})

# get the constraint indices for this combination of F(unction) in S(et)
F = cons[1][1]
S = cons[1][2]
ci = MOI.get(Mod, MOI.ListOfConstraintIndices{F,S}())

你得到两个约束索引(存储在数组中ci),因为这个组合 F - in - S 有两个约束。 让我们仔细研究一下其中的第一个:

ci1 = ci[1]
# to get the function and set corresponding to this constraint (index):
moi_backend = backend(Mod)
f = MOI.get(moi_backend, MOI.ConstraintFunction(), ci1)

f又是类型MOI.ScalarAffineFunction对应一行a1在你的A = [a1; ...; am]矩阵。该行由下式给出:

a1 = zeros(4)
for term in f.terms
    a1[term.variable_index.value] = term.coefficient
end
@show(a1) # gives [2.0 0 3.0 0] (the first row of your A matrix)

获取对应的第一个条目b1你的b = [b1; ...; bm]向量,你必须查看相同约束索引的约束集ci1:

s = MOI.get(moi_backend, MOI.ConstraintSet(), ci1)
@show(s) # MathOptInterface.LessThan{Float64}(100.0)
b1 = s.upper

我希望这能让您对数据如何存储有一些直观的了解MathOptInterface format.

您必须对所有约束和所有约束类型执行此操作,并将它们作为约束矩阵中的行堆叠A和矢量b.

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

如何在 Julia 中使用 JuMP 提取优化问题矩阵 A,b,c 的相关文章

  • 将 R 中的向量按特定顺序转换为下三角矩阵

    我有一个向量 其中元素的顺序很重要 比如说 x lt c 1 2 3 4 我想将我的向量排列成具有特定顺序的下三角矩阵 其中每行包含向量的前一个元素 我的目标是获得以下矩阵 lower diag matrix 1 2 3 4 1 4 0 0
  • 指向二维数组的指针和手动内存管理 - C

    我认为用纯 C 语言构建一个库来处理各种矩阵计算将是一个很好的挑战 现在 尽管我在 Objective C 和 Cocoa 方面有一些很好的经验 但我对 C 的了解正是我所需要的与 Objective C 一起工作 仅此而已 例如 我熟悉
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • C++ 求矩阵最小和最大元素之间的元素和

    因此 我的程序按其应有的方式工作 但前提是最小和最大元素位于对角 所以我的问题是如何将二维数组从一个特定元素迭代到另一个元素 也许摆脱一些嵌套循环 我应该将这个数组转换为一维吗 这是代码的正确工作方式 就在这时 出现了问题 元素 0 1 和
  • CSS3 矩阵 3d 矩形到梯形的转换

    我正在尝试使用 webkit 对 CSS3 的支持transform matrix3d
  • 当 Jupyter 单元包含函数、循环或其他块时,是否可以将其拆分为多个单元?

    Jupyter 的一项功能是能够一次执行一个单元 如果一个单元格有很多语句 通常可以 希望 将其拆分为更小的单语句单元格 除非涉及块 例如 if for def 等 这个问题之前以不同的方式提出过 在Jupyter中逐步执行算法 https
  • Scipy 最小化 fmin - 语法问题

    我有一个函数 它接受多个参数 一个数组和两个浮点数 并返回一个标量 浮点数 现在我想通过改变两个参数来最小化这个函数 两个浮点数 该数组在函数内部 解包 然后使用其内容 数组和浮点数 如何使用 SciPy 的 fmin 函数来完成此操作 我
  • 为什么 Julia 中的“where”语法对换行符敏感?

    在 Stack Overflow 上的另一个问题中 答案包括以下函数 julia gt function nzcols b SubArray T 2 P Tuple UnitRange Int64 UnitRange Int64 where
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 使用 SqlBulkCopy 和 F# 在 SQL 中导出矩阵

    我想将大量数据从 F 传输到 SQL 表 基本上我的 F 代码创建了一个三列矩阵 UserID ProductID and price 和N行 我想将其 复制 粘贴 到数据库中 我尝试了多种选择 但最终 从 F 传输数据非常慢 10000
  • 澄清创建临时表的连接顺序

    我在 mysql 中有一个大型查询 涉及将多个表连接在一起 它太慢了 所以我做了 解释 发现它正在创建一个临时表 我怀疑它占用了大部分执行时间 我找到了一些相关资料 mysql 文档 http dev mysql com doc refma
  • 获取参数类型的参数

    假设我定义了一个这样的类型 type Point Tx Ty end 然后我创建一个这种类型的变量 例如 a Point Int64 something 现在 我只知道我可以获得以下类型a by typeof a 那是 Point Int6
  • 并行模拟写入同一文件

    我的目标是在集群上并行运行 10 000 个左右的 Julia 编码模拟 每个模拟独立于所有其他模拟 每个模拟都有一个要输出的数字 以及有关哪个模拟产生该数字的 3 列信息 因此 强制每个模拟打印在单独的文件上对我来说听起来有点愚蠢 我可以
  • 再现频率矩阵图

    我想在 R 中重新创建一个情节 情节如下 来源 Boring E G 1941 作为动态平衡的统计频率 心理学评论 48 4 279 这略高于我的工资等级 能力 因此在这里询问 无聊的状态 第一次 A 只能出现 从不 0 或 总是 1 在
  • 在Matlab中对字符进行分组并形成矩阵

    我有 26 个字符 A 到 Z 我将 4 个字符组合在一起 并用空格分隔以下 4 个字符 如下所示 abcd efgh ijkl mnop qrst uvwx yz 我的Matlab编码如下 str abcdefghijklmnopqrst
  • 获取所有矩阵列逐元素乘积对的快速方法

    假设我有一个数字matrix set seed 1 mat lt matrix rnorm 1000 ncol 100 我想生成所有向量 它们是中所有唯一向量对的逐元素乘积的结果mat 我们如何改进下面的代码 all pairs lt t
  • 确定向量中是否存在元素的最有效方法

    我有几种算法取决于确定元素是否存在于向量中的效率 在我看来 这 in 这相当于is element 应该是最有效的 因为它只返回一个布尔值 在测试了几种方法之后 令我惊讶的是 这些方法是迄今为止效率最低的 以下是我的分析 随着向量大小的增加
  • 优化 CSS 交付 - Google 的建议

    谷歌建议在 head 中使用非常重要的 CSS 内联 并在内部使用其他 CSS
  • 沿轴 0 重复 scipy csr 稀疏矩阵

    我想重复 scipy csr 稀疏矩阵的行 但是当我尝试调用 numpy 的重复方法时 它只是将稀疏矩阵视为对象 并且只会将其作为 ndarray 中的对象重复 我浏览了文档 但找不到任何实用程序来重复 scipy csr 稀疏矩阵的行 我
  • 如何从连接矩阵绘制图像?

    我想编写一个脚本来从连接矩阵创建图像 基本上 只要矩阵中有 1 我就希望该区域在图像中被着色 对于例如 我使用 Photoshop 创建了这张图像 但我有一个很大的数据集 所以我必须自动化这个过程 如果有人能指出我正确的方向 那将非常有帮助

随机推荐

  • 当 html 表单允许文件上传时,Django 停止并显示“生成器引发 StopIteration”

    我的设置是 Windows 10 Python 3 7 Apache 2 4 mod wsgi 当我添加这个时enctype multipart form data 在我的表单中 仅通过添加此属性 仅 没有文件附加到表单 提交时出现此错误
  • nginx。被 CORS 政策阻止

    当前 nginx 配置 server listen hidden 80 server name dev hidden com root var www back hidden api location add header Access C
  • csv 读取引发“UnicodeDecodeError:'charmap'编解码器无法解码...”

    我已经阅读了我能找到的所有帖子 但我的情况似乎很独特 我对 Python 完全陌生 所以这可能是基础的 我收到以下错误 UnicodeDecodeError charmap 编解码器无法解码位置 70 中的字节 0x8d 字符映射到未定义
  • 如何将日期选择器包装在新的 div 中?

    我需要将我的日期选择器放在一个新的 div 中 这将是一个 shadow border div 我尝试过以下方法 beforeShow function input input datepicker widget find ui datep
  • 最大字符串数组 VisualBasic WSH

    我正在 VB 中编写一个 WSH 脚本 以读取通过 Run 方法使用重定向目录列表生成的大量目录列表 目录列表大约有 8400 行 但是每次我运行脚本时 都会出现以下循环 执行直到 DirList AtEndOfStream Redim 保
  • 我可以手动注册/安装 Search.Collat​​orDSO.1

    我目前正在尝试使用 windows search 服务搜索一些索引文件 我的问题是 Windows 搜索无法安装在网络服务器上 因为它是 网络版本 收到的错误消息是 Search Collat orDSO 1 提供程序未在本地计算机上注册
  • Windows 忽略 JAVA_HOME:如何将 JDK 设置为默认值?

    如何说服 Windows 使用 JDK 而不是 JRE 这个问题之前已经在这里和其他地方被问过 如何设置默认 Java 安装 运行时 Windows 问题是 Windows 忽略了JAVA HOME它还忽略了我将 JDK bin 目录作为路
  • 如何检测Android是否完全支持USB?

    我的应用程序使用UsbManager与 USB 摄像头通信 有些设备不支持 USB 这些将返回null for UsbManager context getSystemService Context USB SERVICE 或者他们会抛出一
  • 放大 Plotly 热图

    目前 Plotly JS 热图中有 2 种 缩放 行为 在这里 您可以采用任何矩形形状进行缩放 单击 拖放 但是像素不是正方形的 这对于某些应用程序来说是不行的 不保留长宽比 有时应该保留 const z Array from length
  • 为什么在隐含时使用媒体查询类型“all”?

    我最近注意到我一直在使用all在每一个 media查询规则 我不明白为什么我这样做 我在网上搜索过 我发现大多数 media网络上的规则示例使用如下格式 media all and some other condition 为什么有媒体类型
  • 在 Firebase 中随机配对用户[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我正在使用 Flutter 和 Firebase 开发一个应用程序 我必须解决一个听起来像这样的问题 每个用户 在任何时候 都可以将自己置于等候名单 Firebase 必须通过以下方式
  • 使用正则表达式在 Visual Studio Code 中设置代码片段

    Comment prefix body 我已经设置了about代码片段 目的是添加注释 添加文件的基目录和文件名像这样但丢弃路径的其余部分 我相信这最初是基于 TextMate 片段 我已经尝试了一切 但我无法让它工作 这可能是愚蠢的事情
  • 在两个固定 div 元素之间创建滚动 div

    我对在网站中如何定位 div 不太熟悉 所以我希望有人可以在这里提供帮助 我想要得到的是一个三明治类型的设置 在两个 div 中间有一个滚动内容 这样我就有一个页眉 div 和一个页脚 div 它们都必须在页面上保持静态 然后 在它们之间
  • 一个组件可以有多个模板吗?

    有没有办法让 Angular 2 组件根据我想要放置的位置使用许多模板文件 例如 我有一个login组件 我想用两种不同的设计将其放置在我的网站上两次 有没有一种方法可以将模板传递给组件 不确定 NG2 是否有内置方法来支持这一点 我只是使
  • 在 C# 中检测(通过反射)Enum 类型是否为“Flags”类型的策略

    我使用反射来读取程序集中的类型 以生成代码 我可以看到一些枚举应该标有 Flags 属性 但编写这些枚举的人忘记添加此属性 有没有可靠的方法来检测枚举何时可以被视为 标志 枚举 我目前的策略是按降序读取枚举 并检查 element last
  • 如何生成 R 计数矩阵

    在 R 中 我可以使用我感兴趣的特定列名称作为数组返回计数结果 如下所示 require plyr bevs lt data frame cbind name c Bill Llib drink c coffee tea cocoa wat
  • 从 Java 游戏中删除对象(Eclipse)

    让我们开始吧 我有一个 处理程序 类 它充满了 getter 和 setter 并且其中包含添加和删除对象的代码 它看起来像这样 public void addObject GameObject object this object add
  • 尝试创建下拉菜单 pygame,但卡住了

    到目前为止 这是我的代码 import pygame as pg pg init clock pg time Clock Generating screen w scr 640 h scr 480 size scr w scr h scr
  • 在 Firefox 中禁用跨域 Web 安全

    在 Firefox 中 我该如何做相当于 disable web security在 Chrome 中 这个问题已经被发布了很多次 但从来没有一个真正的答案 大多数是附加组件的链接 其中一些在最新的 Firefox 中不起作用或根本不起作用
  • 如何在 Julia 中使用 JuMP 提取优化问题矩阵 A,b,c

    我使用符号变量和约束在 Julia JuMP 中创建了一个优化模型 例如以下 using JuMP using CPLEX model Mod Model CPLEX Optimizer sets I 1 2 Variables x var