【问题标题】:Maximizing function with constrains in MatLab在 MatLab 中使用约束最大化函数
【发布时间】:2013-04-10 21:16:06
【问题描述】:

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

最大化 |功能 | 3x+6y+9z 域名 | 12546975x+525x^2+25314000y+6000y^2+47891250z+33750z^2

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

【问题讨论】:

  • 由于您已经在 wolframalpha 的问题中给出了全局最优值的位置,因此应该很容易推断 Z 可能为零或接近它,并且 x 和的全局最优值y 是(接近?)整数约束最优值的上限。

标签: matlab optimization maximize wolframalpha


【解决方案1】:

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

您将不得不使用一些通用优化器,并通过蛮力尝试许多起始条件。您不能保证找到全局最大值。请参阅Matlab's optimization package 了解更多可能的优化器。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我认为这不能被表述为 ILP,因为约束是非线性的。
    • 如果我们定义 x1=x, x2=x^2, x3=y, x4=y^2, x5=z, x6=z^2 等,即平方项作为新变量目标变为 3*x1+0*x2+6*x3+0*x4+9*x5+0*x6 并且约束也变为线性。因此可以应用 ILP。
    • 约束将变为线性,但随后函数本身变为非线性。这无济于事。
    • 函数在新变量上不是非线性的。你能更清楚地看到使用新变量的目标的非线性吗?
    • 这无济于事,因为现在 x1^2==x2 已成为新的约束。
    【解决方案3】:

    好吧,幸运的是问题很小,所以我们可以暴力破解它。

    首先得到一些上限,这里是如何为 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
    

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

    【讨论】:

    • 对于实际尺寸问题,您可以先解决 NLP 松弛(无整数约束),然后应用分支定界。
    【解决方案4】:

    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
    

    解决办法是:

    最大 =

    945

    x_star =

    287

    y_star =

    14
    

    z_star =

     0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      相关资源
      最近更新 更多