和声搜索算法的理论和应用
一、HS算法简介
和声搜索(HS)算法首先由Geem等人在2001年提出,和其他元启发式算法一样,它受到音乐家即兴和声的基本原则的启发。该算法简单、搜索效率高。
已成功应用于函数优化、机械结构设计、管网优化和数据分类系统优化等领域。
二、HS算法的基本理论和应用
音乐家在谱写和声时,通常会尝试记忆存储中各种音调的可能组合。这种寻找完美和声的过程实际上类似于寻找工程问题的最优解的过程。HS方法实际上是受和声即兴创作的工作原理的启发。图1显示了基本HS方法的流程图,其中包括四个主要步骤。
算法流程:
步骤一:
初始化HS的内存(HM)。内存中包含考虑到的随机的解。对于一个N维问题,HM可以表示为:
[xi1,xi2,…,xin] (i=1,2,…,HMS)是一个候选解。HMS通常设定为50-100.
步骤二:
从内存中取出候选解进行改进[x’1,x’2,…,x’n]。利用和声内存率(HMCR)获取 xj’ 的每个组分。
HMCR定义为从HM中选取某个组分的概率。1-HMCR 是随机生成的概率。
如果xj’ 取自随机HM成员的第j 维度,可以根据PAR(Pitching Adjust Rate)进一步改变。
PAR决定着HM中需要改变的候选解的概率。
步骤三:
更新HM。评估步骤二获得解,如果产生的值优于最坏的解,就会替换掉最坏的解,否则,就消除这个解。
步骤四:
重复步骤2和步骤3直到预设终止标准,比如达到最大迭代次数。
三、HS应用
%%%实值和声搜索算法求函数极值%%%
% 初始化
clear all; %清除所有变量
close all; %清图
clc; %清屏
HMS=3; %和声库的大小
HMCR=0.95; %记忆库取值概率
PAR=0.1; %微调概率
bw=1; %音调微调带宽
Tmax=200; %创作的次数
M=3; %乐器(变量)个数
Mmin=[-5 -5 -5]; %乐器的音调下限
Mmax=[5 5 5]; %乐器的音调上限
% 和声记忆库初始化
X=zeros(HMS,M);
% 随机产生和声记忆库
for i=1:HMS
for j=1:M
X(i,j)=rand()*(Mmax(j)-Mmin(j))+Mmin(j);
end
end
% 初始化新的乐器组合
xnew=zeros(1,M);
% 初始化最优解为第一个乐器组合
yBest=func(X(1,:));
xBest=X(1,:);
% 迭代周期为Tmax
for iter=1:Tmax
iter;
% 以概率HMCR在和声库中随机选取
if rand()<HMCR
xnew=X(round(rand()*(HMS-1))+1,:);
% 以概率1-HMCR在乐器音调范围内随机产生
else
for j=1:M
xnew(j)=rand()*(Mmax(j)-Mmin(j))+Mmin(j);
end
end
% 以概率PAR进行扰动
if rand()<PAR
for j=1:M
xnew(j)=xnew(j)+2*bw*rand()-bw;
end
end
% 计算新乐器组合的和声为ynew
ynew=func(xnew);
% 更新和声库,判断新解是否比和声库中最差的解更好,是则替换
for j=1:HMS
if ynew<func(X(j,:))
X(j,:)=xnew;
break;
end
% 记录最美的和声
if yBest>func(X(j,:))
yBest=func(X(j,:));
xBest=X(j,:);
end
end
% 记录每个周期的最美和声
trace(iter)=yBest;
tracef(iter,:)=xBest;
end
% 绘制结果
xBest %最好和声组合
trace(end) %最好和声
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
由图像可以看出,和声搜索可以较快收敛到最优解3附近。
原文参考:
https://www.hindawi.com/journals/cin/2015/258491/
加深理解