使用MatLab中的约束最大化函数

时间:2013-04-10 21:16:06

标签: matlab optimization maximize wolframalpha

我想在MatLab中最大化此功能 - http://goo.gl/C6pYP

最大化|功能| 3X + 6Y + 9Z 域名| 12546975x + 525x ^ 2 + 25314000y + 6000y ^ 2 + 47891250z + 33750z ^ 2< = 4000000000 |为| x y z

但变量x,y和z必须只是非负整数。 有任何想法如何在MatLab中实现它?

4 个答案:

答案 0 :(得分:0)

你想要整数的事实使得这个问题很难解决(即在合理的时间内无法解决)。

你将不得不使用一些通用的优化器,并通过强力尝试许多启动条件。您无法保证找到全局最大值。有关更多可能的优化器,请参阅Matlab's optimization package

答案 1 :(得分:0)

您必须将问题表述为ILP(整数线性程序)。要解决ILP,您需要对matlab LP solver的输入进行一些更改。您还可以从LP解算器获取解决方案,然后将解决方案四舍五入为整数。解决方案可能不是最佳的,但会很接近。

您还可以在文件交换站点使用mixed-integer liner programing解算器,而后者又使用LP求解器。对于二进制变量,您可以使用matlab binary integer programing solver

答案 2 :(得分:0)

嗯,幸运的是,问题的规模很小,所以我们可以强制它。

首先得到一些上限,这里是如何为x:

做的
xmax= 0;
while 12546975*xmax+525*xmax^2<=4000000000
    xmax=xmax+1;
end

这给了我们所有三个变量的上限。现在我们可以看到这些限制的产品并不多,所以我们可以尝试所有的解决方案。

bestval = 0;
for x = 0:xmax
    for y = 0:ymax
        for z = 0:zmax
            val = 3*x+6*y+9*z;
            if val> bestval && 12546975*x+525*x^2+25314000*y+6000*y^2+47891250*z+33750*z^2<=4000000000
                bestval = val;
                best = [x y z];
            end
        end
    end
end
best, bestval

这可能不是最有效的方法,但它应该很容易阅读。

答案 3 :(得分:0)

y和z(152,79)的最大值不是很高,因此我们可以逐个检查以快速找到解决方案(在我的笔记本电脑中只需0.040252秒)。

我的matlab代码:

function [MAX,x_star,y_star,z_star]=stackoverflow1
%maximize 3x+6y+9z
% s.t.    12546975x+525x^2+25314000y+6000y^2+47891250z+33750z^2<=4000000000
MAX=0;
y_max=solver(6000,25314000,-4000000000);
z_max=solver(33750,47891250,-4000000000);
for y=0:floor(y_max)
    for z=0:floor(z_max)
        x=solver(525,12546975,+25314000*y+6000*y^2+47891250*z+33750*z^2-4000000000);
        x=floor(x);
        if isnan(x) || x<0
            break;
        end
        if 3*x+6*y+9*z>MAX
            MAX=3*x+6*y+9*z;
            x_star=x;
            y_star=y;
            z_star=z;
        end
    end
end
end
function val=solver(a,b,c)
% this function solve equation a*x^2+b*x+c=0.
% this equation should have two answers,this function returns the bigger one only.
if b*b-4*a*c>=0
    val=(-b+sqrt(b*b-4*a*c))/(2*a);
else
    val=nan; % have no real number answer.
end
end

解决方案是:

MAX =

945

x_star =

287

y_star =

14

z_star =

 0