基于群智能算法的函数最值优化问题
摘要
针对求解函数的极值问题的群智能算法,大部分函数在定义域内都可以通过微分的方式求得极值点和找到最值。但是存在一些测试函数,他们的最值用求解的微分的方式只能使得计算量大大增加。随着计算机技术的发展,可以通过matble编写基于群智能算法的随机搜索算法,不断去逼近极值,不断地优化,改变控制参数,来找到全局最优解。
关键词:遗传算法;粒子群优化算法;全局最优解;控制参数选择;
一、遗传算法(genetic algorithms,GA)
遗传算法一类借鉴生物界自然选择和自然遗传机制的随机搜索算法。鉴于生物在自然界的生存环境中适者生存、不适者被淘汰的过程。具有遗传特征,子代总是与亲代(父代)相似。
所以遗传算法非常适用于处理传统搜索方法难以解决的复杂和非线性优化问题。
在本题目中:使用遗传算法求解给定区间内Sphere函数的最小值问题。
当Sphere的变量为两个时,其在空间中的形状为圆形抛物面,使用matble作图可得,其最小值的位置在原点处。
(一)、遗传算法的基本思想
适者生存,最适合的的个体生存和繁殖后代的可能比较大,在求解的过程中先随机设置一个种群,多个个体,即多个个体,后根据适应程度进行生存和繁殖后代。
1、 编码
在这里采用二进制编码的方式,每一个基因由两个dna13行1列矩阵拼接而成,前十位后后十位分别表示函数中的点的横纵坐标,采用这种编码方式可以在基因的遗传和变异中按位进行操作。更能体现其的随机性。:类似生物染色体的组成,算法易于用生物遗传理论解释,遗传操作如交叉、变异等易实现;算法处理的模式数最多。
其中13基因中每一位作用:
1:符号位,1表示负数,0表示正数
2-8:横纵坐标的整数部分,其中7位二进制数最大可表示到128,对于本题目中要求的定义域【-100,100】以可以满足
9-13:横纵坐标的小数部分,
使用randi函数产生两个,其中5位二进制数最小可表示到0.03125,对于一些函数,极值点少,且非常明显的已经可以满足要求
dna1 = randi([0, 1], [N, L]); % 基因100hang 13lie的均匀矩阵
dna2= randi([0, 1], [N, L]) ; % 基因100hang 13lie的均匀矩阵
2、解码decode
解码就是将基因中的二进制数字转化成为实数,以便可以带入具体的函数中
解码方式依据二进制转十进制的规则,一次在每一位上加上对应的权重
%解码
function numbers = decode(t, row)
randshu = [];
for i = 1: row
% 整数部分
judgement = t(i, 1);
bit1 = 7;
bit_integer = t(i,2:bit1+1);
% 小数部分
bit2 = 5;
bit_decimal = t(i,bit1+2:13);
integer = 0;
decimal = 0;
% 计算整数部分
for i = 1 : bit1
integer = integer + bit_integer(i) * (2^(bit1 -i));
end
% 计算小数部分
for j = 1 : bit2
decimal = decimal + bit_decimal(j) * (2^(-j));
end
% 整合
num = integer + decimal;
num = sum(num);
if judgement == 1
num = -num;
end
randshu = [randshu num];
end
numbers = randshu;
end
3、初始种群的产生
给定x,y的范围-100-100,使用linspace函数从-128-128之间均匀的取100个数,然后使用surface函数画出函数的等高线图,以便于可以在标出初始种群和子代种群
x=linspace(xRange(1), xRange(2), 100); %一列数100个从-128-128
y=linspace(yRange(1), yRange(2), 100); %一列数100个从-128-128
[xx, yy]=meshgrid(x, y); %2-D and 3-D grids
surface( xx , yy ,Fx(xx, yy ) ) %Create surface object
然后随机产生两个矩阵,每个矩阵都是100行13列的,这就表示100个初始个体,作为最基本的种群,使用随机函数可以使最初的种群充满不确定性,可以为以后的寻找全局最优解提供初始条件。
4、适应度函数设计
适应度函数:将目标函数映射成适应度函数(fitness function)的方法:
若目标函数f(x)为最大化问题,则适应度函数取为:Fit( f(x)) = f(x)
若目标函数f(x)为最小化问题,则适应度函数取为:Fit( f()x)= - f(x)
在这里我们求解的是最小值问题,既可以转化成Fit( f()x)= - f(x)
判断个体优良与否的准则是各个个体的适应度值:个体适应度越高,其被选择的机会就越多。将适应度值放到矩阵的最后一列,就可以对种群的基因进行排序,同样依据适应度比例方法
%适应度函数
function result=Fx(x , y)
result = x.^2 + y.^2; %最小值
end
5、选择个体(轮盘赌选择)
按照个体顺序求出每个个体的累积概率。
产生一个随机数,它落入累积概率的哪个区域就选择相应的个体交叉。
6、交叉产生子代个体
一点交叉:在个体串中随机设定一个交叉点,实行交叉时,该点前或后的两个个体的部分结构进行互换,并生成两个新的个体。
在这里我选用一点交叉,可以减少计算的复杂程度
每一个基因dna (x,y)是一个1行26列的行矩阵,每次都有一个交叉概率,产生一个随机数,若其小于这个概率,就进行交叉。
交叉中先产生0-26的一个随机数,在随机选取一个一个基因与其进行一点交叉,充分的体现了交叉的随机性与灵活性。
%交叉函数,一条dna,产生两条交叉后的dna
function [x1,x2]=genetic(gene, pc)
global N L num % n = 100, l = 13, num