zoukankan      html  css  js  c++  java
  • 果蝇优化算法_Fruit Fly Optimization

    1. 果蝇优化算法背景

          在夏天,果蝇是一种随处可见的昆虫。果蝇在嗅觉和视觉特别突出。腐烂的食物发出一种刺鼻的味道,温度越高这种气味的扩散速度较快,果蝇对这种味道非常敏感。腐烂的味道和食物的位置有关。一般而言,食物越近,味道越浓;反之,味道越淡。而果蝇一般都是从味道淡的地方,飞往味道浓的地方,即食物所在的方向。当它们在食物附近的时候,可以利用视觉寻找食物。基于果蝇寻找食物的行为,2011年Wen-Tsao Pan提出了果蝇优化算法(Fruit Fly Optimization)。

    2. 果蝇优化算法的数学模型

    2.1 果蝇优化算法的数学模型假设

    果蝇搜索食物分为两个阶段:
    (1) 嗅觉阶段
          这一阶段,果蝇利用嗅觉感知空气所含的味道,判断出食物的味道,并根据食物的味道浓度接近食物,这属于全局勘探过程。
    (2) 视觉阶段
          在果蝇到达食物位置附近时,果蝇开始利用视觉准确找到食物的位置,这个过程属于局部开发过程。

    2.2 果蝇优化算法

    a. 多维果蝇优化算法

    [y = x_1^2+x_2^2+x_3^3+x_4^2+x_5^2 ]

    首先,初始化5群果蝇群体,分派给这5个变量,每个群体中有10只果蝇,随机初始化果蝇的群体位置区间为([-100,100]),果蝇搜寻食物的随机飞行方向与距离区间为([-1,1]).

    2.3 Matlab代码

    % -------------------------------------------------------------------------
    % 名  称: 果蝇优化算法
    % 作  者: 潘文超
    % 代  码: 编码雪人
    % 时  间: 2021-06-05
    % 备  注: 首先, 每个变量视为一个种群, 种群规模自己设定. 
    % -------------------------------------------------------------------------
    
    %% 清空运行环境
    clc
    clear
    
    %% 定义目标函数
    fobj = @ Sphere;
    
    %% 参数定义
    Max_iter = 1000; % 最大迭代次数
    sizePop = 10;  % 种群规模
    dim = 5;   % 维数
    ub = 100;  % 变量的上界
    lb = -100; % 变量的下界
    costScore = zeros(Max_iter, 1);
    
    %% 初始化种群
    X = zeros(sizePop, dim);
    Y = zeros(sizePop, dim);
    dist = zeros(sizePop, dim);
    S = zeros(sizePop, dim);
    Fitness = zeros(sizePop, 1);
    for p=1:sizePop
        % 初始化每个果蝇群体中个体的位置
        X(p, :) = lb + (ub - lb).*rand(1, dim);
        Y(p, :) = lb + (ub - lb).*rand(1, dim);
        
        % 计算每个果蝇群体中个体的距离
        dist(p, :) = sqrt(X(p, :).^2 + Y(p, :).^2);
        
        % 果蝇个体中的味道浓度
        S(p, :) = 1./dist(p, :);
        
        % 计算适应度值
        Fitness(p, :) = fobj(S(p, :));
    end
    
    %% 找出果蝇群体中的味道浓度最高的果蝇
    [bestSmell,loc] = min(Fitness);
    new_X = X(loc, :);  % The X axis of min fitness
    new_Y = Y(loc, :);  % The Y axis of min fitness
    bestScore = bestSmell;
    bestSlove = S(loc, :);
    
    %% 主函数
    for it=1:Max_iter
        for p=1:sizePop
            % 嗅觉搜索
            X(p, :) = new_X + 2.*rand(1, dim) -1;
            Y(p, :) = new_Y + 2.*rand(1, dim) -1;
            
            dist(p, :) = sqrt(X(p, :).^2 + Y(p, :).^2);
            S(p, :) = 1./dist(p, :);
            Fitness(p, :) = fobj(S(p, :));
        end
        
        [bestSmell, loc] = min(Fitness);
        
        % 视觉搜索
        if bestSmell < bestScore
            new_X = X(loc, :);
            new_Y = Y(loc, :);
            bestScore = bestSmell;
        end
        
        costScore(it) = bestScore;
        % 输出
        disp(['----------', num2str(it), '------------']);
        disp(bestSmell);
    end
    
    %% 可视化
    figure
    axis tight
    semilogy(costScore, 'r-')
    

    目标函数

    function y = Sphere(x)
        y = sum(x.^2);
    end
    

    代码如有疑问,请留言指正。

  • 相关阅读:
    【zookpeer】Failed to check the status of the service com.xxx.UserSerivce. No provider available for
    【solr】Spring data solr Document is missing mandatory uniqueKey field: id 解决
    【ssm】springmvc-spring-mybatis框架的搭建
    【jdbc】jdbc连接池理解
    【java基础】接口的理解
    【java基础】private protect的理解
    Single Number II
    Single Number I
    Candy
    Gas Station
  • 原文地址:https://www.cnblogs.com/mysterygust/p/14828587.html
Copyright © 2011-2022 走看看