1

我正在尝试通过对具有 100 个变量的问题使用神秘来实现具有 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 维向量,包含不等式右侧的常数。

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

4

1 回答 1

0

关于通过神秘包设置约束的问题的类似问题/答案。

使用不等式进行简化需要很长时间,因为它循环遍历所有可能的符号翻转,并假设在每个方程的左侧隔离一个变量的最坏情况。执行以下操作将一次隔离一个方程,然后您可以(理论上)将其与约束关键字“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 。

于 2019-05-15T19:27:43.843 回答