3

晚上好,

我对 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

但这似乎没问题。有人知道它可能来自哪里吗?如果缺少任何信息,我会很乐意尝试收集它们。

4

1 回答 1

1

使用的默认内点方法linprog在实际迭代开始之前执行一些预处理步骤。因此,虽然您Aeq可能不包含对应元素为非零的全零行beq,但这可能发生在预处理之后。

您可以尝试linprog使用另一种算法(使用optimset('LargeScale', 'off')和/或optimset('LargeScale', 'off', 'Simplex', 'on'))运行并查看在这种情况下的输出。

但是,我怀疑在所有情况下你都会得到一个“不可行的问题”退出标志,因为你的等式约束似乎无法满足。

有关Matlab 可用的线性规划算法及其预处理步骤的更多信息。

于 2012-12-22T17:28:45.623 回答