%
% Copyright (c) 2015, Yarpiz (www.yarpiz.com)
% All rights reserved. Please read the "license.txt" for license terms.
%
% Project Code: YPEA117
% Project Title: Implementation of Harmony Search in MATLAB
% Publisher: Yarpiz (www.yarpiz.com)
%
% Developer: S. Mostapha Kalami Heris (Member of Yarpiz Team)
%
% Contact Info: sm.kalami@gmail.com, info@yarpiz.com
%
clc;
clear;
close all;
%% Problem Definition 问题定义
CostFunction=@(x) Sphere(x); % Cost Function 代价函数
nVar=9; % Number of Deciison Variables 决策变量数(这个是维度)
VarSize=[1 nVar]; % Decision Variables Matrix Size 决策变量矩阵大小
VarMin=-10; % Decision Variables Lower Bound 决策变量下界
VarMax= 10; % Decision Variables Upper Bound 决策变量上界
%% Harmony Search Parameters 和声参数
MaxIt=5000; % Maximum Number of Iterations 最大迭代次数
HMS=100; % Harmony Memory Size 和声记忆库大小
nNew=1; % Number of New Harmonies 新和声数量(维度)
HMCR=0.9; % Harmony Memory Consideration Rate 记忆取值概率
PAR=0.1; % Pitch Adjustment Rate 微调概率
FW=0.02*(VarMax-VarMin); % Fret Width (Bandwidth) BW
FW_damp=0.995; % Fret Width Damp Ratio 带宽阻尼比
%% Initialization 初始化
% Empty Harmony Structure
empty_harmony.Position=[];
empty_harmony.Cost=[];
% Initialize Harmony Memory
HM=repmat(empty_harmony,HMS,1); % 举例:B = repmat(A, m, n) %将矩阵A复制m*n块,即B由m*n块A平铺而成(创建和声记忆库)
% Create Initial Harmonies 创建初始和声
for i=1:HMS
HM(i).Position=unifrnd(VarMin,VarMax,VarSize); %unifrnd产生一个VarSize大小的随机数矩阵,其元素在VarMin,VarMax之间均匀分布。
HM(i).Cost=CostFunction(HM(i).Position); %得到所有解的适应度
end
% Sort Harmony Memory 排序(用适应度排序)
[~, SortOrder]=sort([HM.Cost]);
HM=HM(SortOrder);
% Update Best Solution Ever Found 更新找到最佳方案(因为已排序,所以HM(1)就是最佳)
BestSol=HM(1);
% Array to Hold Best Cost Values 存储最佳成本值的数组
BestCost=zeros(MaxIt,1);
%% Harmony Search Main Loop
for it=1:MaxIt
% Initialize Array for New Harmonies 建立一个空的NEW
NEW=repmat(empty_harmony,nNew,1);
% Create New Harmonies
for k=1:nNew
% Create New Harmony Position
NEW(k).Position=unifrnd(VarMin,VarMax,VarSize); %赋值
for j=1:nVar
if rand<=HMCR
% Use Harmony Memory
i=randi([1 HMS]);
NEW(k).Position(j)=HM(i).Position(j);
end
% Pitch Adjustment
if rand<=PAR
%DELTA=FW*unifrnd(-1,+1); % Uniform经典
DELTA=FW*randn(); % Gaussian (Normal) 高斯
NEW(k).Position(j)=NEW(k).Position(j)+DELTA;
end
end
% Apply Variable Limits
NEW(k).Position=max(NEW(k).Position,VarMin);
NEW(k).Position=min(NEW(k).Position,VarMax);
% Evaluation
NEW(k).Cost=CostFunction(NEW(k).Position);
end
% Merge Harmony Memory and New Harmonies
HM=[HM
NEW]; %#ok
% Sort Harmony Memory 排序
[~, SortOrder]=sort([HM.Cost]);
HM=HM(SortOrder);
% Truncate Extra Harmonies 取HMS个和声
HM=HM(1:HMS);
% Update Best Solution Ever Found 得到最优解
BestSol=HM(1);
% Store Best Cost Ever Found储存有史以来最好结果
BestCost(it)=BestSol.Cost;
% Show Iteration Information
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
% Damp Fret Width
FW=FW*FW_damp;
end
%% Results
figure;
% plot(BestCost,'LineWidth',2);
semilogy(BestCost,'LineWidth',2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;
评论0