我试图通过对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维向量。
该代码在上面的第一行执行相对较快,但从未执行过第二行(长时间等待后我的计算机崩溃了)。
最佳答案
与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。
关于python - 在神秘主义者中添加线性不等式约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56154501/