MATLAB优化问题(1)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 第5章  优化问题 5.1  线性规划问题 线性规划问题是目标函数和约束条件均为线性函数的问题,MATLAB6.0解决的线性规划问题的标准形式为: min   sub.to:                                        其中f、x、b、beq、lb、ub为向量,A、Aeq为矩阵。

5章  优化问题

5.1  线性规划问题

线性规划问题是目标函数和约束条件均为线性函数的问题,MATLAB6.0解决的线性规划问题的标准形式为:

min  

sub.to:

             

                        

其中f、x、b、beq、lb、ub为向量,AAeq为矩阵。

其它形式的线性规划问题都可经过适当变换化为此标准形式。

MATLAB6.0版中,线性规划问题(Linear Programming)已用函数linprog取代了MATLAB5.x版中的lp函数。当然,由于版本的向下兼容性,一般说来,低版本中的函数在6.0版中仍可使用。

函数  linprog

格式  x = linprog(f,A,b)   %min  f ' *x   sub.to  线性规划的最优解。

x = linprog(f,A,b,Aeq,beq)   %等式约束,若没有不等式约束,则A=[ ]b=[ ]

x = linprog(f,A,b,Aeq,beq,lb,ub)   %指定x的范围,若没有等式约束 ,则Aeq=[ ]beq=[ ]

x = linprog(f,A,b,Aeq,beq,lb,ub,x0)   %设置初值x0

x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)    % options为指定的优化参数

[x,fval] = linprog()   % 返回目标函数最优值,即fval= f ' *x

[x,lambda,exitflag] = linprog()   % lambda为解x的Lagrange乘子。

[x, lambda,fval,exitflag] = linprog()   % exitflag为终止迭代的错误条件。

[x,fval, lambda,exitflag,output] = linprog()   % output为关于优化的一些信息

说明  若exitflag>0表示函数收敛于解x,exitflag=0表示超过函数估值或迭代的最大数字,exitflag<0表示函数不收敛于解x;若lambda=lower 表示下界lb,lambda=upper表示上界ublambda=ineqlin表示不等式约束,lambda=eqlin表示等式约束,lambda中的非0元素表示对应的约束是有效约束;output=iterations表示迭代次数,output=algorithm表示使用的运算规则,output=cgiterations表示PCG迭代次数。

5-1  求下面的优化问题

min  

sub.to    

            

                     

                      

解:

>>f = [-5; -4; -6];

>>A =  [1 -1  1;3  2  4;3  2  0];

>>b = [20; 42; 30];

>>lb = zeros(3,1);

>>[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)

结果为:

x =      %最优解

    0.0000

   15.0000

    3.0000

fval =     %最优值

  -78.0000

exitflag =     %收敛

     1

output = 

      iterations: 6   %迭代次数

    cgiterations: 0

       algorithm: 'lipsol'   %所使用规则

lambda = 

    ineqlin: [3x1 double]

      eqlin: [0x1 double]

      upper: [3x1 double]

      lower: [3x1 double]

>> lambda.ineqlin

ans =

    0.0000

    1.5000

    0.5000

>> lambda.lower

ans =

    1.0000

    0.0000

    0.0000

表明:不等约束条件23以及第1个下界是有效的

5.2  foptions函数

对于优化控制,MATLAB提供了18个参数,这些参数的具体意义为:

options(1)-参数显示控制(默认值为0)。等于1时显示一些结果。

    options(2)-优化点x的精度控制(默认值为1e-4)

    options(3)-优化函数F的精度控制(默认值为1e-4)

    options(4)-违反约束的结束标准(默认值为1e-6)

    options(5)-算法选择,不常用。

    options(6)-优化程序方法选择,为0则为BFCG算法,为1则采用DFP算法。 

    options(7)-线性插值算法选择,为0则为混合插值算法,为1则采用立方插算法。

    options(8)-函数值显示 (目标—达到问题中的Lambda )

    options(9)-若需要检测用户提供的梯度,则设为1

    options(10)-函数和约束估值的数目。

    options(11)-函数梯度估值的个数。

    options(12)-约束估值的数目。

    options(13)-等约束条件的个数。

    options(14)-函数估值的最大次数(默认值是100×变量个数) 

    options(15)-用于目标 — 达到问题中的特殊目标。 

    options(16)-优化过程中变量的最小有限差分梯度值。

    options(17)- 优化过程中变量的最大有限差分梯度值。

    options(18)-步长设置 (默认为1或更小)

Foptions已经被optimset和optimget代替,详情请查函数optimset和optimget。

5.3  非线性规划问题

5.3.1  有约束的一元函数的最小值

单变量函数求最小值的标准形式为     sub.to  

MATLAB5.x中使用fmin函数求其最小值。

函数  fminbnd

格式  x = fminbnd(fun,x1,x2)   %返回自变量x在区间上函数fun取最小值时x值,fun为目标函数的表达式字符串或MATLAB自定义函数的函数柄。

x = fminbnd(fun,x1,x2,options)   % options为指定优化参数选项

[x,fval] = fminbnd()   % fval为目标函数的最小值

[x,fval,exitflag] = fminbnd()   %xitflag为终止迭代的条件

[x,fval,exitflag,output] = fminbnd()   % output为优化信息

说明  若参数exitflag>0,表示函数收敛于x,若exitflag=0,表示超过函数估计值或迭代的最大数字,exitflag<0表示函数不收敛于x;若参数output=iterations表示迭代次数,output=funccount表示函数赋值次数,output=algorithm表示所使用的算法。

5-2  计算下面函数在区间(0,1)内的最小值。

 

解:>> [x,fval,exitflag,output]=fminbnd('(x^3+cos(x)+x*log(x))/exp(x)',0,1)

x =

    0.5223

fval =

    0.3974

exitflag =

     1

output = 

    iterations: 9

     funcCount: 9

     algorithm: 'golden section search, parabolic interpolation'

5-3  在[05]上求下面函数的最小值

解:先自定义函数:在MATLAB编辑器中建立M文件为:

function f = myfun(x)

f = (x-3).^2 - 1;

保存为myfun.m,然后在命令窗口键入命令:

>> x=fminbnd(@myfun,0,5)

则结果显示为:

x =

     3

5.3.2  无约束多元函数最小值

多元函数最小值的标准形式为

其中:x为向量,如

MATLAB5.x中使用fmins求其最小值。

命令  利用函数fminsearch求无约束多元函数最小值

函数  fminsearch

格式  x = fminsearch(fun,x0)   %x0为初始点,fun为目标函数的表达式字符串或MATLAB自定义函数的函数柄。

x = fminsearch(fun,x0,options)   % optionsoptimset

[x,fval] = fminsearch()   %最优点的函数值

[x,fval,exitflag] = fminsearch()   % exitflag与单变量情形一致

[x,fval,exitflag,output] = fminsearch()  %output与单变量情形一致

注意:fminsearch采用了Nelder-Mead型简单搜寻法。

5-4  求的最小值点

解:>>X=fminsearch('2*x(1)^3+4*x(1)*x(2)^3-10*x(1)*x(2)+x(2)^2',  [0,0])

结果为

X =

    1.0016    0.8335

或在MATLAB编辑器中建立函数文件

function  f=myfun(x)

f=2*x(1)^3+4*x(1)*x(2)^3-10*x(1)*x(2)+x(2)^2;

保存为myfun.m,在命令窗口键入

>> X=fminsearch ('myfun',  [0,0]) 或 >> X=fminsearch(@myfun,  [0,0])

结果为:

X =

    1.0016    0.8335

命令  利用函数fminunc求多变量无约束函数最小值

函数  fminunc

格式  x = fminunc(fun,x0)   %返回给定初始点x0的最小函数值点

x = fminunc(fun,x0,options)   % options为指定优化参数

[x,fval] = fminunc()   %fval最优点x处的函数值

[x,fval,exitflag] = fminunc()   % exitflag为终止迭代的条件,与上同。

[x,fval,exitflag,output] = fminunc()   %output为输出优化信息

[x,fval,exitflag,output,grad] = fminunc()   % grad为函数在解x处的梯度值

[x,fval,exitflag,output,grad,hessian] = fminunc()   %目标函数在解x处的海赛(Hessian)值

注意:当函数的阶数大于2时,使用fminunc比fminsearch更有效,但当所选函数高度不连续时,使用fminsearch效果较好。

5-5  求的最小值。

>> fun='3*x(1)^2+2*x(1)*x(2)+x(2)^2';

>> x0=[1 1];

>> [x,fval,exitflag,output,grad,hessian]=fminunc(fun,x0)

结果为:

x =

  1.0e-008 *

   -0.7591    0.2665

fval =

  1.3953e-016

exitflag =

     1

output = 

       iterations: 3

        funcCount: 16

         stepsize: 1.2353

    firstorderopt: 1.6772e-007

        algorithm: 'medium-scale: Quasi-Newton line search'

grad =

  1.0e-006 *

   -0.1677

    0.0114

hessian =

    6.0000    2.0000

    2.0000    2.0000

或用下面方法:

>> fun=inline('3*x(1)^2+2*x(1)*x(2)+x(2)^2')

fun =

     Inline function:

     fun(x) = 3*x(1)^2+2*x(1)*x(2)+x(2)^2

>> x0=[1 1]

>> x=fminunc(fun,x0)

x =

  1.0e-008 *

   -0.7591    0.2665

5.3.3  有约束的多元函数最小值

非线性有约束的多元函数的标准形式为:

 

sub.to    

 

 

 

 

其中:x、b、beq、lb、ub是向量,A、Aeq为矩阵,C(x)、Ceq(x)是返回向量的函数,f(x)为目标函数,f(x)、C(x)、Ceq(x)可以是非线性函数。

MATLAB5.x中,它的求解由函数constr实现。

函数  fmincon

格式  x = fmincon(fun,x0,A,b)

x = fmincon(fun,x0,A,b,Aeq,beq)

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

[x,fval] = fmincon()

[x,fval,exitflag] = fmincon()

[x,fval,exitflag,output] = fmincon()

[x,fval,exitflag,output,lambda] = fmincon()

[x,fval,exitflag,output,lambda,grad] = fmincon()

[x,fval,exitflag,output,lambda,grad,hessian] = fmincon()

参数说明:fun为目标函数,它可用前面的方法定义;

x0为初始值;

Ab满足线性不等式约束,若没有不等式约束,则取A=[ ]b=[ ]

Aeq、beq满足等式约束,若没有,则取Aeq=[ ]beq=[ ]

lb、ub满足,若没有界,可设lb=[ ]ub=[ ]

nonlcon的作用是通过接受的向量x来计算非线性不等约束和等式约束分别在x处的估计CCeq,通过指定函数柄来使用,如:>>x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon),先建立非线性约束函数,并保存为mycon.m:function [C,Ceq] = mycon(x)

C = …    计算x处的非线性不等约束的函数值。

Ceq = …   计算x处的非线性等式约束的函数值。

lambdaLagrange乘子,它体现哪一个约束有效。

output输出优化信息;

grad表示目标函数在x处的梯度;

hessian表示目标函数在x处的Hessiab值。

5-6  求下面问题在初始点(01)处的最优解

min  

sub.to    

 

解:约束条件的标准形式为

sub.to  

 

先在MATLAB编辑器中建立非线性约束函数文件:

function  [c, ceq]=mycon (x)

c=(x(1)-1)^2-x(2);

ceq=[ ];      %无等式约束

然后,在命令窗口键入如下命令或建立M文件:

>>fun='x(1)^2+x(2)^2-x(1)*x(2)-2*x(1)-5*x(2)';     %目标函数

>>x0=[0 1];

>>A=[-2 3];   %线性不等式约束

>>b=6;

>>Aeq=[ ];    %无线性等式约束

>>beq=[ ];

>>lb=[ ];       %x没有下、上界

>>ub=[ ];

>>[x,fval,exitflag,output,lambda,grad,hessian]

=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,@mycon)

则结果为

x =

     3     4

fval =

   -13

exitflag =      %解收敛

     1

output = 

       iterations: 2

        funcCount: 9

         stepsize: 1

        algorithm: 'medium-scale: SQP, Quasi-Newton, line-search'

    firstorderopt: [ ]

     cgiterations: [ ]

lambda = 

         lower: [2x1 double]   %x下界有效情况,通过lambda.lower可查看。

         upper: [2x1 double]   %x上界有效情况,为0表示约束无效。

         eqlin: [0x1 double]    %线性等式约束有效情况,不为0表示约束有效。

      eqnonlin: [0x1 double]    %非线性等式约束有效情况。

       ineqlin: 2.5081e-008    %线性不等式约束有效情况。

    ineqnonlin: 6.1938e-008    %非线性不等式约束有效情况。

grad =      %目标函数在最小值点的梯度

  1.0e-006 *

   -0.1776

         0

hessian =    %目标函数在最小值点的Hessian值

    1.0000   -0.0000

   -0.0000    1.0000

5-7  求下面问题在初始点x=(10, 10, 10)处的最优解。

Min  

Sub.to  

解:约束条件的标准形式为

sub.to     

 

>> fun= '-x(1)*x(2)*x(3)';

>> x0=[10,10,10];

>> A=[-1 -2 -2;1 2 2];

>> b=[0;72];

>> [x,fval]=fmincon(fun,x0,A,b)

结果为:

x =

   24.0000   12.0000   12.0000

fval =

       -3456

5.3.4  二次规划问题

二次规划问题(quadratic programming)的标准形式为:

 

sub.to  

    

    

其中,HAAeq为矩阵,f、b、beq、lb、ub、x为向量

其它形式的二次规划问题都可转化为标准形式。

MATLAB5.x版中的qp函数已被6.0版中的函数quadprog取代。

函数  quadprog

格式  x = quadprog(H,f,A,b)   %其中H,f,A,b为标准形中的参数,x为目标函数的最小值。

x = quadprog(H,f,A,b,Aeq,beq)   %Aeq,beq满足等约束条件

x = quadprog(H,f,A,b,Aeq,beq,lb,ub)   % lb,ub分别为解x的下界与上界。

x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)   %x0为设置的初值

x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)   % options为指定的优化参数

[x,fval] = quadprog()   %fval为目标函数最优值

[x,fval,exitflag] = quadprog()   % exitflag与线性规划中参数意义相同

[x,fval,exitflag,output] = quadprog()   % output与线性规划中参数意义相同

[x,fval,exitflag,output,lambda] = quadprog()   % lambda与线性规划中参数意义相同

5-8  求解下面二次规划问题

 

sub.to 

 

 

 

 

解:

则,,

MATLAB中实现如下:

>>H = [1 -1; -1 2] ;

>>f = [-2; -6];

>>A = [1 1; -1 2; 2 1];

>>b = [2; 2; 3];

>>lb = zeros(2,1);

>>[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[ ],[ ],lb)

结果为:

x =     %最优解

    0.6667

    1.3333

fval =     %最优值

   -8.2222

exitflag =    %收敛

     1

output = 

       iterations: 3

        algorithm: 'medium-scale: active-set'

    firstorderopt: [ ]

     cgiterations: [ ]

lambda = 

      lower: [2x1 double]

      upper: [2x1 double]

      eqlin: [0x1 double]

    ineqlin: [3x1 double]

>> lambda.ineqlin

ans =

    3.1111

    0.4444

         0

>> lambda.lower

ans =

     0

     0

说明  第12个约束条件有效,其余无效。

例5-9  求二次规划的最优解

max   f (x1, x2)=x1x2+3

sub.to    x1+x2-2=0

解:化成标准形式: 

 

sub.to    x1+x2=2

在Matlab中实现如下:

>>H=[0,-1;-1,0];

>>f=[0;0];

>>Aeq=[1 1];

>>b=2;

>>[x,fval,exitflag,output,lambda] = quadprog(H,f,[ ],[ ],Aeq,b)

结果为:

x =

    1.0000

    1.0000

fval =

   -1.0000

exitflag =

     1

output = 

    firstorderopt: 0

       iterations: 1

     cgiterations: 1

        algorithm: [1x58 char]

lambda = 

      eqlin: 1.0000

    ineqlin: [ ]

      lower: [ ]

      upper: [ ]

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
8天前
|
机器学习/深度学习 算法 调度
基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出规划路径结果和满载率
基于ACO蚁群优化的VRPSD问题求解MATLAB仿真,输出ACO优化的收敛曲线、规划路径结果及每条路径的满载率。在MATLAB2022a版本中运行,展示了优化过程和最终路径规划结果。核心程序通过迭代搜索最优路径,更新信息素矩阵,确保找到满足客户需求且总行程成本最小的车辆调度方案。
|
14天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。
|
17天前
|
机器学习/深度学习 算法 调度
基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出规划路径结果和满载率
该程序基于ACO蚁群优化算法解决VRPSD问题,使用MATLAB2022a实现,输出优化收敛曲线及路径规划结果。ACO通过模拟蚂蚁寻找食物的行为,利用信息素和启发式信息指导搜索,有效求解带时间窗约束的车辆路径问题,最小化总行程成本。
|
15天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。
|
30天前
|
算法
基于粒子群算法的分布式电源配电网重构优化matlab仿真
本研究利用粒子群算法(PSO)优化分布式电源配电网重构,通过Matlab仿真验证优化效果,对比重构前后的节点电压、网损、负荷均衡度、电压偏离及线路传输功率,并记录开关状态变化。PSO算法通过迭代更新粒子位置寻找最优解,旨在最小化网络损耗并提升供电可靠性。仿真结果显示优化后各项指标均有显著改善。
|
25天前
|
机器学习/深度学习 算法 数据挖掘
基于GWO灰狼优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
本项目展示了基于分组卷积神经网络(GroupCNN)和灰狼优化(GWO)的时间序列回归预测算法。算法运行效果良好,无水印展示。使用Matlab2022a开发,提供完整代码及详细中文注释。GroupCNN通过分组卷积减少计算成本,GWO则优化超参数,提高预测性能。项目包含操作步骤视频,方便用户快速上手。
|
26天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于WOA鲸鱼优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
本项目展示了一种基于WOA优化的GroupCNN分组卷积网络时间序列预测算法。使用Matlab2022a开发,提供无水印运行效果预览及核心代码(含中文注释)。算法通过WOA优化网络结构与超参数,结合分组卷积技术,有效提升预测精度与效率。分组卷积减少了计算成本,而WOA则模拟鲸鱼捕食行为进行优化,适用于多种连续优化问题。
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
该算法结合了遗传算法(GA)与分组卷积神经网络(GroupCNN),利用GA优化GroupCNN的网络结构和超参数,提升时间序列预测精度与效率。遗传算法通过模拟自然选择过程中的选择、交叉和变异操作寻找最优解;分组卷积则有效减少了计算成本和参数数量。本项目使用MATLAB2022A实现,并提供完整代码及视频教程。注意:展示图含水印,完整程序运行无水印。
|
1月前
|
算法 数据挖掘
基于粒子群优化算法的图象聚类识别matlab仿真
该程序基于粒子群优化(PSO)算法实现图像聚类识别,能识别0~9的数字图片。在MATLAB2017B环境下运行,通过特征提取、PSO优化找到最佳聚类中心,提高识别准确性。PSO模拟鸟群捕食行为,通过粒子间的协作优化搜索过程。程序包括图片读取、特征提取、聚类分析及结果展示等步骤,实现了高效的图像识别。