[英]Linear programming using scipy.optimize.linprog returns suboptimal solution
[英]scipy.optimize.linprog not able to find solution
我正在尝试检查数据是否线性可分离。 我正在为此目的使用此链接中提到的方程式。 我在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次迭代,它也无法找到解决方案,也没有说解决方案不存在,那么,这是否意味着解决方案不存在? 还是应该增加迭代限制,如果有,那么增加多少?
如果您信任求解器(=实现质量),请增加迭代限制,直到出现其他退出状态为止。
一个好的实现总是会在有限的时间内结束,这意味着: 退出状态将以某种迭代大小发生变化 。 将会有解决方案或某些证书,说明无限制或不可行。
编辑:以上结果仅限于单纯形方法的实现(质量实现)! 内点方法的行为各不相同,并且通常没有底层理论来可靠地提供这些证书(该理论通常假定问题是可行的),但使用同质自对偶嵌入的证书除外 ( O(√nL -迭代均质和自对偶线性规划算法( )。
一般而言,众所周知,单纯形算法通常会使用很多迭代(至少与Interior-point方法相比;我无法判断您的示例)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.