一种新的粒子群算法
题目:一种新的离散粒子群优化算法
中文摘要
粒子群优化算法在许多优化问题上表现得非常好。粒子群优化算法的缺点之一是假设算法中的变量为连续变量。本文提出一个新的粒子群优化算法,能够优化离散变量。这个新算法被称为整数和分类粒子群优化算法,该算法融合了分布估计算法的思想,即粒子代表概率分布而不是解的值,并且PSO更新修改了概率分布。本文描述了该算法,并将其性能与其他离散PSO算法进行了比较。实验表明,该算法比其他离散PSO算法要好 。
中文引言
离散优化问题,如贝叶斯网络中的特征选择或推理,是一组重要且具有挑战性的问题。这些问题不同于连续问题,因为每个变量的状态是有限个。在整数问题的例子中,变量被限制为一组整数值。对于此类问题,相邻值之间存在一种关系。一般而言,整数中存在一种隐式排序:差异较大的整数被认为是相距较远的整数。
虽然整数问题是离散问题的子集,但也有其他类型的问题。例如,在贝叶斯推理中,目标是找到一个能很好解释一组观察结果的状态集。在这里,相邻状态之间可能不存在直接关系或梯度。例如,假设状态集是悲伤、恐惧、愤怒、喜悦和厌恶的情绪。虽然在优化过程中这些状态可以用整数表示,但这种编码的值之间没有真正的有序关系。我们把这类问题称为分类优化问题。
注意:这里的顺序关系就是数学中的大小关系。
粒子群优化是一种相对简单的搜索算法,适用于各种各样的优化问题。然而,原始PSO算法无法处理离散问题,如上述问题,因为其速度更新需要连续的解值。目前,虽然离散的定义在应用程序和算法之间有很大差异, 但是PSO算法的几个变体允许离散值。本文正式给出离散问题的定义,并针对这问题提出了一种新的粒子群优化算法,称为整数和分类粒子群优化算法(ICPSO)。然后将ICPSO与文献中提出的其他离散PSO变体进行比较。
ICPSO算法的目标是保持对连续PSO的扩展尽可能简单,并保留大部分原始语义,同时解决其他离散PSO算法的一些潜在缺陷。为了实现这一点,我们改变粒子位置的表示形式,以便粒子的每个属性都是其可能值的分布,而不是值本身。这类似于分布估计算法(EDA),其中使用一组拟合个体生成分布向量,然后生成拟合解。ICPSO与EDAs的不同之处在于,该算法具有多个分布向量,这些分布向量使用PSO更新公式进行更新。
对于ICPSO,评价粒子变为从这些分布中抽取候选解并计算其适应度的任务。ICPSO还允许使用原始PSO更新公式,避免了可能解值的隐式排序相关的问题。另外,每当产生一个全局最优样本时,ICPSO会修改全局最优解和局部最优解的分布。这使得分布偏向于产生的最优样本,同时仍然允许搜索空间的探索。
离散ICPSO算法
clc
clear
tic
load matlab.mat
particles_Position = zeros(3, 150, 50);
particles_Sequence = zeros(50, 150); % 粒子所对应的序列
f_Score = zeros(1,50);
particles_Velocity = zeros(3, 150, 50); % 粒子的初始速度
particles_Best_Position = zeros(3, 150, 50); % 粒子个体最好的位置
particles_Best_Score = zeros(1,50);
global_Best_Position = zeros(3, 150); % 粒子群中最好的粒子位置
global_Best_Sequense = zeros(1, 150); % 粒子群中最好的粒子对应的序列
global_Best_Score = inf; % 粒子群中最好粒子对应的适应度
% 粒子群参数设置
epsilon = 0.75;
%% 初始化
for i=1:50
temp = rand(3, 150); % 临时变量
particles_Position(:,:,i) = temp./sum(temp); % 粒子位置
[Max, idx] = max(particles_Position(:,:,i));
particles_Sequence(i,:) = idx; % 粒子对应的序列
f_Score(i) = fitness(P, particles_Sequence(i,:)); % 评价粒子适应度
% 初始化个体最好位置
% particles_Best_Position(:,:,i) = particles_Position(:,:,i);
% particles_Best_Score(i) = f_Score(i);
% 初始化全局最好粒子
if f_Score(i)<global_Best_Score
global_Best_Score = f_Score(i);
global_Best_Position = particles_Position(:,:,i);
global_Best_Sequense = particles_Sequence(i,:);
end
end
w = 0.729;
% alpha*(particles_Best_Position(:,:,i) - particles_Position(:,:,i))
for iter=1:100
for i=1:50
alpha = rand*1.49618;
particles_Velocity(:,:,i) = w*particles_Velocity(:,:,i) + alpha*rand*(global_Best_Position - particles_Position(:,:,i));
particles_Position(:,:,i) = particles_Position(:,:,i) + particles_Velocity(:,:,i);
% 边界处理
temp2 = samplesbound(particles_Position(:,:,i));
% 归一化处理
particles_Position(:,:,i) = temp2./sum(temp2);
% 粒子对应的序列
[Max, idx] = max(particles_Position(:,:,i));
particles_Sequence(i,:) = idx; % 粒子对应的序列
f_Score(i) = fitness(P, particles_Sequence(i,:)); % 评价粒子适应度
% % 更新个体最好
% if f_Score(i)<particles_Best_Score(i)
% particles_Best_Position(:,:,i) = particles_Position(:,:,i);
% particles_Best_Score(i) = f_Score(i);
% end
% 更新全局最好
if f_Score(i)<global_Best_Score
copy = particles_Position(:,:,i);
for j=1:150
if idx(j) ~= global_Best_Sequense(j)
global_Best_Position(j) = epsilon*Max(j);
else
temp3 = copy(:,j) - copy(idx(j),j);
global_Best_Position(j) = Max(j) + (1-epsilon)*sum(temp3);
end
end
global_Best_Score=f_Score(i);
end
end
disp(['迭代次数:',num2str(iter),' || 最优解:',num2str(global_Best_Score)])
end
function x = samplesbound(x)
x(x>1) = 1;
x(x<0) = 0;
end
参考文献: A New Discrete Particle Swarm Optimization Algorithm