如何在Python中解决大量的多元复合线性不等式?

时间:2017-08-14 12:32:48

标签: python scipy sympy scientific-computing

我正努力尝试实现Dinur-Nissim算法,并坚持如何解决具有多个未知数和大量方程以及约束的线性不等式集。

实施例: 0.2< = C 4 LT = 0.66

0.66< = C3&LT = 1.56

0.96&LT = C3 + C4&LT = 2.26

约束: 0℃; = Cl< = 1

和许多其他方程式,其中没有未知数直到cn,其中n是数据库的大小,所以我需要一个适用于大量方程的解决方案。

我试图寻找一些库,但大多数都解决了最大化或最小化问题,因此不确定是否可以将这些方程转换为其中一个问题。

1 个答案:

答案 0 :(得分:1)

使用scipy的linprog的简单方法(线性编程; LP可能是这里最常用/最强大的优化问题类型!):

代码

from scipy.optimize import linprog

c = [0, 0, 0, 0]                            # empty objective
A = [[0, 0, 0, -1], [0, 0, 0, 1],
     [0, 0, -1, 0], [0, 0, 1, 0],
     [0, 0, -1, -1], [0, 0, 1, 1]]
b = [-0.2, 0.66, -0.66, 1.56, -0.96, 2.26]

result = linprog(c, A, b, bounds=(0,1))
print(result)

输出

fun: -0.0
message: 'Optimization terminated successfully.'
nit: 3
slack: array([ 0.1 ,  0.9 ,  1.3 ,  1.  ,  1.  ,  0.34,  0.7 ,  0.  ,  0.  ,  0.  ])
status: 0
success: True
  x: array([ 0.  ,  0.  ,  0.66,  0.3 ])

以上是linprog的基本用法:

  • 我们不需要任何目标,因此将所有因素保持为零(参见c
  • 我们需要表单Ax <= b来表示我们的不等式:
    • 0.96 <= c3+c4 <=> c3+c4 >= 0.96 <=> -c3 -c4 <= 0.96

请记住,linprog不如商业解决方案稳定。您也可以使用SLSQP解决此问题。

以上内容,结合您的描述:

  

基本上最后一步是根据c的值做出决定,如果ci> 1/2然后xi = 1,则xi = 0,所以我只需要找到满足c的区域c'不等式

一般情况中没有多大意义,因为正如您的文章中所述,优化会返回一个可行值而无需额外建模,求解器不关心您的阈值0.5。所以你应该再次检查你的理论(我没有检查你的算法来实现;也许问题的本质允许这种方法。)