HS的记录

该博客详细介绍了和声搜索算法的实现过程,包括初始解的生成、解的编码和变换、音乐库的更新以及如何通过变异策略寻找更优解。核心代码展示了在MATLAB中如何运用随机数生成和变异概率来迭代优化解决方案。整个算法类似于遗传算法,通过不断迭代和裁剪音乐库中的解来逐步接近最优目标。
摘要由CSDN通过智能技术生成

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;

分析:代码是别人的_

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值