我想在 MatLab 中最大化这个功能 - http://goo.gl/C6pYP
最大化 | 功能 | 3x+6y+9z 域 | 12546975x+525x^2+25314000y+6000y^2+47891250z+33750z^2<=4000000000 | 为| xyz
但变量 x、y 和 z 只能是非负整数。任何想法如何在 MatLab 中实现它?
我想在 MatLab 中最大化这个功能 - http://goo.gl/C6pYP
最大化 | 功能 | 3x+6y+9z 域 | 12546975x+525x^2+25314000y+6000y^2+47891250z+33750z^2<=4000000000 | 为| xyz
但变量 x、y 和 z 只能是非负整数。任何想法如何在 MatLab 中实现它?
您想要整数的事实使这个问题很难解决(即在合理的时间内无法解决)。
您将不得不使用一些通用优化器,并通过蛮力尝试许多起始条件。您不能保证找到全局最大值。有关更多可能的优化器,请参阅Matlab 的优化包。
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
好吧,幸运的是问题规模很小,所以我们可以暴力破解它。
首先得到一些上限,这里是如何为 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
这可能不是最有效的方法,但它应该很容易阅读。
您必须将问题表述为 ILP(整数线性程序)。要求解 ILP,您需要对 matlab LP solver的输入进行少量更改。您还可以从 LP 求解器获得解,然后将解四舍五入为整数。该解决方案可能不是最佳的,但会很接近。
您还可以 在文件交换站点使用混合整数线性编程求解器,该站点又使用 LP 求解器。对于二进制变量,您可以使用 matlab二进制整数编程求解器。