主要内容

创建有效的优化问题

当问题具有整数限制时,解决呼叫intlinprog获得解决方案。有关获取更快解决方案或更整数的点的建议,请参见调整整数线性编程

在开始解决问题之前,有时您可以改善问题限制或客观的表述。通常,该软件可以以矢量化的方式而不是在循环中更快地创建目标函数的表达式或更快的约束。当优化表达式通过自动分化时,这种速度差异特别大。看优化工具箱中的自动差异化

假设您的目标功能是

一世 = 1 30 j = 1 30 k = 1 10 X 一世 ,,,, j ,,,, k b k C 一世 ,,,, j ,,,,

在哪里X是一个优化变量,并且bC是常数。制定此目标函数的两种一般方法如下:

  • 用一个为了环形。

    x = optimvar('X',30,30,10);b = optimvar('b',10);c = optimvar('C',30,30);tic expr = optimexpr;为了i = 1:30为了j = 1:30为了k = 1:10 expr = expr + x(i,j,k)*b(k)*c(i,j);结尾结尾结尾TOC
    经过的时间为307.459465秒。

    这里,Expr包含目标函数表达式。尽管这种方法很简单,但可能需要过多的时间来循环多个级别为了循环。

  • 使用矢量化语句。矢量化语句通常运行速度比为了环形。您可以通过多种方式创建矢量化语句。

    • 扩张bC。要启用术语乘法,创建与大小相同的常数X

      tic bigb = reshape(b,1,1,10);bigB = repmat(BigB,30,30,1);bigc = repmat(c,1,1,10);expr = sum(sum(sum(x。*bigB。*bigc)));TOC
      经过的时间为0.013631秒。
    • 循环一次b

      tic expr = optimexpr;为了k = 1:10 expr = expr + sum(x(x(:,:,k)。*c))*b(k);结尾TOC
      经过的时间为0.044985秒。
    • 通过循环创建表达b然后在循环后求和条款。

      tic expr = optimexpr(30,30,10);为了k = 1:10 expr(:,:,k)= x(:,:,k)。*c*b(k);结尾expr = sum(expr(:));TOC
      经过的时间为0.039518秒。

观察示例的矢量化和非向量实现之间的速度差异约束静电非线性优化,基于问题的。此示例是使用R2020B中自动分化定时的。

n = 30;x = optimvar('X',n,,“下界”,-1,“上行”,1);y = optimvar('y',n,,“下界”,-1,“上行”,1);z = optimvar('Z',n,,“下界”,-2,“上行”,0);elecprob = optimproblem;elecprob.constraints.spherec =(x。^2 + y。^2 +(z + 1)。^2)<= 1;elecprob.constraints.plane1 = z <= -x -y;elecprob.constraints.plane2 = z <= -x+y;elecprob.constraints.plane3 = z <= x-y;elecprob.constraints.plane4 = z <= x+y;RNG默认%可再现性x0 = randn(n,3);为了ii = 1:n x0(ii,:) = x0(ii,:)/norm(x0(ii,:))/2;x0(ii,3)= x0(ii,3)-1;结尾init.x = x0(:,1);in.y = x0(:,2);ins.z = x0(:,3);opts = optimoptions('fmincon',,,,'展示',,,,'离开');TIC Energy = OptimeXpr(1);为了ii = 1:(n-1)jj =(ii+1):n;%矢量tempe =(x(ii)-x(jj))。^2 +(y(ii)-y(jj))。^2 +(z(ii)-z(jj))。^2;^2;能量=能量 + sum(tempe。^( -  1/2));结尾elecprob.Objective = energy;disp(“矢量化计算时间:”)[SOL,FVAL,EXITFLAG,输出] = Solve(Elecprob,Init,,'选项',选择);TOC
矢量化计算时间:经过的时间为1.838136秒。
TIC Energy2 = OptimeXpr(1);非矢量比较的%为了II = 1:(n-1)为了jjj =(ii+1):n;%未矢量化Energy2 = Energy2 +((x(ii)-x(jjj))^2 +(y(ii)-y(jjj))^2 +(z(ii)-z(jjj))^2)^2)^( -1/2);结尾结尾elecprob.Objective = Energy2;disp(“非矢量化计算时间:”)[SOL,FVAL,EXITFLAG,输出] = Solve(Elecprob,Init,,'选项',选择);TOC
非矢量化计算时间:经过的时间为204.615210秒。

矢量化版本的速度比非矢量化版本快100倍。

相关话题