精华内容
下载资源
问答
  • MATLAB 求函数极值的内置函数一览表 收集了几乎所有的 MATLAB 内置的优化函数,可收藏,需要时查阅。 文章目录MATLAB 求函数极值的内置函数一览表简介概览求函数极值(或最大值最小值)求零点(解方程)最小二乘...

    MATLAB 求函数极值的内置函数一览表

    收集了几乎所有的 MATLAB 内置的优化函数,可收藏,需要时查阅。

    简介

    优化问题主要包括三个方面:求一个函数的最大值最小值、求函数零点(解方程)、最小二乘问题。这三个问题,本质上看,是一个问题。求极值,就相当于是找导函数的零点。解方程,如果把右端项挪到左边去,本质上也是求函数的零点。最小二乘问题,是一个最小化残值范数的求极值问题,求极值问题,本质是求零点问题。

    因此,所有的优化问题,本质就是在解方程,无可厚非。我们再把求极值问题细分一下,如果是带约束的,一般叫约束优化问题,如果不带约束的,一般叫无约束优化问题。如果是线性的优化问题,我们也叫线性规划。如果是非线性的优化问题,我们也叫非线性规划。如此,就把带或者不带约束的求函数极值细化成了最优化与运筹的问题。

    我给的标题是,MATLAB 求函数极值的内置函数一览表,这个标题写得不是特别确切。第一,因为下面的内容还包括求零点和最小二乘。第二,求极值在印象里似乎就是求一个函数的最“低”点最“高”点,很少会和约束条件扯上关系,所以不谈规划问题或者说优化问题,似乎有失偏颇。但是,和很多工科的同学聊天,他们似乎并不在意你这个东西叫什么,他给你的问题就是找自变量最小化一个函数,管你是非线性规划,还是无约束优化,能把他的问题解决就好了,并不太在意你的工具叫什么。潜意识里,他们认为 “能抓住老鼠的才是好猫”,你给他们扯优化,扯规划,他们反而并不能很好地理解。所以,我给出这个 “函数极值” 的说法,就很亲民了,更加容易让被人搜索到,从而进来查阅和学习。

    相关的数学原理和别的延伸的一些东西在这篇博文中不解释,如有兴趣,请参考我其他的文章,链接如下。

    数据科学和机器学习中的优化理论与算法(上)

    数据科学和机器学习中的优化理论与算法(下)

    共轭梯度(CG)算法

    共轭梯度方法(CG)MATLAB编程及其和Gauss_Seidel方法的一个比较

    Jacobi迭代、Gauss_Seidel迭代和最佳因子SOR迭代的比较

    交替方向乘子法(ADMM)的数学基础

    方程组求解的直接法与迭代法实现

    分布式优化和去中心化优化概述

    图像与视频处理中的优化方法

    约束优化问题的罚函数求解方法

    粒子群优化算法与遗传脚本

    求解非约束优化问题的拟牛顿方法(BFGS、DFP)

    从矩阵乘法来看-O优化和ijk执行顺序对程序性能的影响

    使用MATLAB 进行非线性拟合

    遗传算法程序示例

    BP神经网络代码示例

    方程组求解的切比雪夫半迭代加速方法

    使用BP神经网络做预测

    数学建模模拟退火法MATLAB程序参考模板

    机器学习算法概括

    最优控制与深度学习

    函数型数据主成分分析(FPCA)

    信赖域狗腿(dogleg)方法

    函数型数据主成分分析

    浅谈大数据和深度学习和计算数学的一点关系

    用深度学习求解高维偏微分方程

    A*算法:Dijkstra改进算法

    深度学习中的一些基本概念

    PCA算法的数学推导及其简单算例

    keras入门实例:非线性拟合求拟合系数

    自然语言处理之情感分析实战(分类问题)

    求极小值的线搜索方法应用(SD,Newton)

    Matlab使用的一点小体会(不定时扩充修缮,琐碎东西存档)

    解方程组的列主元高斯消元法和Cholesky分解

    matlab偏最小二乘法及其检验

    Cache 结构对程序性能的影响

    机器学习入门实战——使用回归技术预测房价

    matlab做三维线性拟合(多元线性回归,准确来说不叫插值)

    基于主元素思想的Householder正交法解(矛盾)方程组

    R语言做回归分析

    DEA(数据包络分析)程序模板

    从几个lingo的示例来看lingo在运筹学当中的使用

    matlab入门练习之杂例二

    一个DEA程序模板

    matlab中fmincon函数的使用

    概览

    我把我能想到的 MATLAB 中这类优化问题相关的函数都列举如下,后面我会一一进行解释。如果有遗漏的,欢迎大家在评论区补充。以下的分类只是我的臆想,前面说了,这三类问题,可以互相转化,所以不要太在意分类的问题。

    求函数极值(或最大值最小值)

    • fminbnd

    • fmincon(interior-point、trust-region-reflective、sqp、sqp-legacy、active-set)

    • fminunc(quasi-newton、trust-region)

    • fminsearch

    • fminimax

    • linprog(dual-simplex、interior-point-legacy、interior-point)

    • quadprog(interior-point-convex、trust-region-reflective、active-set)

    • fgoalattain

    • fseminf

    • patternsearch

    求零点(解方程)

    • fsolve(trust-region-dogleg、trust-region、levenberg-marquardt)
    • fzero
    • ga
    • gamultiobj
    • simulannealbnd

    最小二乘问题

    • lsqcurvefit(trust-region-reflective、levenberg-marquardt)
    • lsqlin(interior-point、trust-region-reflective、active-set)
    • lsqnonlin (trust-region-reflective、levenberg-marquardt)
    • lsqcurvefit
    • Isqnonneg

    求极值

    fminbnd:单变量

    查找单变量函数在定区间上的最小值
    用法示例:

    fun = @sin;
    x1 = 0;
    x2 = 2*pi;
    x = fminbnd(fun,x1,x2)
    

    这个函数可以自定义。

    fmincon:约束、非线性、多变量

    寻找约束非线性多变量函数的最小值。非线性规求解器。求次下问题的最小值:
    min ⁡ x f ( x )  such that  { c ( x ) ≤ 0 c e q ( x ) = 0 A ⋅ x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b , \min _{x} f(x) \text { such that }\left\{\begin{aligned} c(x) & \leq 0 \\ c e q(x) &=0 \\ A \cdot x & \leq b \\ A e q \cdot x &=b e q \\ l b & \leq x \leq u b, \end{aligned}\right. xminf(x) such that c(x)ceq(x)AxAeqxlb0=0b=beqxub,

    用法示例:

    fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
    x0 = [-1,2];
    A = [1,2];
    b = 1;
    x = fmincon(fun,x0,A,b)
    

    算法选择

    fmincon 有五个算法选项:

    • ‘interior-point’(默认值)
    • ‘trust-region-reflective’
    • ‘sqp’
    • ‘sqp-legacy’
    • ‘active-set’

    ‘interior-point’ 处理大型稀疏问题以及小型稠密问题。该算法在所有迭代中都满足边界,并且可以从 NaN 或 Inf 结果中恢复。‘sqp’ 在所有迭代中都满足边界。该算法可以从 NaN 或 Inf 结果中恢复。‘sqp-legacy’ 类似于 ‘sqp’,但通常速度更慢且占用的内存更多。‘active-set’ 可以采用大步长,从而提高速度。该算法对一些具有非平滑约束的问题很有效。 ‘trust-region-reflective’ 要求您提供梯度,并且只允许边界或线性等式约束,但不能同时使用两者。在这些限制下,该算法可以高效处理大型稀疏问题和小型稠密问题。该算法可以使用特殊方法来节省内存使用量,例如 Hessian 矩阵乘法函数。

    fminunc:无约束、多变量

    求无约束多变量函数的最小值。

    用法示例:

    fun = @(x)3*x(1)^2 + 2*x(1)*x(2) + x(2)^2 - 4*x(1) + 5*x(2);
    x0 = [1,1];
    [x,fval] = fminunc(fun,x0)
    

    算法选择

    fminunc 有两种算法:

    • ‘quasi-newton’(默认值)
    • ‘trust-region’

    如果您的目标函数包括梯度,请使用 ‘Algorithm’ = ‘trust-region’,并将 SpecifyObjectiveGradient 选项设置为 true。否则,请使用 ‘Algorithm’ = ‘quasi-newton’。

    fminsearch:无约束、多变量、无导数

    使用无导数法计算无约束多变量函数的最小值。

    用法示例:

    fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
    x0 = [-1.2,1];
    x = fminsearch(fun,x0)
    

    linprog:线性规划

    求解线性规划问题。求以下问题的最小值:
    min ⁡ x f T x  such that  { A ⋅ x ≤ b , A e q ⋅ x = b e q , l b ≤ x ≤ u b . \min _{x} f^{T} x \text { such that }\left\{\begin{aligned} A \cdot x & \leq b, \\ A e q \cdot x &=b e q, \\ l b & \leq x \leq u b . \end{aligned}\right. xminfTx such that AxAeqxlbb,=beq,xub.

    用法示例:

    A = [1 1
        1 1/4
        1 -1
        -1/4 -1
        -1 -1
        -1 1];
    
    b = [2 1 2 1 -1 2];
    f = [-1 -1/3];
    
    x = linprog(f,A,b)
    

    线性规划指的是约束是线性的,目标函数也是线性的。

    算法选择

    linprog 有三种算法:

    • ‘dual-simplex’,默认值
    • ‘interior-point-legacy’
    • ‘interior-point’

    首先使用 ‘dual-simplex’ 算法或 ‘interior-point’ 算法。通常,‘dual-simplex’ 和 ‘interior-point’ 算法速度快且占用的内存最少。‘interior-point-legacy’ 算法类似于 ‘interior-point’,但 ‘interior-point-legacy’ 可能速度较慢、稳健性较差或占用内存较多。

    quadprog:二次规划

    二次规划。quadprog 求由下式指定的问题的最小值

    min ⁡ x 1 2 x T H x + f T x  such that  { A ⋅ x ≤ b , A e q ⋅ x = b e q , l b ≤ x ≤ u b . \min _{x} \frac{1}{2} x^{T} H x+f^{T} x \text { such that }\left\{\begin{aligned} A \cdot x \leq b, \\ A e q \cdot x &=b e q, \\ l b & \leq x \leq u b . \end{aligned}\right. xmin21xTHx+fTx such that Axb,Aeqxlb=beq,xub.

    用法示例:

    H = [1 -1; -1 2]; 
    f = [-2; -6];
    A = [1 1; -1 2; 2 1];
    b = [2; 2; 3];
    
    [x,fval,exitflag,output,lambda] = ...
       quadprog(H,f,A,b);
    
    

    算法选择

    quadprog 有三种算法:

    • ‘interior-point-convex’(默认值)
    • ‘trust-region-reflective’
    • ‘active-set’

    如果您遇到凸问题,或不知道您的问题是否为凸问题,请使用 ‘interior-point-convex’。当您的 Hessian 矩阵 H 包含大量非零项时,为了获得更好的性能,请将 H 指定为普通的双精度矩阵。同样,为了在 H 的非零项相对较少时获得更好的性能,请将 H 指定为稀疏矩阵。如果您的非凸问题只有边界或只有线性等式约束,请使用 ‘trust-region-reflective’。如果您有具有大量线性约束而没有大量变量的半正定问题,请尝试 ‘active-set’。

    fminimax:minmax 问题

    求解 minimax 约束问题。

    用法示例:

    t = linspace(-pi,pi);
    plot(t,sin(t),'r-')
    hold on
    plot(t,cos(t),'b-');
    plot(t,max(sin(t),cos(t)),'ko')
    legend('sin(t)','cos(t)','max(sin(t),cos(t))','Location','NorthWest')
    
    fun = @(x)[sin(x);cos(x)];
    x0 = 1;
    x1 = fminimax(fun,x0)
    
    x0 = -2;
    x2 = fminimax(fun,x0)
    

    fgoalattain:目标达到

    求解涉及多目标的目标达到问题。fgoalattain 求解目标达到问题,这是多目标优化问题最小化的一种表示。fgoalattain 求以下问题的最小值:

    minimize ⁡ x , γ γ  such that  { F ( x ) −  weight  ⋅ γ ≤  goal  c ( x ) ≤ 0 c e q ( x ) = 0 A ⋅ x ≤ b  Aeq  ⋅ x =  beq  l b ≤ x ≤ u b . \underset{x, \gamma}{\operatorname{minimize}} \gamma \text { such that }\left\{\begin{aligned} F(x)-\text { weight } \cdot \gamma & \leq \text { goal } \\ c(x) & \leq 0 \\ c e q(x) &=0 \\ A \cdot x & \leq b \\ \text { Aeq } \cdot x &=\text { beq } \\ l b & \leq x \leq u b . \end{aligned}\right. x,γminimizeγ such that F(x) weight γc(x)ceq(x)Ax Aeq xlb goal 0=0b= beq xub.

    用法示例:

    fun = @(x)[2+(x-3)^2;5+x^2/4];
    goal = [3,6];
    weight = [1,1];
    x0 = 1;
    x = fgoalattain(fun,x0,goal,weight)
    
    fun(x)
    

    fseminf:半无限约束、非线性、多变量

    求解半无限约束多变量非线性函数的最小值。求以下问题的最小值:
    min ⁡ x f ( x )  such that  { A ⋅ x ≤ b , A e q ⋅ x = b e q , l b ≤ x ≤ u b , c ( x ) ≤ 0 , c e q ( x ) = 0 , K i ( x , w i ) ≤ 0 , 1 ≤ i ≤ n . \min _{x} f(x) \text { such that }\left\{\begin{aligned} A \cdot x & \leq b, \\ A e q \cdot x &=b e q, \\ l b & \leq x \leq u b, \\ c(x) & \leq 0, \\ c e q(x) &=0, \\ K_{i}\left(x, w_{i}\right) & \leq 0,1 \leq i \leq n . \end{aligned}\right. xminf(x) such that AxAeqxlbc(x)ceq(x)Ki(x,wi)b,=beq,xub,0,=0,0,1in.

    用法示例:

    objfun = @(x)(x-1)^2;
    x0 = 0.2;
    ntheta = 1;
    x = fseminf(objfun,x0,ntheta,@seminfcon)
    
    function [c, ceq, K1, s] = seminfcon(x,s)
    
    % No finite nonlinear inequality and equality constraints
    c = [];
    ceq = [];
    
    % Sample set
    if isnan(s)
        % Initial sampling interval
        s = [0.01 0];
    end
    t = 0:s(1):1;
    
    % Evaluate the semi-infinite constraint
    K1 = (x - 0.5) - (t - 0.5).^2;
    end
    

    patternsearch:模式搜索

    使用模式搜索寻找最小值。

    用法示例:

    fun = @psobj;
    x0 = [0,0];
    x = patternsearch(fun,x0)
    function y = psobj(x)
    y = exp(-x(1)^2-x(2)^2)*(1+5*x(1) + 6*x(2) + 12*x(1)*cos(x(2)));
    

    ga:遗传算法

    使用遗传算法找函数的最小值。

    用法示例:

    xi = linspace(-6,2,300);
    yi = linspace(-4,4,300);
    [X,Y] = meshgrid(xi,yi);
    Z = ps_example([X(:),Y(:)]);
    Z = reshape(Z,size(X));
    surf(X,Y,Z,'MeshStyle','none')
    colormap 'jet'
    view(-26,43)
    xlabel('x(1)')
    ylabel('x(2)')
    title('ps\_example(x)')
    
    rng default % For reproducibility
    x = ga(@ps_example,2)
    

    gamultiobj:遗传算法、帕累托前沿

    使用遗传算法找到多个适应度函数的帕累托前沿。

    用法示例:

    fitnessfcn = @(x)[norm(x)^2,0.5*norm(x(:)-[2;-1])^2+2];
    rng default % For reproducibility
    x = gamultiobj(fitnessfcn,2);
    plot(x(:,1),x(:,2),'ko')
    xlabel('x(1)')
    ylabel('x(2)')
    title('Pareto Points in Parameter Space')
    

    simulannealbnd:模拟退火

    使用模拟退火法找到函数的最小值。

    用法示例:

    dejong5fcn
    
    fun = @dejong5fcn;
    x0 = [0 0];
    x = simulannealbnd(fun,x0)
    

    求零点

    fsolve:非线性、方程组

    非线性方程组求解器。

    用法示例:

    fun = @root2d;
    x0 = [0,0];
    x = fsolve(fun,x0)
    
    function F = root2d(x)
    F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
    F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;
    

    算法选择

    fsolve 有三种算法:

    • ‘trust-region-dogleg’(默认值)
    • ‘trust-region’
    • ‘levenberg-marquardt’

    ‘trust-region-dogleg’ 是唯一专门设计为用于求解非线性方程的算法。其他算法尝试最小化函数的平方和。‘trust-region’ 算法对稀疏问题有效。对于大规模问题,它可以使用特殊方法,如 Jacobian 矩阵乘法函数。

    fzero:非线性函数求根

    非线性函数的根。

    用法示例:

    fun = @sin; % function
    x0 = 3; % initial point
    x = fzero(fun,x0)
    

    最小二乘

    lsqlin:约束、线性最小二乘问题

    求解约束线性最小二乘问题。具有边界或线性约東的线性最小二乘求解器。求解以下形式的最小二乘曲线拟合问题

    min ⁡ x 1 2 ∥ C ⋅ x − d ∥ 2 2  such that  { A ⋅ x ≤ b , A e q ⋅ x = b e q , l b ≤ x ≤ u b . \min _{x} \frac{1}{2}\|C \cdot x-d\|_{2}^{2} \text { such that }\left\{\begin{aligned} A \cdot x & \leq b, \\ A e q \cdot x &=b e q, \\ l b & \leq x \leq u b . \end{aligned}\right. xmin21Cxd22 such that AxAeqxlbb,=beq,xub.

    用法示例:

    C = [0.9501    0.7620    0.6153    0.4057
        0.2311    0.4564    0.7919    0.9354
        0.6068    0.0185    0.9218    0.9169
        0.4859    0.8214    0.7382    0.4102
        0.8912    0.4447    0.1762    0.8936];
    d = [0.0578
        0.3528
        0.8131
        0.0098
        0.1388];
    A = [0.2027    0.2721    0.7467    0.4659
        0.1987    0.1988    0.4450    0.4186
        0.6037    0.0152    0.9318    0.8462];
    b = [0.5251
        0.2026
        0.6721];
    
    
    x = lsqlin(C,d,A,b)
    

    算法选择

    lsqlin 有三种算法:

    • ‘interior-point’,默认值
    • ‘trust-region-reflective’
    • ‘active-set’

    首先尝试 ‘interior-point’。当您的输入矩阵 C 包含大量非零项时,为了获得更好的性能,请将 C 指定为普通的双精度矩阵。同样,为了在 C 的非零项相对较少时获得更好的性能,请将 C 指定为稀疏矩阵。如果您没有约束或只有边界约束,并且需要更高的准确度、更快的速度或要使用 Jacobian Multiply Function with Linear Least Squares,请尝试 ‘trust-region-reflective’。如果您有大量的线性约束而没有大量的变量,请尝试 ‘active-set’。

    lsqnonlin:非线性最小二乘问题

    求解非线性最小二乘(非线性数据拟合)问题。求解具有以下形式的非线性最小二乘曲线拟合问题

    min ⁡ x ∥ f ( x ) ∥ 2 2 = min ⁡ x ( f 1 ( x ) 2 + f 2 ( x ) 2 + … + f n ( x ) 2 ) \min _{x}\|f(x)\|_{2}^{2}=\min _{x}\left(f_{1}(x)^{2}+f_{2}(x)^{2}+\ldots+f_{n}(x)^{2}\right) xminf(x)22=xmin(f1(x)2+f2(x)2++fn(x)2)

    用法示例:

    rng default % for reproducibility
    d = linspace(0,3);
    y = exp(-1.3*d) + 0.05*randn(size(d));
    
    fun = @(r)exp(-d*r)-y;
    
    x0 = 4;
    x = lsqnonlin(fun,x0)
    

    lsqnonlin有两种算法:

    • ‘trust-region-reflective’(默认值)
    • ‘levenberg-marquardt’

    通常,先尝试 ‘trust-region-reflective’。如果您的问题有边界,您必须使用 ‘trust-region-reflective’。如果您的问题没有边界并且欠定(方程数少于维数),请使用 ‘levenberg-marquardt’。

    lsqcurvefit:非线性拟合

    用最小二乘求解非线性曲线拟合(数据拟合)问题。

    用法示例:

    xdata = ...
     [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
    ydata = ...
     [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];
    
    fun = @(x,xdata)x(1)*exp(x(2)*xdata);
    
    x0 = [100,-1];
    x = lsqcurvefit(fun,x0,xdata,ydata)
    

    算法选择

    lsqcurvefit 有两种算法:

    • ‘trust-region-reflective’(默认值)
    • ‘levenberg-marquardt’

    通常,先尝试 ‘trust-region-reflective’。如果您的问题有边界,您必须使用 ‘trust-region-reflective’。如果您的问题没有边界并且欠定(方程数少于维数),请使用 ‘levenberg-marquardt’。

    lsqnonneg:最小二乘问题,非负

    求解非负线性最小二乘问题。求解文下形式的非负最小二乘曲线拟合问题

    KaTeX parse error: Can't use function '$' in math mode at position 33: …t x-d\|_{2}^{2}$̲, where $x \geq…

    用法示例:

    C = [0.0372    0.2869
         0.6861    0.7071
         0.6233    0.6245
         0.6344    0.6170];
     
    d = [0.8587
         0.1781
         0.0747
         0.8405];
    
    x = lsqnonneg(C,d)
    
    xunc = C\d
    constrained_norm = norm(C*x - d)
    unconstrained_norm = norm(C*xunc - d)
    

    最后的讨论

    撤了这么多不相干的,好,现在回归正题,MATLAB 如何求极值?这么多函数选择哪一个呢?

    单变量问题直接用 fminbnd。线性规划用 linprog。二次规划用 quadprog。其他约束规划用 fmincon。特殊的问题,用 fminimax、fgoalattain、fseminf、patternsearch、ga、gamultiobj、simulannealbnd。fminunc::无约束、多变量。fminsearch:无约束、多变量、无导数。

    我自以为是地画图,如下所示。图画得很辛苦,支持的老铁给个点赞收藏关注三连。

    线性规划
    二次规划
    其他
    是否特定问题
    其他
    minmax
    半无限约束
    目标达到
    遗传,模拟退火,模式搜索
    是否单变量
    是否有约束
    规划问题
    linprog
    quadprog
    fmincon
    是否有导数
    fminunc
    fminsearch
    fminbnd
    展开全文
  • function [ROUTES,PL,Tau]=ACASP(G,Tau,K,M,S,E,Alpha,Beta,Rho,Q)%% ---------------------------------------------------------------% ACASP.m%蚁群算法动态寻路算法% ChengAihua,PLA Information Engineering ...

    function [ROUTES,PL,Tau]=ACASP(G,Tau,K,M,S,E,Alpha,Beta,Rho,Q)

    %% ---------------------------------------------------------------

    % ACASP.m

    %蚁群算法动态寻路算法% ChengAihua,PLA Information Engineering University,ZhengZhou,China

    % Email:aihuacheng@gmail.com

    % All rights reserved

    %% ---------------------------------------------------------------

    %输入参数列表% G地形图为01矩阵,如果为1表示障碍物% Tau初始信息素矩阵(认为前面的觅食活动中有残留的信息素)% K迭代次数(指蚂蚁出动多少波)% M蚂蚁个数(每一波蚂蚁有多少个)% S起始点(最短路径的起始点)% E终止点(最短路径的目的点)% Alpha表征信息素重要程度的参数% Beta表征启发式因子重要程度的参数% Rho信息素蒸发系数% Q信息素增加强度系数%

    %输出参数列表% ROUTES每一代的每一只蚂蚁的爬行路线% PL每一代的每一只蚂蚁的爬行路线长度% Tau输出动态修正过的信息素%% --------------------变量初始化----------------------------------

    %load

    D=G2D(G);

    N=size(D,1);%N表示问题的规模(象素个数)MM=size(G,1);

    a=1;%小方格象素的边长Ex=a*(mod(E,MM)-0.5);%终止点横坐标if Ex==-0.5

    Ex=MM-0.5;

    end

    Ey=a*(MM+0.5-ceil(E/MM));%终止点纵坐标Eta=zeros(1,N);%启发式信息,取为至目标点的直线距离的倒数%下面构造启发式信息矩阵for i=1:N

    if ix==-0.5

    ix=MM-0.5;

    end

    iy=a*(MM+0.5-ceil(i/MM));

    if i~=E

    Eta(1,i)=1/((ix-Ex)^2+(iy-Ey)^2)^0.5;

    else

    Eta(1,i)=100;

    end

    end

    ROUTES=cell(K,M);%用细胞结构存储每一代的每一只蚂蚁的爬行路线PL=zeros(K,M);%用矩阵存储每一代的每一只蚂蚁的爬行路线长度%% -----------启动K轮蚂蚁觅食活动,每轮派出M只蚂蚁--------------------

    for k=1:K

    disp(k);

    for m=1:M

    %%第一步:状态初始化W=S;%当前节点初始化为起始点Path=S;%爬行路线初始化PLkm=0;%爬行路线长度初始化TABUkm=ones(1,N);%禁忌表初始化TABUkm(S)=0;%已经在初始点了,因此要排除DD=D;%邻接矩阵初始化%%第二步:下一步可以前往的节点DW=DD(W,:);

    DW1=find(DW

    for j=1:length(DW1)

    if TABUkm(DW1(j))==0

    DW(j)=inf;

    end

    end

    LJD=find(DW

    Len_LJD=length(LJD);%可选节点的个数%%觅食停止条件:蚂蚁未遇到食物或者陷入死胡同while W~=E&&Len_LJD>=1

    %%第三步:转轮赌法选择下一步怎么走PP=zeros(1,Len_LJD);

    for i=1:Len_LJD

    PP(i)=(Tau(W,LJD(i))^Alpha)*(Eta(LJD(i))^Beta);

    end

    PP=PP/(sum(PP));%建立概率分布Pcum=cumsum(PP);

    Select=find(Pcum>=rand);

    %%第四步:状态更新和记录Path=[Path,to_visit];%路径增加PLkm=PLkm+DD(W,to_visit);%路径长度增加W=to_visit;%蚂蚁移到下一个节点for kk=1:N

    if TABUkm(kk)==0

    DD(W,kk)=inf;

    DD(kk,W)=inf;

    end

    end

    TABUkm(W)=0;%已访问过的节点从禁忌表中删除for j=1:length(DW1)

    if TABUkm(DW1(j))==0

    DW(j)=inf;

    end

    end

    LJD=find(DW

    Len_LJD=length(LJD);%可选节点的个数end

    %%第五步:记下每一代每一只蚂蚁的觅食路线和路线长度ROUTES{k,m}=Path;

    if Path(end)==E

    PL(k,m)=PLkm;

    else

    PL(k,m)=inf;

    end

    end

    %%第六步:更新信息素Delta_Tau=zeros(N,N);%更新量初始化for m=1:M

    if PL(k,m) ROUT=ROUTES{k,m};

    TS=length(ROUT)-1;%跳数PL_km=PL(k,m);

    for s=1:TS

    x=ROUT(s);

    Delta_Tau(y,x)=Delta_Tau(y,x)+Q/PL_km;

    end

    end

    end

    Tau=(1-Rho).

    展开全文
  • 一、极值和比较 在人们刚刚有意识时,就开始有意识的进行比较和最大最小值的操作...在STL中的相关的算法极值的有: std::max:求最大值 std::min:求最小值 std::minmax:求最大最小值,返回两个极值 std::max_elemen

    一、极值和比较

    在人们刚刚有意识时,就开始有意识的进行比较和最大最小值的操作,比如一个孩子很轻易的可以从一堆苹果中打出一个最大的,从好多的球中找到一个最小的。在和别人的玩耍过程中,知道谁跑得比谁快,谁长得比谁高等等。人类这种意识能不能让机器获得?有谁更好的方式和方法。
    数学给了答案,然后进一步应用到计算机中。

    二、STL算法的相关算法

    在STL中的相关的算法求极值的有:
    std::max:求最大值
    std::min:求最小值
    std::minmax:求最大最小值,返回两个极值
    std::max_element:范围内的最大值
    std::clamp:判断夹逼位置的比较
    比较相关的有:
    std::equal:判断是否相等
    std::lexicographical_compare:判断指定的字符串的比较结果
    其它更多的相关比较和极值算法可参考https://en.cppreference.com/w/cpp/algorithm。

    三、源码分析

    看一下STL中典型的相关几个函数的源码:

    template<class _FwdIt,
    	class _Pr>
    	_NODISCARD constexpr pair<_FwdIt, _FwdIt> minmax_element(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
    	{	// find smallest and largest elements, using _Pred
    	_Adl_verify_range(_First, _Last);
    	const auto _Result =
    		_Minmax_element_unchecked(_Get_unwrapped(_First), _Get_unwrapped(_Last), _Pass_fn(_Pred));
    	_Seek_wrapped(_Last, _Result.second);
    	_Seek_wrapped(_First, _Result.first);
    	return {_First, _Last};
    	}
    template<class _FwdIt,
    	class _Pr>
    	constexpr pair<_FwdIt, _FwdIt> _Minmax_element_unchecked(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
    	{	// find smallest and largest elements, using _Pred
    	pair<_FwdIt, _FwdIt> _Found(_First, _First);
    
    	if (_First != _Last)
    		{
    		while (++_First != _Last)
    			{	// process one or two elements
    			_FwdIt _Next = _First;
    			if (++_Next == _Last)
    				{	// process last element
    				if (_DEBUG_LT_PRED(_Pred, *_First, *_Found.first))
    					{
    					_Found.first = _First;
    					}
    				else if (!_DEBUG_LT_PRED(_Pred, *_First, *_Found.second))
    					{
    					_Found.second = _First;
    					}
    				}
    			else
    				{	// process next two elements
    				if (_DEBUG_LT_PRED(_Pred, *_Next, *_First))
    					{	// test _Next for new smallest
    					if (_DEBUG_LT_PRED(_Pred, *_Next, *_Found.first))
    						{
    						_Found.first = _Next;
    						}
    					if (!_DEBUG_LT_PRED(_Pred, *_First, *_Found.second))
    						{
    						_Found.second = _First;
    						}
    					}
    				else
    					{	// test _First for new smallest
    					if (_DEBUG_LT_PRED(_Pred, *_First, *_Found.first))
    						{
    						_Found.first = _First;
    						}
    					if (!_DEBUG_LT_PRED(_Pred, *_Next, *_Found.second))
    						{
    						_Found.second = _Next;
    						}
    					}
    				_First = _Next;
    				}
    			}
    		}
    
    	return (_Found);
    	}
    
    template<class _Iter1,
    	class _Iter2,
    	class _Pr> inline
    	false_type _Equal_memcmp_is_safe(const _Iter1&, const _Iter2&, const _Pr&)
    	{	// return equal optimization category for arbitrary iterators
    	return {};
    	}
    template<class _InIt1,
    	class _InIt2,
    	class _Pr> inline
    	bool _Equal_unchecked(const _InIt1 _First1, const _InIt1 _Last1,
    		const _InIt2 _First2, _Pr _Pred)
    	{	// compare [_First1, _Last1) to [_First2, ...) using _Pred, choose optimization
    	return (_Equal_unchecked1(_First1, _Last1, _First2, _Pred,
    		_Equal_memcmp_is_safe(_First1, _First2, _Pred)));
    	}
    

    msvc的库中乱七八糟的宏定义和检查参数太多,其实是不太适合看相关源码的,但这玩意儿确实是又是最容易获得的,只好如此。

    四、实例

    看一下几个相关的实例(cppreference.com):

     
    #include <algorithm>
    #include <iostream>
    #include <vector>
    #include <cmath>
     
    static bool abs_compare(int a, int b)
    {
        return (std::abs(a) < std::abs(b));
    }
     
    int main()
    {
        std::vector<int> v{ 3, 1, -14, 1, 5, 9 }; 
        std::vector<int>::iterator result;
     
        result = std::max_element(v.begin(), v.end());
        std::cout << "max element at: " << std::distance(v.begin(), result) << '\n';
     
        result = std::max_element(v.begin(), v.end(), abs_compare);
        std::cout << "max element (absolute) at: " << std::distance(v.begin(), result) << '\n';
    }
    

    运行结果:

     max element at: 5
    max element (absolute) at: 2
    

    再看一个c++17以上版本的:

     #include <cstdint>
    #include <algorithm>
    #include <iostream>
    #include <iomanip>
     
    int main()
    {
        std::cout << " raw   clamped to int8_t   clamped to uint8_t\n";
        for(int const v: {-129, -128, -1, 0, 42, 127, 128, 255, 256}) {
            std::cout << std::setw(04) << v
                      << std::setw(20) << std::clamp(v, INT8_MIN, INT8_MAX)
                      << std::setw(21) << std::clamp(v, 0, UINT8_MAX) << '\n';
        }
    }
    

    输出:

     raw   clamped to int8_t   clamped to uint8_t
    -129                -128                    0
    -128                -128                    0
      -1                  -1                    0
       0                   0                    0
      42                  42                   42
     127                 127                  127
     128                 127                  128
     255                 127                  255
     256                 127                  255
    

    再看比较相关:

    #include <algorithm>
    #include <iostream>
    #include <string_view>
     
    constexpr bool is_palindrome(const std::string_view& s)
    {
        return std::equal(s.begin(), s.begin() + s.size()/2, s.rbegin());
    }
     
    void test(const std::string_view& s)
    {
        std::cout << "\"" << s << "\" "
            << (is_palindrome(s) ? "is" : "is not")
            << " a palindrome\n";
    }
     
    int main()
    {
        test("radar");
        test("hello");
    }
    

    输出结果:

    "radar" is a palindrome
    "hello" is not a palindrome
    

    字符串比较:

    #include <algorithm>
    #include <iostream>
    #include <vector>
    #include <random>
     
    int main()
    {
        std::vector<char> v1 {'a', 'b', 'c', 'd'};
        std::vector<char> v2 {'a', 'b', 'c', 'd'};
     
        std::mt19937 g{std::random_device{}()};
        while (!std::lexicographical_compare(v1.begin(), v1.end(),
                                             v2.begin(), v2.end())) {
            for (auto c : v1) std::cout << c << ' ';
            std::cout << ">= ";
            for (auto c : v2) std::cout << c << ' ';
            std::cout << '\n';
     
            std::shuffle(v1.begin(), v1.end(), g);
            std::shuffle(v2.begin(), v2.end(), g);
        }
     
        for (auto c : v1) std::cout << c << ' ';
        std::cout << "< ";
        for (auto c : v2) std::cout << c << ' ';
        std::cout << '\n';
    }
    

    输出结果:

    a b c d >= a b c d 
    d a b c >= c b d a 
    b d a c >= a d c b 
    a c d b < c d a b
    

    以上示例均可在std::algorithm中找到。

    五、总结

    看到这里,可能大家都明白了,为什么现在好多编程的程序员,其实不会“编程”,因为大量的底层逻辑被抽象和总结成库了,这样,好多的程序编写起来就会不断的优化,最终就像c++的STL库一样,不断的迭代,眼看着就c++20,23等等了。没有什么可以多说的,认真学习,不断进步,不断超越自己,才是本分!
    在这里插入图片描述

    展开全文
  • 欢迎来到智能优化算法的世界 ????博客主页:卿云阁 ????欢迎关注????点赞????收藏⭐️留言???? ????本文由卿云阁原创! ????本阶段属于筑基阶段之一,希望各位仙友顺利完成突破 ????首发时间:????2021年12月11...

    🌞欢迎来到智能优化算法的世界 
    🌈博客主页:卿云阁

    💌欢迎关注🎉点赞👍收藏⭐️留言📝

    🌟本文由卿云阁原创!

    🌠本阶段属于筑基阶段之一,希望各位仙友顺利完成突破

    📆首发时间:🌹2021年12月11日🌹

    ✉️希望可以和大家一起完成进阶之路!

    🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
     


    目录

    0️⃣变量说明

             1️⃣基本流程 

    2️⃣函数     

    3️⃣基本原理

    4️⃣代码部分

      



    0️⃣✨✨✨变量说明✨✨✨

    f 个体适应度

    [Umin,Umax]  某变量的取值范围

    δ 编码精度


    1️⃣✨✨✨基本流程✨✨✨ 

    Step1:参数设置及种群初始化;

    Step2:适应度评价;

    Step3:轮盘赌选择;

    Step4:交叉;

    Step5:变异;

    Step6:适应度评价;

    Step7:终止条件判断,若未达到终止条件,则转到Step3;

    Step8:输出结果。


    2️⃣✨✨✨函数✨✨✨       

    1.例程GA.m为主函数,是对函数f(x,y)=x2+y2(-1<x<1,-1<y<1)求解最小值。

    2.decod.m 为子函数,实现二进制编码到十进制数的转换功能,需要同学们自行完成。decod(v,l)的输入参数v表示待转换的二进制编码,l表示二进制编码的长度。v为N×l的矩阵,其中N表示种群中的个体数,即decod.m应当可以将N个长度为l的二进制编码的个体转换为N个十进制数。


    3️⃣✨✨✨基本原理✨✨✨  

    1.遗传算法概要

    遗传算法是具有“生成+检测”的迭代过程的搜索算法。它的基本处理流程如图所示。由此流程图可见,遗传算法是一种群体型操作,该操作以群体中的所有个体为对象。选择(selection)、交叉(crossover)和变异(mutation)是遗传算法的3个主要操作算子,它们构成了所谓的遗传操作(genetic operation),使遗传算法具有了其它传统方法所没有的特性。遗传算子包含如下6个基本因素:

    1. 参数编码:由于遗传算法不能直接处理解空间的解数据,因此必须通过编码将它们表示成遗传空间的基因型串结构数据。
    2. 生成初始群体:由于遗传算法的群体型操作需要,所以必须为遗传操作准备一个由若干初始解组成的初始群体。初始群体的每个个体都是通过随机方法产生。
    3. 适应度评估检测:遗传算法在搜索进化过程中一般不需要其他外部信息,仅用适应度(fitness)值来评估个体或解的优劣,并作为以后遗传操作的依据。
    4. 选择(selection):选择或复制操作是为了从当前群体中选出优良的个体,   使它们有机会作为父代为下一代繁殖子孙。个体适应度越高,其被选择的机会就越多。此处采用与适用度成比例的概率方法进行选择。具体地说,就是首先计算群体中所有个体适应度的总和,再计算每个个体的适应度所占的比例,并以此作为相应的选择概率。
    5. 交叉操作:交叉操作是遗传算法中最主要的遗传操作。简单的交叉(即一点交叉)可分两步进行:首先对种群中个体进行随机配对;其次,在配对个体中随机设定交叉处,配对个体彼此交换部分信息。

    (6)  变异:变异操作是按位(bit)进行的,即把某一位的内容进行变异。变异操作同样也是随机进行的。一般而言,变异概率都取得较小。变异操作是十分微妙的遗传操作,它需要和交叉操作配合使用,目的是挖掘群体中个体的多样性,克服有可能限于局部解的弊病。

    2.二进制编码及解码方法

    二进制编码是遗传算法中最主要的一种编码方法,它使用的编码符号集是由二进制符号0和1所组成的二进制符号集{0,1},它所构成的个体基因型是一个二进制编码符号串。

    二进制编码符号串的长度与问题所要求的求解精度有关。假设某一参数的取值范围是[Umin,Umax],我们用长度为L的二进制编码符号串来表示该参数,则它总共能够产生种不同的编码,若使参数编码时的对应关系如下:

    00000000…00000000=0      →    Umin

      00000000…00000001=1      →    Umin+δ

           …                …    …

    111111111…11111111=2L﹣1  →    Umax


    4️⃣✨✨✨代码部分✨✨✨

    遗传算法求函数f=x+10*sin(5*x)+7*cos(4*x)的最大值

    1.要新建一个文件夹

     2.打开该文件夹,在新建脚本或函数。

      

    GA.m
    
    %基于遗传算法的函数优化 GA.m
    
    clc;
    
    clear;close all;
    
    p = rand(50,22);
    
    v = 2*rand(50,22)-1;
    
    v=hardlim(v);
    
    [N,L] = size(v); ger = 200; pc = 0.5; pm = 0.01; updatef=0;c=0;
    
    disp(sprintf('Number of generations: %d',ger));
    
    disp(sprintf('Population size: %d',N));
    
    disp(sprintf('Crossover probability: %.3f',pc));
    
    disp(sprintf('Mutation probability: %.3f',pm));
    
    f='-1*(x.^2+y.^2)';
    
    % General parameters & Initial operations
    
    sol1=1; vmfit = []; it = 1; vx = []; C = [];updatef=-10;
    
     x = decod(v(:,1:11),11); y = decod(v(:,12:end),11); fit = eval(f);
    
    % Generations
    
    t0 = clock;
    
    while it <= ger
    
    % Selection 轮盘赌
    
    for i=1:N
    
        sp(i)=(fit(i)+3)/sum(fit+3);%
    
    end
    
    for i=2:N
    
       sp(i)=sp(i-1)+sp(i);
    
    end
    
    for i=1:N
    
       p=rand(1); sindex=1;
    
       while p > sp(sindex)
    
          sindex=sindex+1; %寻找要选择个体的位置
    
       end
    
       newv(i,:)=v(sindex,:);
    
    end
    
    for i=1:N
    
       v(i,:)=newv(i,:);%用选择出的个体构成的种群替代旧的种群
    
    end
    
    % Crossver
    
    for i=1:N
    
       cindex(i)=i;
    
    end
    
    for i=1:N %产生要配对的父代的序号;经过N次顺序调换,将原有顺序打乱,使相邻两个个体作为交叉的父代
    
       point=unidrnd(N-i+1);
    
       temp=cindex(i);
    
       cindex(i)=cindex(i+point-1);
    
       cindex(i+point-1)=temp;
    
    end
    
    for i=1:2:N
    
       p=rand(1);
    
       if(p<pc)
    
          point=unidrnd(L-1)+1;%1<point<L 产生交叉点
    
          for j=point:(L-1) %交叉
    
             ch=v(cindex(i),j);
    
             v(cindex(i),j)=v(cindex(i+1),j); %cindex中相邻的两个为两个父代的序号
    
             v(cindex(i+1),j)=ch;
    
          end
    
       end
    
    end
    
    % Mutation
    
    M=rand(N,L)<=pm;%产生(N,L)维的01矩阵,为1的位置进行变异
    
    v=v-2.*(v.*M)+M;
    
    % Evaluatefitness & Evolution
    
    x = decod(v(:,1:11),11); y = decod(v(:,12:end),11); fit = eval(f);
    
    [sol1,indb1] = max(fit);
    
    if updatef>=sol1
    
       sol1=updatef;
    
       v(indb1,:)=updatec;
    
    end
    
    updatef=sol1;
    
    updatec=v(indb1,:);
    
    [sol2,indb2] = min(fit);
    
    v(indb2,:) = v(indb1,:);
    
    x = decod(v(:,1:11),11); y = decod(v(:,12:end),11); fit = eval(f);
    
    media = mean(fit);
    
    vx = [vx sol1]; vmfit = [vmfit media];
    
        if rem(it,1) == 0 | it == 10,
    
           if c~=1
    
              disp(sprintf('Gen.: %d  x: %2.5f  y: %2.5f  Av: %2.2f  f(x,y): %2.40f',it,x(indb1),y(indb1),media,sol1));
    
          else
    
              disp(sprintf('Gen.: %d   Av: %2.2f  f(x,y): %2.5f',it,media,sol1));
    
          end
    
        end;
    
        it = it + 1;
    
    end;
    
    T = etime(clock,t0); %F = flops - f0;
    
    X=x;Y=y;
    
    x = x(indb1); y = y(indb1); fx = sol1; P = v;
    
    disp(sprintf('the total time is %2.4f',T));
    
     disp(sprintf('Maximum found [f(x,y)]: [%.2f]',fx));
    
    %       xx=vx;yy=vmfit;
    
          figure(2); plot(vx,'k');
    
          title('f(x,y) x Mean'); xlabel('Generations'); ylabel('f(x,y)');
    
          hold on; plot(vmfit,'k:'); legend('best','mean',0);hold off;
    
    decod.m
    
    function x = decod(v,l)%解码子函数
    
    %********************************
    
    [length ,width]=size(v);
    
    x=zeros(1,length);
    
    for i=1:length
    
        sum=0;
    
        for j=1:l
    
            sum=sum+v(i,j)*2^(1-j);
    
        end
    
        x(i)=-1+sum+2/(2^l-1);
    
    end
    
    

    展开全文
  • f(x)=x*sin(x)+1, x属于[0,2π] 以求解f(x)的最大值和最小值问题为 例,设计针对f(x)的遗传算法程序,然后进行运行求解 (1)确定基本功能:本实验是实现f(x)的最大值和最小值的求解。 (2)对f(x)进行编码:用一...
  • 1958年澳大利亚学者Burnet率先提出了与免疫算法(Immune Algorithm, I A) 相关的理论――克隆选择原理[1] 。1973年Jer ne提出免疫系统的模型[2] , 他基于Burnet的克隆选择学说, 开创了独特型网络理论, 给出了免疫...
  • 一、蚁群算法简介 1 引言 在自然界中各种生物群体显现出来的智能近几十年来得到了学者们的广泛关注,学者们通过对简单生物体的群体行为进行模拟,进而提出了群智能算法。其中, 模拟蚁群觅食过程的蚁群优化算法(Ant ...
  • 以后可能还会用到,代码做个保存,具体实现如下:交叉,畸变,选择概率可以根据具体情况修改 import matplotlib.pyplot as plt import numpy as np import random import math # 定义遗传算法参数 pop_size = 100 #...
  • 人工智能 遗传算法 计算函数极值问题 系列文章 人工智能 倒啤酒问题 python解法 人工智能 水壶问题 python解法 A*算法之八数码问题 python解法 A*算法之野人传教士问题 python解法 文章目录人工智能 遗传算法 ...
  • 关于求函数极值,通常有二分、三分、爬山、模拟退火等。当然,不同的算法适应不同的函数类型,比如上述4种算法的前三种通常用来处理单峰函数,其中爬山算法也可以处理多峰函数,但是容易陷入局部最优解。当然,爬山...
  • 一、简介 1 前言 在遗传、选择和变异的作用下,自然界生物体优胜劣汰,不断由低级向高级进化和发展。人们注意到,适者生存的进化规律可以模式...差分进化算法是基于群体智能理论的优化算法,是通过群体内个体间的合作与
  • Fruit Fly Optimization Algorithm (FOA) for Schaffer functionFruit Fly Optimization Algorithm (FOA) implemented with Matlab, it works for Schaffer function.In this paper, a novel binary fruit fly opti....
  • 通过一个简单的例子:求解的多元函数的极值点,初步理解遗传算法
  • 网上看到了一个比较不错的讲解遗传算法的帖子,链接如下http://blog.csdn.net/b2b160/article/details/4680853但是却没有贴源代码,正好最近闲来无事,就尝试写了下代码实现,测试了几次,寻优结果都能达到了二元...
  • 遗传算法之求取函数极值 1、前言 在智能控制(刘金琨)这本里面讲了遗传算法求取函数极值的方法,这里给出一些个人理解时的注释,顺带 求解了第10章的课后习题第二题。 遗传算法流程图如下: 2、原书案例 利用遗传...
  • 实值遗传算法求解函数极值问题(基于MATLAB) 声明: 1.本文源代码来自书目《智能优化算法及其MATLAB实例(第3版)》,目的在于为MATLAB初学者提供更简明的代码解析,方便读者了解算法及MATLAB编程基本原理。 2.文中...
  • 2)基于matlab语言的函数定义 function[x0,X,iter] = steepest_descent(f,x0,tol,maxiter) df=sdf(f,x0);f_sym1='f(';df_sym='df('; fork=1:length(x0) ...f_sym1=[f_sym1,'x1(',num2str(k),'),'];...
  • #include // I2C library, gyroscope// Accelerometer ADXL345#define ACC (0x53) //ADXL345 ACC address#define A_TO_READ (6) //num of bytes we are going to read each time (two bytes for each axi...
  • 摘要: 在求解连续函数优化问题方面,一般...本文将详细介绍蚁群算法原理和模型,并改进运用到求解多峰函数极值求解中,通过MATLAB语言编程,解决实际的函数优化问题,最后通过一些仿真算例证明算法程序的有效性。...
  • 56 x_label=[]7 y_label=[]#将每一步迭代的结果存储到列表中,便于画图8 classGA(object):9 def __init__(self,length,number,lower_boundary,upper_boundary,iter_number):10 self.length = length#确定染色体编码...
  • 一、模拟退火算法简介 1 引言 模拟退火算法(Simulated Annealing,SA)的思想最早由Metropolis等人于1953年提出:Kirkpatrick于1983年第一次使用模拟退火算法求解组合最优化问题[1] 。模拟退火算法是一种基于...
  • 确定遗传在元素个体,遗传得到的个体和变异个体中选取最好的30个个体(对应的函数值最大的30个个体)作为下一次迭代的父样本。from random import randintfrom numpy import sindef decode(g):return [((g&...
  • length # 开始下一段染色体的编码 return decodedvalues Finding the mathematic function def getFitnessValue(func, chromosomesdecoded): population, nums = chromosomesdecoded.shape fitnessvalues = np....
  • 4.1案例背景\[y = {x_1}^2 + {x_2}^2...遗传算法极值寻优把训练后的 BP 神经网络预测结果作为个体适应度值,通过选择、交叉和变异操作寻找函数的全局最优值及对应输入值。网络结构:2-5-1训练数据:3900,测试数据:...
  • 用MATLAB 编制PSO 算法程序求解简单的函数极值问题一、利用PSO 算法求解目标函数最大值待求解问题为:[]5,5),2exp()21(1.2)(max 22-∈-+-=x x x x x f已知最大值大概为5在-1左右取到。编制matlab 主程序为:clc;...
  • 快速约束极值子空间跟踪算法_魏志强34 4 Vol. 34 No. 4第 卷第 期 华 北 水 利 水 电 学 院 学 报2013 8 Journal of N...
  • 最近在学习用遗传算法计算多元函数极值,在网上查到了一个经典的例子[img][/img]有许多种编程方法,但都大同小异,且得到了稳定收敛的结果。截取其中一种如下%% Do Some Cleaningclcclear all;close all;%% Set the ...
  • import itertoolsdef c(a):x=a[0][0]*a[1][1]*a[2][2]+a[0][1]*a[1][2]*a[2][0]+a[0][2]*a[1][0]*a[2][1]y=a[0][0]*a[1][2]*a[2][1]+a[0][1]*a[1][0]*a[2][2]+a[0][2]*a[1][1]*a[2][0]return x-ys=-10000r=[]for a i...
  • C++brent method布伦特方法找extrema极值算法C++brent method布伦特方法找extrema极值算法完整源码(定义,实现,main函数测试) C++brent method布伦特方法找extrema极值算法完整源码(定义,实现,main函数测试) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,744
精华内容 13,097
关键字:

去极值算法