Octave中使用GLPK求解最大化问题为何得到负值结果?
问题原因与修正方案
问题出在目标函数系数与优化方向的匹配错误。
GLPK的Octave接口中,s=-1表示要最大化目标函数c'*x,而你设置的c = [-12; -15; -20; -10],意味着实际求解的是:
max (-12x₁ -15x₂ -20x₃ -10x₄)
由于所有系数都是负数,求解器会让变量取最小值来最大化目标值——x₁下限是50,其他变量下限为0,最终得到-12*50 = -600,这就是负值结果的来源。
修正方式
如果你的真实目标是最大化12x₁ +15x₂ +20x₃ +10x₄(即注释中的利润最大化),有两种正确设置:
- 用正系数配合最大化方向:
c = [12; 15; 20; 10]; % 原利润系数 s = -1; % 声明最大化目标
- 用负系数配合最小化方向(等价于最大化原目标):
c = [-12; -15; -20; -10]; % 利润系数取反 s = 1; % 最小化取反后的目标,等价于最大化原利润
修正后重新运行,就能得到符合预期的正利润值。另外,status=0表示求解成功,这个状态是正常的,只是目标函数设置错误导致结果不符合预期。
内容的提问来源于stack exchange,提问作者Rares
相关产品推荐
相关产品推荐

