在Matlab中使用约束条件最大化3x+y

3
我需要在Matlab中最大化方程式3x+y,并满足以下限制条件:
2x+y≤6, x+3y≤9,并且x,y≥0。
我很难想出一种方法将限制条件与原方程联系起来。我是Matlab的新手,很难弄清楚这一点。
提前感谢!
2个回答

5

正如 @Franck 所提到的,通常可以使用 fmincon 来解决优化问题。然而,由于您的问题仅是一个线性规划问题,因此解决方案更简单(并保证最优):

f = -[3 1]; % Note the minus as we want maximization
A = [2 1; 1 3];
b = [6; 9];
LB = [0 0];

[X, FVAL] = linprog(f,A,b,[],[],LB)

将提供:

X =

    3.0000
    0.0000


FVAL =

   -9.0000

因此,最优解在点(3,0)处找到,结果值为9。
尝试使用“help linprog”来了解更多关于这个非常有用的函数的信息。

使用更加临时的函数会更好,这样读者可以根据自己的限制进行选择。 - Franck Dernoncourt

2
创建以下文件并运行 maximize_stuff:
maximize_stuff.m:
function [] = maximize_stuff()

x0 = [2 2]; % fmincon starts at X0 and finds a minimum X
[x,fval] = fmincon('objfun',x0,[],[],[],[],[0;0],[Inf;Inf],'constraint');
fval = -fval; % Because we want to find the maximum, not the minimum

x
fval

end

objfun.m

function f=objfun(x)    
f = 3*x(1) + x(2);
f = -f; % Because we want to find the maximum, not the minimum
end

constraint.m :

function [c,ceq]=constraint(x)

c1 = 2 * x(1) + x(2) - 6; 
c2= x(1) + 3*x(2) - 9;
c = [c1;c2];
ceq = [];

end

它应该返回:

>> maximize_stuff

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the function tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>

Active inequalities (to within options.TolCon = 1e-06):
  lower      upper     ineqlin   ineqnonlin
    2                                1

x =

    3.0000         0


fval =

    9.0000

您可以验证这个结果:http://www.wolframalpha.com/input/?i=2x%2By%3C%3D6%3B+x%2B3y%3C%3D9%3B+x%3E%3D0%3By%3E%3D0%3B
以下是非常好的教程:http://www.math.colostate.edu/~gerhard/classes/331/lab/fmincon.html fmincon 被调用如下:
- 只带线性不等式约束 Ax≤b(类似 linprog):[x,fval]=fmincon('objfun',x0,A,b)。 - 带线性不等式约束和线性等式约束 Aeq·x=beq:[x,fval]=fmincon('objfun',x0,A,b,Aeq,beq)。 - 带线性不等式和等式约束,以及形式为 x≥lb 的下界:[x,fval]=fmincon('objfun',x0,A,b,Aeq,beq,lb)。如果只有子集的变量有下界,则对应于没有下界的变量的 lb 分量为 -Inf。例如,如果变量为(x、y),且 x≥1 但 y 没有下界,则 lb=[1;-Inf]。 - 带线性不等式和等式约束,并带形式为 x≤ub 的上下界:[x,fval]=fmincon('objfun',x0,A,b,Aeq,beq,lb,ub)。如果只有子集的变量有上界,则对应于没有上界的变量的 ub 分量为 Inf。例如,如果变量为(x、y)且 x≤1 但 y 没有下界,则 lb=[1;Inf]。 - 带线性不等式和等式约束,以及下限和上限,以及非线性不等式和等式约束:[x,fval]=fmincon('objfun',x0,A,b,Aeq,beq,lb,ub,'constraint')。在此调用中,最后一个输入参数是一个函数文件的名称(在这些笔记中表示为 constraint 并保存为 constraint.m,在工作目录中),其中编码了非线性约束。

2
当然可以工作,但使用 fmincon 来解决线性问题似乎有点过度设计。 - Dennis Jaheruddin
好的,谢谢你指出来,我在“在Matlab中使用约束最大化3x+y”回答时没有检查约束的线性性。 - Franck Dernoncourt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接