从零开始人工智能Matlab案例-和声搜索算法

程序的核心目标

找到一个最优解,比如找到一组数字或参数,使得某个目标函数最小(例如让 x₁² + x₂² + ... + x₁₀² 最小,即最接近0)。程序的作用就是自动“尝试”各种可能的解,一步步找到最好的那个。

程序步骤拆解

用“乐团排练”的比喻理解流程:

1. 乐团准备阶段(初始化)
  • 乐团成员数量(HMS=20):乐团有20个成员,每个成员代表一个候选解,如每个成员身上带着一张写有10个数的纸条。
  • 纸条内容生成:每个纸条上的数要满足范围要求(比如每个数字在-5到5之间)。第一个纸条可能是 [-2, 3, 0.5, ...],第二个是 [1, -4, 3.2, ...],等等。
  • 第一次试奏:每个成员按自己的纸条数值“演奏”一次,计算出各自的分数(即fitness = sum(x²),分数越低越好)。
2. 调整乐谱(生成新解)

每一次迭代就像乐团尝试改进乐谱。生成一个新乐谱(新解)的方法是:随机决定下面三种操作中的一种

  • 方法1:模仿过去的成功经验(记忆考虑HMCR=0.9)
    如果随机数 < 0.9,就从现有的20个成员的纸条中,随机选一个位置的值。
    例子:假设当前生成第3个数字,程序直接抄某个成员纸条上的第3个数字。

  • 附加调整(音调微调PAR=0.3)
    如果用了方法1,又有30%的概率对这个数字微调:在原数字基础上,加一个随机小变化(变化范围由BW=0.1控制)。
    例子:原数字是2.0 → 微调后可能是2.03或1.97。

  • 方法2:自由发挥(随机生成,概率10%)
    如果随机数 ≥0.9,直接随机生成一个新数字(在范围内)。
    例子:直接生成一个-5到5之间的随机数。

3. 淘汰表现差者(更新和声库)

所有成员演奏完一轮后,选出当前演奏最差的那个成员(即分数最高的纸条),用新生成的乐谱(新解)替换掉他。
注意:如果新乐谱比最差的好,就替换;否则放弃这次调整。


4. 重复调整直到结束(迭代MaxIter次)

重复步骤2-3共10次(但实际中会重复1000次),最终记录下整个过程中最好的那个解。


    % 参数设置
    dim = 10;          % 变量维度
    lb = -5*ones(1,dim); % 变量下界
    ub = 5*ones(1,dim);  % 变量上界
    HMS = 20;          % 和声库大小
    HMCR = 0.9;        % 记忆考虑率
    PAR = 0.3;         % 音调调整率
    BW = 0.1;          % 微调带宽
    MaxIter = 1000;    % 最大迭代次数
    
    % 初始化和谐库
    HM = repmat(lb, HMS, 1) + rand(HMS, dim).*repmat(ub-lb, HMS, 1);
    fitness = arrayfun(@(i) sphere_func(HM(i,:)), 1:HMS);
    [best_fitness, idx] = min(fitness);
    best_solution = HM(idx, :);
    
    % 迭代优化
    for iter = 1:MaxIter
        new_solution = zeros(1, dim);
        for i = 1:dim
            if rand() < HMCR
                % 从和声库中随机选择
                new_solution(i) = HM(randi(HMS), i);
                % 音调微调
                if rand() < PAR
                    new_solution(i) = new_solution(i) + BW*(2*rand()-1);
                end
            else
                % 随机生成新值
                new_solution(i) = lb(i) + rand()*(ub(i)-lb(i));
            end
        end
        % 边界检查
        new_solution = max(min(new_solution, ub), lb);
        new_fitness = sphere_func(new_solution);
        
        % 更新和声库
        [worst_fitness, worst_idx] = max(fitness);
        if new_fitness < worst_fitness
            HM(worst_idx, :) = new_solution;
            fitness(worst_idx) = new_fitness;
            % 更新全局最优
            if new_fitness < best_fitness
                best_fitness = new_fitness;
                best_solution = new_solution;
            end
        end
    end

function fitness = sphere_func(x)
    fitness = sum(x.^2);  % 优化目标:最小化x各分量的平方和
end

算法原理

  1. 初始化参数

    • 和声库大小 (HMS):存储候选解的集合
    • 记忆考虑率 (HMCR):决定是否从历史解中选取
    • 音调调整率 (PAR):决定是否对当前解进行微调
    • 微调带宽 (BW):调整幅度
    • 迭代次数 (MaxIter)
  2. 生成新解

    • 通过三种操作生成新解:
      • 记忆考虑:从和声库中随机选取一个变量值
      • 音调微调:对选定的变量值进行小幅调整
      • 随机生成:在搜索空间内随机生成新值
  3. 更新和声库

    • 若新解优于和声库中的最差解,则替换之。

你可能感兴趣的:(算法,matlab,人工智能)