1、 按照自己的步骤记录.
2、 首先:初始解的产生问题。分几种情况:0-1,整数,小数
是一个解,还是多个解。我们定位为多个解,像遗传算法一样,有个群体。在和声搜索里面,叫做“音乐库”,比如有20个,就有20个曲子,肯定有一个曲子最好听,意思就是目标函数值最优。
解的编码问题,看图:
matlab语言的话,可以直接randi或者rand函数去生成随机解。
3、解的变换。或者说新的解怎么产生。
从两个方面进行变化:针对每一个解,从每一个维度开始进行判断,看看是否需要变化,有两个变异概率,如果需要进行变化的话,那么从音乐库里面换一个值,要么就自己变换一下,加一个随机数。
思路:
(1)音乐库里面取值的变换。音乐库里面有20个解,放着不动。然后,可以循环随机生成20个新解,一个一个来,生成一个解以后,开始进行判断是否每个维度需要变换,比如上面的的维度是7维的。然后里面有个维度循环,每一次都要看看维度的变量是否需要变异,这个就是变异1,叫做记忆库的取值变异,这里有个变异1概率,如果随机数<这个概率,那么就从记忆库当中去一个维度变量替换那个新生成的解当中对应的维度变量。
(2)微调。这个变换也是针对维度进行的,比如x1,x2等。因此,还是需要循环的。这个变异也有一个变异2概率,如果随机数<这个概率,那么就进行微调。
分析:通过上面的新解,再加上上面的两种变异,就可以得到新的更优的解。
4、更新音乐库。其实,就是换代,把更好的解留下,有点像遗传算法的下一代一样。
5、核心代码:
for it=1:MaxIt
% Initialize Array for New Harmonies 初始化生成20个空的音符,音符居然是一个结构体
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]);% 随机的取一个整数,1-50中。意思是选中整音乐库中的一个音符,一个音符是向量[1,5],然后调整其中的一个数值。
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 这招厉害,裁剪掉了
HM=HM(1:HMS);
% Update Best Solution Ever Found 因为是求最小值,所以第一个最小
BestSol=HM(1);
% Store Best Cost Ever Found
BestCost(it)=BestSol.Cost;
分析:代码是别人的_