在神秘主义者中添加线性不等式约束

时间:2019-05-15 17:12:34

标签: python mystic

我正在尝试通过对100个变量的问题使用mystic来实现具有16个线性不等式约束和一个线性等式约束的非线性优化。当我使用linear_symbolic模块创建约束时,执行陷入困境。我发现没有其他明显的方法可以添加约束。

Scipy的最小化模块会为非二次型(我的目标是相对熵)的目标函数产生不好的解决方案,并且当起始值与最优解不太接近时,我不得不放弃它。这实际上是迈克·麦克肯斯(Mike McKerns)在激发神秘主义者时提出的观点,因此当我碰到它时,我感到非常高兴。

我尝试了以下两行:

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维向量。

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

1 个答案:

答案 0 :(得分:0)

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

用不等式进行简化需要很长时间,因为它会循环遍历所有可能的符号翻转,并假定最坏的情况是在每个等式的左侧隔离一个变量。执行以下操作将一次隔离一个方程,然后(理论上)可以与约束关键字“ join”耦合,或如下所示:

>>> 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