基于杂草优化算法的线性规划问题求解matlab程序

基于杂草优化算法的线性规划问题求解matlab程序

1 杂草算法简介
1.1 IWO定义
IWO是2006年由A. R. Mehrabian等提出的一种从自然界杂草进化原理演化而来的随机搜索算法,模仿杂草入侵的种子空间扩散、生长、繁殖和竞争性消亡的基本过程,具有很强的鲁棒性和自适应性。

IWO算法是一种高效的随机智能优化算法,以群体中优秀个体来指导种群的进化,以正态分布动态改变标准差的方式将由优秀个体产生的子代个体叠加在父代个体周围,再经过个体之间的竞争,得到最优个体。算法兼顾了群体的多样性和选择力度。
在这里插入图片描述
1.2 IWO搜索与性能
IWO相比其他的进化算法拥有更大的搜索空间和更好的性能。与GA相比,IWO算法简单,易于实现,不需要遗传操作算子,能简单有效地收敛问题的最优解,是一种强有力的智能优化工具。
1.3 IWO算法实现步骤
1.3.1 初始化种群
一定数据的杂草初始分布在搜索空间中,位置随机,个数根据实际情况调整;
1.3.2 子代繁殖
分布在整个搜索空间的父代,根据父代的适应值产生下一代种子,种子的个数由适应度值决定,适应值高的产生的种子多,低的个体产生种子数少。
1.3.3 空间扩散
子代个体按照一定规律分布在父代个体周围,分布位置规律满足正态分布(父代为轴线(均值),标准差随着代数不断变化)。
1.3.4 竞争淘汰
当一次繁殖的个体数超过种群数量的上限时,将子代和父代一起排序,适应值低的个体将被清除。
在这里插入图片描述

2 线性规划算例
2.1算例

在这里插入图片描述
2.2算例答案
在这里插入图片描述
3 杂草优化算法求解结果

1)迭代曲线
在这里插入图片描述
2)求解答案
在这里插入图片描述

4 matlab程序
1)主函数

%% 基于杂草算法的线性规划求解
clc;
clear;
close all;
%% Problem Definition
CostFunction = @(x) Sphere(x);     % 目标函数
nVar = 3;              % 决策变量数
VarSize = [1 nVar];    % 决策变量矩阵大小
VarMin = 0;       % 决策变量下限
VarMax = 15;        % 决策变量上限
%% IWO Parameters
MaxIt = 500;    % 最大迭代次数

nPop0 = 10;     % 初始种群规模
nPop = 25;      % 最大种群规模

Smin = 0;       % 繁殖种子数下限
Smax = 5;       % 繁殖种子数上限

Exponent = 3;             % 方差缩减指数(非线性调和因子)
sigma_initial = 0.5;      % 标准差初值
sigma_final = 0.001;	  % 标准差终值
%% Initialization
% 置空植物矩阵(包含位置和适应度值)
empty_plant.Position = [];
empty_plant.Cost = [];
pop = repmat(empty_plant, nPop0, 1);    % 初始种群矩阵
for i = 1:numel(pop)
    % 初始化位置
    pop(i).Position = unifrnd(VarMin, VarMax, VarSize);
    % 初始化适应度值
    pop(i).Cost = CostFunction(pop(i).Position);
end
% 初始化最优函数值历史记录
BestCosts = zeros(MaxIt, 1);
%% IWO Main Loop
for it = 1:MaxIt
    % 更新标准偏差
    sigma = ((MaxIt - it)/(MaxIt - 1))^Exponent * (sigma_initial - sigma_final) + sigma_final;
    % 获得最佳和最差的目标值
    Costs = [pop.Cost];
    BestCost = min(Costs);
    WorstCost = max(Costs);
    % 初始化子代种群
    newpop = [];
    % 繁殖
    for i = 1:numel(pop)
        % 比例系数
        ratio = (pop(i).Cost - WorstCost)/(BestCost - WorstCost);
        % 每个杂草产生的种子数
        S = floor(Smin + (Smax - Smin)*ratio);
        for j = 1:S
            % 初始化子代
            newsol = empty_plant;         
            % 生成随机位置
            % randn是一种产生标准正态分布的随机数或矩阵的函数
            newsol.Position = pop(i).Position + sigma * randn(VarSize); 
            % 边界(下限/上限)处理
            newsol.Position = max(newsol.Position, VarMin);
            newsol.Position = min(newsol.Position, VarMax);
            % 子代的目标函数值
            newsol.Cost = CostFunction(newsol.Position);
            % 添加子代
            newpop = [newpop;
                      newsol];  % #ok
        end
    end
    % 合并种群
    pop = [pop;
           newpop];
    % 种群排序
    [~, SortOrder] = sort([pop.Cost]);
    pop = pop(SortOrder);
    % 竞争排除(删除额外成员)
    if numel(pop)>nPop
        pop = pop(1:nPop);
    end
    % 保存最佳种群
    BestSol = pop(1);
    % 保存最优函数值历史记录
    BestCosts(it) = BestSol.Cost;
    % 显示迭代信息
%     disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCosts(it))]);
end
%% Results
figure;
% plot(BestCosts, 'LineWidth', 2);
semilogy(BestCosts, 'r', 'LineWidth', 2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;
%% 输出结果
disp(['最优变量 ' num2str(BestSol.Position) ': 最优目标值 = ' num2str(BestCosts(it))]);

。。。。。。。略





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

电磁MATLAB

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

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

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

打赏作者

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

抵扣说明:

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

余额充值