主要内容

创建有效的优化问题

当问题有整数约束时,解决呼叫intlinprog.获得解决方案。有关获得更快的解决方案或更整数可行点的建议,请参阅调整整数线性规划

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

假设您的客观函数是

σ. 一世 = 1 30. σ. j = 1 30. σ. K. = 1 10. X 一世 j K. B. K. C 一世 j

在哪里X是优化变量,B.C是常数。制定此目标函数的两种通用方式如下:

  • 用一个为了环形。

    x = Optimvar('X',30,30,10);b = Optimvar('B',10);c = Optimvar('C',30,30);Tic expr = Optimexpr;为了我= 1:30为了j = 1:30为了k = 1:10 expr = expr + x(i,j,k)* b(k)* c(i,j);结尾结尾结尾TOC.
    经过时间为307.459465秒。

    这里,expr.包含目标函数表达式。虽然这种方法很简单,但它可能需要过度循环到许多级别的时间为了循环。

  • 使用矢量化语句。矢量化陈述通常比a更快地运行为了环形。您可以通过多种方式创建Vectorized语句。

    • 扩张B.C。启用术语方向乘法,创建与尺寸相同的常量X

      Tic BigB = REPAPE(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(sum(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,'indowbound',-1,'上行',1);y = Optimvar('是',n,'indowbound',-1,'上行',1);z = Optimvar('z',n,'indowbound',-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,:)/ narm(x0(ii,:))/ 2;X0(II,3)= X0(II,3) -  1;结尾init.x = x0(:,1);init.y = x0(:,2);init.z = x0(:,3);opts = Optimoptions('粉丝''展示''离开');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;Energy = Energy + Sum(Tempe。^( -  1/2));结尾elecprob.objective =能量;DISP('矢量化计算时间:')[Sol,Fval,ExitFlag,输出] =求解(EleecProb,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)^( -1/2);结尾结尾elecprob.objective = Energy2;DISP('非矢量化计算时间:')[Sol,Fval,ExitFlag,输出] =求解(EleecProb,Init,'选项',选择);TOC.
非矢量化计算时间:经过时间为204.615210秒。

Vectorized版本的速度比非vectorized版本快100倍。

相关话题