基于萤火虫算法的线性规划求解matlab程序

基于萤火虫算法的线性规划求解matlab程序

1 萤火虫算法概述

萤火虫,别名火金姑,大多数的萤火虫都会发光,因为它们体内有专门的发亮细胞,发出光亮是它们的基本能力。但是个体间存在差异,如性别、年龄、品种等,导致发出的冷光亮度是不同的。发光不仅仅是为了照明,还是为了交流、警戒、求偶等。以求偶为例,当一个雌性萤火虫发出光亮信号被异性萤火虫察觉到以后,也会通过发光来回应并向求偶者不断靠近、交流,然后交配、繁衍后代。英国剑桥大学的Yang X.S.正是受此启发,在建模萤火虫种群行为的基础上提出了FA算法。在一定范围内萤火虫可感应同伴的闪光频次、强度并判定同伴位置,FA算法正是基于此类生物行为而来。FA算法舍弃了一些生物学特点,在搜索域内仅仅依靠发光能力来寻觅周围较亮个体,并移向较亮的个体以更新位置,通过适应度函数完成算法的评价。算法的提出时间不长,对算法的改进和优化仍然处于初级阶段,但基本的FA算法足以被用来求解几乎所有领域科学和工程,如调度问题、旅行商问题、语义组成等领域。

在这里插入图片描述
FA算法的提出是建立在萤火虫种群中个体的种种社会行为的基础之上的。在具体的求解中,只考虑发光特性,萤火虫更新的关键因素是荧光亮度和吸引度。个体之间的相互吸引即为搜索操作,位置更新即为优化过程,从而获得全局最优解。将FA算法用数学语言来表述,为方便表述,只考虑关键参数,即吸引度和亮度,忽略其他次要因素,亮度代表目标函数,算法求解时需遵循以下原则:
(1)所有个体之间都可相互吸引,吸引度只由亮度、个体间距离决定。亮度强的萤火虫会吸引亮度弱的萤火虫,亮度弱的个体会移动到亮度强的个体周围。亮度大小代表了个体所处位置的好坏,最佳解即为亮度最大的个体。自然界中,光的传播介质会吸收光,影响光的传播,降低个体可视度。因此,吸引度与距离有关,距离越近,吸引度越大,反之越小。最亮个体自由移动。
(2)发光强弱与目标函数值有关,即适应度函数值。

在这里插入图片描述
FA算法的中心思想就是,所有个体都飞向比自己更亮的个体四周,飞行的最后结果就是所有的个体都围在了亮度最强的个体的四周,从而达到算法求解的目的。步骤如下:
在这里插入图片描述
FA算法属于群体智能算法,拥有此类算法的所有优势。在每一次迭代时都只需要经过位置、亮度更新等操作,没有繁琐的步骤、参数少且基本不影响算法求解,因而实现较为简单。局部搜索能力强,可以精准定位局部最优解。但是和其它算法一样,FA算法也存在一些缺点,如个体在峰值附近容易发生振荡现象、过于依赖优秀个体导致收敛速度较慢。

在这里插入图片描述
2 线性规划算例
2.1算例
在这里插入图片描述
2.2算例答案
在这里插入图片描述
3 萤火虫算法求解结果

1)迭代曲线

在这里插入图片描述
2)求解答案
在这里插入图片描述

4 matlab程序
1)主函数

%% 基于萤火虫算法的线性规划求解


clc;
clear;
close all;

%% Problem Definition
CostFunction = @(x) Rosenbrock(x);        % Cost Function
nVar = 3;                 % 变量个数
VarSize = [1 nVar];       % Decision Variables Matrix Size
%变量上下限
VarMin = 0;             % Decision Variables Lower Bound
VarMax = 15;             % Decision Variables Upper Bound

%% Firefly Algorithm Parameters

MaxIt = 300;         % Maximum Number of Iterations
nPop = 25;            % Number of Fireflies (Swarm Size)
gamma = 1;            % Light Absorption Coefficient
beta0 = 2;            % Attraction Coefficient Base Value
alpha = 0.2;          % Mutation Coefficient
alpha_damp = 0.98;    % Mutation Coefficient Damping Ratio
delta = 0.05*(VarMax-VarMin);     % Uniform Mutation Range
m = 2;
if isscalar(VarMin) && isscalar(VarMax)
    dmax = (VarMax-VarMin)*sqrt(nVar);
else
    dmax = norm(VarMax-VarMin);
end

%% Initialization
% Empty Firefly Structure
firefly.Position = [];
firefly.Cost = [];
% Initialize Population Array
pop = repmat(firefly, nPop, 1);
% Initialize Best Solution Ever Found
BestSol.Cost = inf;
% Create Initial Fireflies
for i = 1:nPop
   pop(i).Position = unifrnd(VarMin, VarMax, VarSize);
   pop(i).Cost = CostFunction(pop(i).Position);
   
   if pop(i).Cost <= BestSol.Cost
       BestSol = pop(i);
   end
end
% Array to Hold Best Cost Values
BestCost = zeros(MaxIt, 1);

%% Firefly Algorithm Main Loop
for it = 1:MaxIt    
    newpop = repmat(firefly, nPop, 1);
    for i = 1:nPop
        newpop(i).Cost = inf;
        for j = 1:nPop
            if pop(j).Cost < pop(i).Cost
                rij = norm(pop(i).Position-pop(j).Position)/dmax;
                beta = beta0*exp(-gamma*rij^m);
                e = delta*unifrnd(-1, +1, VarSize);
                %e = delta*randn(VarSize);
                
                newsol.Position = pop(i).Position ...
                                + beta*rand(VarSize).*(pop(j).Position-pop(i).Position) ...
                                + alpha*e;
                
                newsol.Position = max(newsol.Position, VarMin);
                newsol.Position = min(newsol.Position, VarMax);
                
                newsol.Cost = CostFunction(newsol.Position);
                
                if newsol.Cost <= newpop(i).Cost
                    newpop(i) = newsol;
                    if newpop(i).Cost <= BestSol.Cost
                        BestSol = newpop(i);
                    end
                end
                
            end
        end
    end
    
    % Merge
    pop = [pop
         newpop];  %#ok    
    % Sort
    [~, SortOrder] = sort([pop.Cost]);
    pop = pop(SortOrder);    
    % Truncate
    pop = pop(1:nPop);    
    % Store Best Cost Ever Found
    BestCost(it) = BestSol.Cost;    
    % Show Iteration Information
    disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);    
    % Damp Mutation Coefficient
    alpha = alpha*alpha_damp;
    
end

%% Results
figure;
plot(BestCost, 'LineWidth', 2);
% semilogy(BestCost, 'LineWidth', 2);
xlabel('Iteration');
ylabel('Best Cost');

disp('输出结果')
disp('最优变量')
newsol.Position
disp('最优结果')
BestSol.Cost

。。。。。略


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
萤火虫算法是一种基于自然界萤火虫行为的启发式优化算法,用于解决优化问题。它模拟了萤火虫的交互行为,通过光强度和吸引度来调整萤火虫的移动方向,从而找到最优解。 路径规划是指在给定起点和终点的情况下,确定一条最优路径以满足特定的约束条件。萤火虫算法可以应用于路径规划问题,通过优化萤火虫的移动策略来寻找最优路径。 以下是基于萤火虫算法的路径规划的示例代码: ```python # 导入必要的库 import numpy as np # 定义萤火虫类 class Firefly: def __init__(self, position): self.position = position self.intensity = 0 def __str__(self): return f"Position: {self.position}, Intensity: {self.intensity}" # 定义路径规划函数 def path_planning(start, end, num_fireflies, max_iterations): # 初始化萤火虫群体 fireflies = [Firefly(start) for _ in range(num_fireflies)] # 迭代更新萤火虫位置和亮度 for _ in range(max_iterations): for i in range(num_fireflies): for j in range(num_fireflies): if fireflies[j].intensity > fireflies[i].intensity: # 计算吸引度 attractiveness = calculate_attractiveness(fireflies[i], fireflies[j]) # 更新位置 fireflies[i].position += attractiveness * (fireflies[j].position - fireflies[i].position) # 更新亮度 fireflies[i].intensity = calculate_intensity(fireflies[i]) # 选择最优路径 best_firefly = max(fireflies, key=lambda x: x.intensity) best_path = best_firefly.position return best_path # 计算吸引度 def calculate_attractiveness(firefly1, firefly2): distance = np.linalg.norm(firefly1.position - firefly2.position) attractiveness = 1 / (1 + distance) return attractiveness # 计算亮度 def calculate_intensity(firefly): intensity = np.linalg.norm(firefly.position) return intensity # 示例使用 start = np.array([0, 0]) end = np.array([10, 10]) num_fireflies = 10 max_iterations = 100 best_path = path_planning(start, end, num_fireflies, max_iterations) print("Best path:", best_path) ``` 这段代码演示了如何使用萤火虫算法进行路径规划。在示例中,我们定义了一个萤火虫类,包含位置和亮度属性。然后,我们定义了路径规划函数,其中使用萤火虫算法迭代更新萤火虫的位置和亮度。最后,我们选择亮度最高的萤火虫作为最优路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电磁MATLAB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值