- matlab optimization 中使用了GA求解器 默认的是小于等于
找到GA 工具包
- 找到 APP
- 选择 Optimization Tool
- 选择Solver
- ga - Genetic Algorithm
应用GA solver
定义适应度函数(Fitness function)与问题约束(Constraints)
example one
- 优化函数 sin(x) + 2 * cos(x)
- 极其重要的 inline 方法
- result
example two
- 优化函数 sin(x) + 2 * cos(x) + sin(y) + 3 * cos(y)
- min = - 5.39834563766817(无约束)
- 不等约束
- A【x;y】>= [-0.7;0.2]
- A = [-1,-1;1,-1]
- 注意:
- 我们得到的结果显然是一个周期性的结果,也就是说我们肯定能找出一个满足这个不等约束的解
- 为了将解约束到我们想要的值,我们得动点脑筋,不过我就不动了
- x = -arctan 2 + 2n\pi -\pi/2
- y = -arctan 3 + 2n\pi -\pi/2
>> f2 = @(x) sin(x(1)) + 2 * cos(x(1)) + sin(x(2)) + 3 * cos(x(2));
- 等式约束
- B [x;y] = [1,1;0,0][x;y]=[1;0]
- 也就是变成了 sin(x) + 2 * cos(x) + sin(1-x) + 3 * cos(1-x)
设置遗传算法参数(Options)
- 其实这个我也不懂就是了。。。。。。
实战案例
- 我们不可能永远只使用GUI界面
MAIN.m
fun = @(x) (x(1)-1)^2 + (x(2)-1)^2;
% 定义变量的上下界
lb = [-10, -10];
ub = [10, 10];
% 定义非线性约束
nonlcon = @nonlinearConstraint;
% 使用GA求解器进行优化
options = optimoptions('ga', 'Display', 'iter');
[x, fval] = ga(fun, 2, [], [], [], [], lb, ub, nonlcon, options);
disp(x)
disp(fval)
nonlinearConstraint.m
function [c, ceq] = nonlinearConstraint(x)
% 非线性约束函数
f1 = @(m, a) m.^2 + m
b = 100;
c = [x(1)^2 + x(2)^2 - 1; % x1^2 + x2^2 >= 1
x(1) + x(2) - 2; % x1 + x2 <= 2
integral(@(n) f1(n, x(2)), x(1), b)];
ceq = [0;0;0];
end
优化问题
- 这个优化问题绝对足够解决你所会预见的全部问题了。
几次解
- 显然
- 这个问题的解不太稳定,需要多跑几次
- 好吧 跑了也没有 毕竟no feasible point found.......
options 设置
- MAIN.m
fun = @(x) (x(1)-1)^2 + (x(2)-1)^2;
% 定义变量的上下界
lb = [-10, -10];
ub = [10, 10];
% 定义非线性约束
nonlcon = @nonlinearConstraint;
% 使用GA求解器进行优化
% options = optimoptions('ga', 'Display', 'iter');
% for i = 1:10
% [x, fval] = ga(fun, 2, [], [], [], [], lb, ub, nonlcon, options);
% end
- nonlinearConstraint.m
function [c, ceq] = nonlinearConstraint(x)
% 非线性约束函数
f1 = @(m, a) a * m.^2 - m
b = 10;
c = [x(1)^2 + x(2)^2 - 1; % x1^2 + x2^2 <= 1
x(1) + x(2) - 2; % x1 + x2 <= 2
];
ceq = [0;0;0];
end
- Population
- Fitness scaling
- Selection
- Reproduction
- Mutation
- Crossover
- Migration
- Constraint parameters
- Hybrid function
- Stopping criteria