首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mystic中添加线性不等式约束

在mystic中添加线性不等式约束
EN

Stack Overflow用户
提问于 2019-05-16 01:12:34
回答 1查看 202关注 0票数 1

我试图通过使用mystic来实现一个具有16个线性不等式约束和一个线性等式约束的非线性优化,该问题具有100个变量。当我使用linear_symbolic模块创建约束时,执行被卡住了。我找不到其他明显的方法来添加约束。

Scipy的最小化模块为不是二次型(我的目标是相对熵)的目标函数生成糟糕的解,并且当起始值不是非常接近最优解时,所以我不得不放弃它。这实际上是Mike McKerns在激励神秘主义者时提出的观点,所以当我遇到它时,我非常高兴。

我已经尝试了以下两行:

代码语言:javascript
复制
cf = mystic.symbolic.linear_symbolic(np.ones(100),[1.],G,h) 
cons = mystic.symbolic.generate_constraint(mystic.symbolic.generate_solvers(mystic.symbolic.simplify(cf)))

其中G是系数的16x100矩阵,h是包含不等式右侧常数的16维向量。

代码在上面的第一行执行得相对较快,但它从不执行第二行(我的计算机在长时间等待后崩溃)。

EN

回答 1

Stack Overflow用户

发布于 2019-05-16 03:27:44

Issues regarding constraint's setting via mystic package类似的问题/答案。

不等式简化需要很长一段时间,因为它循环了所有可能的符号反转,并假设在每个等式的左侧隔离一个变量的最坏情况。执行以下操作将一次隔离一个等式,然后您可以(在理论上)将其与约束关键字"join“结合在一起,或者如下所示:

代码语言:javascript
复制
>>> import mystic      
>>> import numpy as np
>>> G = np.random.random((16,30)) * 100 
>>> h = np.random.random((16,)) * 1000
>>> c = mystic.symbolic.linear_symbolic(np.ones(30),[1.],G,h)
>>> c = c.strip().split('\n')
>>> cs = '\n'.join(mystic.symbolic.simplify(ci, target='x{i}'.format(i=i)) for i,ci in enumerate(c))
>>> cons = mystic.symbolic.generate_constraint(mystic.symbolic.generate_solvers(cs))

显然,问题在于,虽然求解30个变量通常有效,但每行达到100个变量对所用计算机的内存来说太大了。因此,从字面上讲,问题是简化不等式的代码不如简单情况下的效率高,一旦它开始与内存挂钩,它就会变得很慢。我将不得不考虑减少内存占用...但是,您可以通过进行一些更多的手动简化来解决这个问题(所有需要做的就是在每个等式的左侧分别隔离一个变量)。

在上面的例子中,它对于10个变量来说是快的,但是对于30个变量来说需要一分钟左右的时间。对于明显只有一个变量只使用一次的情况,因此很容易隔离,它不应该花那么长时间。我确信,通过一些小的清理,我可以减少函数的内存需求。我已经为这个问题创建了一个票据:https://github.com/uqfoundation/mystic/issues/113

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56154501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档