赞
踩
-
- %生成初始解,求目标函数f(x)=x1^2+x2^2+8在x1^2-x2>0;-x1-x2^2+2=0约束下的最小值问题
- sol_new2=1;%(1)解空间(初始解)
- sol_new1=2-sol_new2^2;
- sol_current1 = sol_new1;
- sol_best1 = sol_new1;
- sol_current2 = sol_new2;
- sol_best2 = sol_new2;
- E_current = inf;
- E_best = inf;
-
- rand('state',sum(clock)); %初始化随机数发生器
- t=90; %初始温度
- tf=89.9; %结束温度
- a = 0.99; %温度下降比例
-
- while t>=tf%(7)结束条件
- for r=1:1000 %退火次数
-
- %产生随机扰动(3)新解的产生
- sol_new2=sol_new2+rand*0.2;
- sol_new1=2-sol_new2^2;
-
- %检查是否满足约束
- if sol_new1^2-sol_new2>=0 && -sol_new1-sol_new2^2+2==0 && sol_new1>=0 &&sol_new2>=0
- else
- sol_new2=rand*2;
- sol_new1=2-sol_new2^2;
- continue;
- end
-
- %退火过程
- E_new=sol_new1^2+sol_new2^2+8;%(2)目标函数
- if E_new<E_current%(5)接受准则
- E_current=E_new;
- sol_current1=sol_new1;
- sol_current2=sol_new2;
- if E_new<E_best
- %把冷却过程中最好的解保存下来
- E_best=E_new;
- sol_best1=sol_new1;
- sol_best2=sol_new2;
- end
- else
- if rand<exp(-(E_new-E_current)/t)%(4)代价函数差
- E_current=E_new;
- sol_current1=sol_new1;
- sol_current2=sol_new2;
- else
- sol_new1=sol_current1;
- sol_new2=sol_current2;
- end
- end
- plot(r,E_best,'*')
- hold on
- end
- t=t*a;%(6)降温
- end
-
- disp('最优解为:')
- disp(sol_best1)
- disp(sol_best2)
- disp('目标表达式的最小值等于:')
- disp(E_best)
基本步骤
1 找出待优化的目标函数
2 设定种群规模大小(不会设置可直接采用下方代码的)
3 替换掉下方公式即可
- %% 初始化种群
- f= @(x)x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x); % 函数表达式 % 求这个函数的最大值
- figure(1);ezplot(f,[0,0.01,20]);
- N = 50; % 初始种群个数
- d = 1; % 空间维数
- ger = 100; % 最大迭代次数
- limit = [0, 20]; % 设置位置参数限制
- vlimit = [-1, 1]; % 设置速度限制
- w = 0.8; % 惯性权重
- c1 = 0.5; % 自我学习因子
- c2 = 0.5; % 群体学习因子
- for i = 1:d
- x = limit(i, 1) + (limit(i, 2) - limit(i, 1)) * rand(N, d);%初始种群的位置
- end
- v = rand(N, d); % 初始种群的速度
- xm = x; % 每个个体的历史最佳位置
- ym = zeros(1, d); % 种群的历史最佳位置
- fxm = zeros(N, 1); % 每个个体的历史最佳适应度
- fym = -inf; % 种群历史最佳适应度
- hold on
- plot(xm, f(xm), 'ro');title('初始状态图');
- figure(2)
- %% 群体更新
- iter = 1;
- record = zeros(ger, 1); % 记录器
- while iter <= ger
- fx = f(x) ; % 个体当前适应度
- for i = 1:N
- if fxm(i) < fx(i)
- fxm(i) = fx(i); % 更新个体历史最佳适应度
- xm(i,:) = x(i,:); % 更新个体历史最佳位置
- end
- end
- if fym < max(fxm)
- [fym, nmax] = max(fxm); % 更新群体历史最佳适应度
- ym = xm(nmax, :); % 更新群体历史最佳位置
- end
- v = v * w + c1 * rand * (xm - x) + c2 * rand * (repmat(ym, N, 1) - x);% 速度更新
- % 边界速度处理
- v(v > vlimit(2)) = vlimit(2);
- v(v < vlimit(1)) = vlimit(1);
- x = x + v;% 位置更新
- % 边界位置处理
- x(x > limit(2)) = limit(2);
- x(x < limit(1)) = limit(1);
- record(iter) = fym;%最大值记录
- x0 = 0 : 0.01 : 20;
- plot(x0, f(x0), 'b-', x, f(x), 'ro');title('状态位置变化')
- pause(0.1)
- iter = iter+1;
- end
- figure(3);plot(record);title('收敛过程')
- x0 = 0 : 0.01 : 20;
- figure(4);plot(x0, f(x0), 'b-', x, f(x), 'ro');title('最终状态位置')
- disp(['最大值:',num2str(fym)]);
- disp(['变量取值:',num2str(ym)]);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。