遗传算法,解决参数寻优,拟合优化等问题,MATLAB 代码。 代码包括: 1.单变量及多变量的参数寻优与最大值查找(实数编码,二进制编码) 2.优化模糊控制器 3.解决旅行商问题 4.simulink参数寻优

% 实数编码的单变量寻优
fitnessFunc = @(x) -x^2 + 10*sin(5*x); % 要找最大值的函数
options = optimoptions('ga','PopulationSize',50,'MaxGenerations',100);
[x, fval] = ga(fitnessFunc, 1, [], [], [], [], -5, 5, [], options);
disp(['最佳解 x=',num2str(x),' 适应度=',num2str(-fval)]);

这里适应度函数故意取了负号,因为ga默认找最小值。注意种群规模和迭代次数别太小,不然容易卡在局部最优。遇到过有人把变量范围设太窄,结果死活找不到正确极值点,这坑别踩。

多变量场景下,二进制编码有时候比实数编码靠谱。比如要优化两个参数:

% 二进制编码双变量
nvars = 2;
lb = [-3 -3];
ub = [3 3];
ga(@(x)peaks(x(1),x(2)),2,[],[],[],[],lb,ub,[],...
    gaoptimset('PopulationType','bitstring','Generations',200));

这里用peaks函数当测试床,二进制编码需要指定变量类型。记得解码时要做好数值映射,别直接把二进制转十进制,得按比例缩放到参数范围。

说到模糊控制器优化,这玩意儿和遗传算法真是绝配。比如调整隶属度函数的参数:

fis = readfis('tipper.fis'); % 加载现成的模糊系统
params = getTunableParameters(fis); % 获取可调参数
options = optimoptions('ga','PopulationSize',30,'MutationFcn',@mutationadaptfeasible);
[optimizedParams,~] = ga(@(p)tuneFIS(p,fis),numel(params),[],[],[],[],...
                        params.Minimum,params.Maximum,[],options);

这里的关键是构造合适的适应度函数,比如用ISE积分指标评估控制效果。注意参数边界要和隶属度函数定义域匹配,不然会得到非法解。

旅行商问题算是经典考题了,MATLAB处理排列编码得用点技巧:

numCities = 20;
locations = rand(numCities,2)*100; % 随机生成城市坐标
options = optimoptions('ga','PopulationSize',200,'CreationFcn',@create_permutations,...
                      'CrossoverFcn',@cross_sequential,'MutationFcn',@mutate_swap);
[shortestPath, distance] = ga(@(x)pathDistance(x,locations),numCities,[],[],[],[],...
                             [],[],[],1:numCities,options);

这里自定义了排列创建、顺序交叉和交换变异函数。适应度函数计算路径总长时,注意要把首尾城市连起来形成闭环。遇到过城市数量超过50时收敛变慢,得适当增加种群规模。

最后说说Simulink参数整定这个骚操作。比如调PID参数:

simOut = sim('PID_Model','SaveOutput','on'); % 先跑一次原始模型
costFunc = @(K)simulateAndEvaluate(K,simOut); 
[optK, fval] = ga(costFunc,3,[],[],[],[],[0 0 0],[50 50 50]);

这里适应度函数内部要处理仿真运行,注意设置仿真终止条件。遇到过仿真时间设置太短导致评估不准,建议至少包含系统主要动态过程。参数范围别设太宽,不然搜索空间爆炸。

遗传算法这货最大的优势就是啥问题都能往上套,但具体实施时得根据问题特点调整编码方式和遗传算子。MATLAB的全局优化工具箱给了现成的架子,关键还是看怎么设计适应度函数和处理约束条件。下次遇到参数整定搞不定时,不妨试试这个带生物进化味道的暴力美学。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐