核心内容摘要
那些年,我们一起“困”过的“她”:男生视角下的女生“困困”情结
使用改进的遗传算法量子遗传算法求解多元函数的最值问题matlab注释详细可用来学习!量子比特表示量子遗传算法这玩意儿在优化领域算是个骚操作把量子计算的叠加态概念揉进传统遗传算法里。
今天咱们直接撸个Matlab实战用改进版量子遗传算法找多元函数最值。
就拿六维Rastrigin函数开刀这函数到处都是坑爹的局部最优特别适合测试算法性能。
先整点参数设置垫个底%% 参数初始化 pop_size 80; % 种群规模 var_num 6; % 变量维度 qubit_num 20; % 每个变量用几个量子位表示 max_gen 150; % 最大迭代次数 mutation_rate
1;% 变异概率这里qubit_num决定了变量的编码精度。
量子位越多解的精度越高但计算量也会指数级增长。
一般实际问题取
之间足够用了。
接着搞量子种群的初始化% 初始化量子种群角度表示 Q pi/4 * ones(pop_size, var_num*qubit_num); % 所有量子位初始化为π/4的叠加态 best_fitness -inf; % 记录历史最佳适应度 % 目标函数六维Rastrigin rastrigin (x) sum(x.^2 - 10*cos(2*pi*x) 10,
;量子角度初始化为π/4这个操作很关键这时候量子位的观测概率刚好是
5处于完全叠加态保证初始种群的多样性。
主循环开始前先整个观察量子态的操作for gen 1:max_gen % 观测量子态生成二进制种群 binary_pop zeros(pop_size, var_num*qubit_num); for i1:pop_size prob cos(Q(i,:)).^2; % 计算观测概率 binary_pop(i,:) prob rand(1, var_num*qubit_num); % 量子坍塌 end这里用cos²θ作为观测到1的概率rand生成随机数模拟量子坍塌过程。
注意这步相当于把连续的量子态转换成经典二进制编码。
使用改进的遗传算法量子遗传算法求解多元函数的最值问题matlab注释详细可用来学习接下来要把二进制串解码成实际变量值% 二进制转十进制 X zeros(pop_size, var_num); for i1:var_num start (i-
*qubit_num 1; end_idx i*qubit_num; bin_matrix binary_pop(:, start:end_idx); X(:,i) bin2decMat(bin_matrix) * (
12/(2^qubit_num-
) -
56; % 映射到[-
12,
12] end % 计算适应度 fitness -rastrigin(X); % 求最大值所以取负 [curr_max, idx] max(fitness);bin2decMat这个自定义函数要把二进制矩阵转十进制文末给源码。
变量范围映射到[-
12,
12]是Rastrigin函数的标准定义域。
重点来了——量子旋转门更新% 量子旋转门调整 delta_theta
05*pi; % 旋转角步长 for i1:pop_size for j1:var_num*qubit_num if binary_pop(i,j) binary_pop(idx,j) % 与精英个体相同则加强当前状态 Q(i,j) Q(i,j) delta_theta*sign(cos(Q(i,j))); else % 不同则趋向精英个体 Q(i,j) Q(i,j) - delta_theta*sign(cos(Q(i,j))); end Q(i,j) mod(Q(i,j), 2*pi); % 防止角度溢出 end end这里用当前最优个体引导种群进化。
delta_theta控制收敛速度太大容易错过最优太小收敛慢实际调参时可以动态调整。
画个收敛曲线看看效果% 记录收敛过程 convergence(gen) -curr_max; % 动态显示 if mod(gen,
0 fprintf(第%d代, 当前最优解:%.4f\n, gen, -curr_max); end end % 绘制收敛曲线 plot(convergence); xlabel(迭代次数); ylabel(最优值); title(适应度收敛曲线);!收敛曲线示例典型的指数型收敛曲线前50代快速下降后面进入微调阶段。
实际跑程序时可能会出现小幅震荡这是算法在跳出局部最优的正常表现。
最后把几个关键函数补上function dec bin2decMat(bin_mat) [~,n] size(bin_mat); dec bin_mat * (
^(n-1:-1:
); end这个二进制转换函数用了矩阵运算比用字符串转换快N倍尤其是处理大规模种群时速度差距明显。
避坑指南量子位数目别超过25否则二进制转十进制时会溢出旋转角delta_theta建议从
1π开始尝试出现早熟收敛时适当提高变异概率到
15-
2六维问题种群规模不要小于50量子遗传算法的精髓在于量子态的并行搜索能力比起传统GA在保持种群多样性的同时收敛速度更快。
代码里那些cos²θ和旋转门操作本质上是在利用量子叠加态同时探索多个区域。
不过要注意这算法对高维非凸问题虽然有效但时间复杂度还是偏高实际应用时得权衡精度和计算成本。