【问题标题】:Optimization giving unexpected results MATLAB优化产生意想不到的结果 MATLAB
【发布时间】:2014-08-12 00:03:03
【问题描述】:

我正在尝试优化我知道结果的函数,但 matlab 给了我奇怪的结果。这是我正在尝试做的事情:

max: f(x)= -1815·x1 - 379·x2

subject to: 

    -1475·x1 - 112013·x2 >= -700000
    (x1,x2) <= 80
    (x1,x2) >= 0

这是我的实际代码:

f  = [1815;379]
A  = [-1475 -11203]
b  = [-700000]
ub = (ones(1,2)*80)'
lb = zeros(2,1)
x  = linprog(f,A,b,[],[],lb,ub)

你会怎么做?

【问题讨论】:

  • 至少包括实现的结果,以及预期的结果。无论如何,当您编辑帖子时,请确保将代码放入代码块中(检查编辑器中的按钮)。 -- 我要检查的第一件事是你是否需要在任何地方翻转标志。
  • x1=0, x2=62.48 是结果
  • Excel 给了我 x1=40 和 x2=80
  • 正如您所写,解决方案很简单 (0, 0),因为您将 (x1,x2) 限制为正数,并尝试使用负系数最大化线性函数。点 (0, 0) 满足您的约束,因此它是解决方案。你确定你所有的系数都有正确的符号,你所有的不等式都是正确的吗?
  • 在您的代码中,Ab 有错误的符号。它们对约束A * x &lt;= b 进行编码,但由于您实际上有一个“大于”约束,因此您需要翻转符号以使其成为“小于”约束。

标签: matlab optimization


【解决方案1】:

这个问题很容易分析解决。

正如 cmets 中提到的,您目前期望 0。但是,如果您实际上将约束从大于更改为小于,则最佳解决方案实际上接近 matlab 给您的。

基本上是 700000/112013 = 6.248...

错了 10 倍,但我认为你在某处打错了字。


如果您对这个函数的工作方式感到困惑,只需先尝试一个简单的案例(您可以轻松地手动验证),然后再增加复杂性。无论哪种方式,您的 excel 解决方案都与问题描述中的结果相去甚远。

【讨论】:

    【解决方案2】:

    您的线性约束的符号不正确 w.r.t。 linprog 的预期效果如何。

    与许多线性问题一样,实际上最简单的方法就是画一个图:

    [x1,x2] = meshgrid(0:80);
    f = -1815*x1 - 379*x2;
    f(-1475*x1 - 112013*x2 < -7e5) = NaN;
    surf(x1,x2,f, 'edgecolor', 'none')
    xlabel('x1'), ylabel('x2')
    

    这很明显(0,0) 是解决方案:

    【讨论】:

    • 最大值:f(x)= 1815·x1 + 379·x2 服从:-1475·x1 - 112013·x2 >= -700000 (x1,x2) = 0
    • Excel 给出 x1=80 和 x2=40
    • 我创建了一个 MATLAB 聊天室,供我们讨论与 MATLAB 相关的事情,或者进行超出单个评论限制的讨论。有时间就来找我们吧! - chat.stackoverflow.com/rooms/81987/matlab
    猜你喜欢
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多