题目:一种新的离散粒子群优化算法

中文摘要

      粒子群优化算法在许多优化问题上表现得非常好。粒子群优化算法的缺点之一是假设算法中的变量为连续变量。本文提出一个新的粒子群优化算法,能够优化离散变量。这个新算法被称为整数和分类粒子群优化算法,该算法融合了分布估计算法的思想,即粒子代表概率分布而不是解的值,并且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