scipy.optimize.linprog无法找到解决方案

时间:2017-08-25 14:35:55

标签: python scipy linear-programming

我正在尝试检查数据是否可线性分离。我正在使用此link中提到的等式来实现此目的。我在python中使用Scipy包的linprg函数。数组的大小如下:

  

A = [12137810,11]
  A1 = [12137,11]
  b = 12137
  c = 11

以下是我正在使用的代码:

try:
        import os
        import random
        import traceback
        import numpy as np
        import scipy.io as sio
        from scipy.optimize import linprog
        os.system('cls')
        dicA  = sio.loadmat('A.mat')
        A = dicA.get('A')
        lengthA = int(len(A)/1000)
        aRange = range(0,lengthA)
        selectedIndexes = random.sample(aRange,lengthA)
        A1 = A[selectedIndexes]
        print('a = [',len(A),',',len(A[0]),']')
        print('a1 = [',len(A1),',',len(A1[0]),']')
        del A
        b = -1*np.ones(len(A1),np.int64)
        c = np.zeros(11,np.int64)
        print('c = ',len(c))
        print('b =',len(b))
        del dicA
        res = linprog(c, A_ub=A1, b_ub=b, bounds=(None,None),options={"disp": True,"maxiter": 25000})
        print(res)
except:
        print('exception')
        tb = traceback.format_exc()
        print(tb)
finally:

        print('reached finally')

以下是我得到的输出:

Iteration limit reached.
fun: -0.0  message: 'Iteration limit reached.'
nit: 25000   status: 1  success: False
x: nan reached finally

所以,即使经过2500次迭代,也无法找到解决方案,也没有说解决方案不存在。那么,这是否意味着解决方案不存在?或者我应该增加迭代限制,如果是,那么增加多少?

1 个答案:

答案 0 :(得分:2)

如果您信任求解器(=实现质量),请增加迭代限制,直到出现其他退出状态。

良好的实现总是在有限的时间内结束,这意味着:退出状态将在某个迭代大小时发生变化。无限或不可行的解决方案或证书。

编辑:以上结果仅限于单纯形法(质量实施)的实施! Interior-point methods表现不同,并且没有一般的基础理论来强有力地提供这些证书(理论一般认为问题是可行的),例外是使用同构自双嵌入的那些({{3} })。

一般来说,Simplex算法通常会使用相当多的迭代(至少与内点方法相比;我不会判断你的例子)。