晚上好,
我在Matlab的linprog函数中遇到问题,这是我收到的消息:
由于不可行而退出:约束中的全零行
矩阵在相应的右侧条目中没有零。
根据帮助,这意味着我在Aeq中至少有一行充满零(假设第i行),但是beq(i)不等于零。
我检查了做的矩阵:
checkmat=full(sum(abs(Aeq')))';
checkmat=horzcat(checkmat,beq);
for i=1:length(checkmat)
if (checkmat(i,1)==0 && checkmat(i,2)~=0) || (checkmat(i,2)==0 && checkmat(i,1)~=0)
i
end
end
但这似乎还可以。有没有人知道它可能来自哪里?
如果缺少任何信息,我将很乐意尝试收集它们。
最佳答案
linprog
使用的默认内部点方法在实际迭代开始之前执行一些预处理步骤。因此,尽管您的Aeq
可能不包含全零的行,而beq
的对应元素不为全零,但可能在预处理之后发生。
您可以尝试使用其他算法(使用linprog
和/或optimset('LargeScale', 'off')
)运行optimset('LargeScale', 'off', 'Simplex', 'on')
,并查看在这种情况下的输出。
但是,我怀疑在所有情况下您都会得到一个“不可行的问题”退出标志,因为您的平等约束似乎无法满足。
More info关于Matlab可用的线性编程算法及其预处理步骤。