粒子群优化算法求解组合权重问题

实现的粒子群优化(PSO)算法求解组合权重问题。算法可以用于优化多个指标的权重组合,以最大化或最小化某个目标函数。

% 粒子群优化算法求解组合权重问题
clear; close all; clc;

%% 问题定义
% 假设我们有N个指标需要确定权重,权重之和为1
nVars = 5;          % 变量数量(权重数量)
lb = 0;             % 权重下限
ub = 1;             % 权重上限

% 检查权重和是否为1的容差
weightTolerance = 1e-6;

%% PSO参数
maxIterations = 100;    % 最大迭代次数
nParticles = 50;        % 粒子数量
w = 0.7;               % 惯性权重
wDamp = 0.99;          % 惯性权重衰减率
c1 = 1.5;              % 个体学习因子
c2 = 2.0;              % 社会学习因子

% 速度限制(相对于搜索空间的比例)
maxVelocity = 0.2 * (ub - lb);
minVelocity = -maxVelocity;

%% 初始化
% 创建粒子结构体
empty_particle.position = [];
empty_particle.velocity = [];
empty_particle.cost = [];
empty_particle.best.position = [];
empty_particle.best.cost = [];

particle = repmat(empty_particle, nParticles, 1);

% 初始化全局最优解
globalBest.cost = inf;  % 对于最小化问题
% globalBest.cost = -inf;  % 对于最大化问题

% 初始化粒子
for i = 1:nParticles
    % 生成随机位置(权重)
    particle(i).position = rand(1, nVars);
    
    % 确保权重和为1
    particle(i).position = particle(i).position / sum(particle(i).position);
    
    % 初始化速度
    particle(i).velocity = zeros(1, nVars);
    
    % 评估粒子
    particle(i).cost = objectiveFunction(particle(i).position);
    
    % 更新个体最优
    particle(i).best.position = particle(i).position;
    particle(i).best.cost = particle(i).cost;
    
    % 更新全局最优
    if particle(i).best.cost < globalBest.cost  % 最小化问题
    % if particle(i).best.cost > globalBest.cost  % 最大化问题
        globalBest = particle(i).best;
    end
end

% 存储最佳成本值
bestCosts = zeros(maxIterations, 1);

%% PSO主循环
for iter = 1:maxIterations
    for i = 1:nParticles
        % 更新速度
        particle(i).velocity = w * particle(i).velocity ...
            + c1 * rand(1, nVars) .* (particle(i).best.position - particle(i).position) ...
            + c2 * rand(1, nVars) .* (globalBest.position - particle(i).position);
        
        % 应用速度限制
        particle(i).velocity = max(particle(i).velocity, minVelocity);
        particle(i).velocity = min(particle(i).velocity, maxVelocity);
        
        % 更新位置
        particle(i).position = particle(i).position + particle(i).velocity;
        
        % 确保权重非负
        particle(i).position = max(particle(i).position, lb);
        
        % 确保权重和为1
        particle(i).position = particle(i).position / sum(particle(i).position);
        
        % 评估粒子
        particle(i).cost = objectiveFunction(particle(i).position);
        
        % 更新个体最优
        if particle(i).cost < particle(i).best.cost  % 最小化问题
        % if particle(i).cost > particle(i).best.cost  % 最大化问题
            particle(i).best.position = particle(i).position;
            particle(i).best.cost = particle(i).cost;
            
            % 更新全局最优
            if particle(i).best.cost < globalBest.cost  % 最小化问题
            % if particle(i).best.cost > globalBest.cost  % 最大化问题
                globalBest = particle(i).best;
            end
        end
    end
    
    % 存储最佳成本值
    bestCosts(iter) = globalBest.cost;
    
    % 显示迭代信息
    if mod(iter, 10) == 0
        disp(['迭代 ', num2str(iter), ': 最佳成本 = ', num2str(globalBest.cost)]);
        disp(['最佳权重: ', num2str(globalBest.position)]);
        disp(['权重和: ', num2str(sum(globalBest.position))]);
    end
    
    % 惯性权重衰减
    w = w * wDamp;
end

%% 结果
figure;
plot(bestCosts, 'LineWidth', 2);
xlabel('迭代次数');
ylabel('最佳成本值');
title('PSO收敛曲线');
grid on;

disp(' ');
disp('最终结果:');
disp(['最佳权重组合: ', num2str(globalBest.position)]);
disp(['权重和: ', num2str(sum(globalBest.position))]);
disp(['最佳目标函数值: ', num2str(globalBest.cost)]);

%% 目标函数示例
% 这是一个示例目标函数,实际应用中需要根据具体问题修改
function cost = objectiveFunction(weights)
    % 这里是一个简单的示例目标函数
    % 实际应用中,这可能是组合预测的误差、投资组合的风险、多目标优化的综合指标等
    
    % 示例1: 最小化权重方差(使权重尽可能均匀)
    % cost = var(weights);
    
    % 示例2: 最小化某个线性组合
    % 假设我们有5个指标的性能数据
    performance = [0.8, 0.6, 0.9, 0.7, 0.85]; % 每个指标的单独性能
    
    % 最大化加权性能(因此使用负号转换为最小化问题)
    cost = -sum(weights .* performance);
    
    % 示例3: 考虑权重分布的熵(最大化熵使权重更均匀)
    % 避免零权重(加上一个小常数)
    % epsilon = 1e-10;
    % p = weights + epsilon;
    % p = p / sum(p);
    % entropy = -sum(p .* log(p));
    % cost = -entropy; % 最大化熵
    
    % 示例4: 多目标组合
    % 可以根据需要组合多个目标
    % alpha = 0.7; % 权重
    % cost = alpha * (-sum(weights .* performance)) + (1-alpha) * (-entropy);
end

说明

1. 问题定义

  • nVars: 需要优化的权重数量
  • lb, ub: 权重的下限和上限(通常为0和1)
  • weightTolerance: 检查权重和是否为1的容差

2. PSO参数

  • maxIterations: 最大迭代次数
  • nParticles: 粒子数量
  • w: 惯性权重
  • wDamp: 惯性权重衰减率
  • c1, c2: 个体和社会学习因子
  • maxVelocity, minVelocity: 速度限制

3. 初始化

  • 随机初始化粒子位置(权重)
  • 确保权重和为1
  • 初始化速度为0
  • 评估每个粒子的适应度(目标函数值)

4. PSO主循环

  • 更新粒子速度和位置
  • 应用边界约束(确保权重非负且和为1)
  • 评估粒子适应度
  • 更新个体和全局最优解
  • 惯性权重衰减

5. 目标函数示例

提供了几个示例目标函数,实际应用中需要根据具体问题修改:

  • 最小化权重方差
  • 最大化加权性能
  • 最大化权重熵(使权重分布更均匀)
  • 多目标组合

参考代码 运用粒子群优化算法求解组合权重 www.youwenfan.com/contentcnj/98418.html

示例

% 使用PSO求解组合权重问题
% 1. 修改nVars为实际需要的权重数量
% 2. 根据实际问题修改objectiveFunction函数
% 3. 运行代码

% 例如,对于投资组合权重优化:
% function cost = objectiveFunction(weights)
%     % 假设有5个资产的预期收益率
%     returns = [0.08, 0.12, 0.15, 0.09, 0.11];
%     
%     % 假设协方差矩阵
%     covariance = [0.1, 0.02, 0.03, 0.01, 0.04;
%                  0.02, 0.2, 0.05, 0.03, 0.06;
%                  0.03, 0.05, 0.3, 0.04, 0.07;
%                  0.01, 0.03, 0.04, 0.15, 0.05;
%                  0.04, 0.06, 0.07, 0.05, 0.25];
%     
%     % 计算投资组合的预期收益率和风险
%     portfolioReturn = sum(weights .* returns);
%     portfolioRisk = sqrt(weights * covariance * weights');
%     
%     % 风险厌恶系数
%     lambda = 0.5;
%     
%     % 目标函数:最大化夏普比率(转换为最小化问题)
%     cost = -portfolioReturn / portfolioRisk;
%     
%     % 或者使用均值-方差优化
%     % cost = portfolioRisk - lambda * portfolioReturn;
% end

参数调优建议

  1. 粒子数量(nParticles):

    • 一般设置20-50个粒子
    • 问题复杂度高时可增加至100-200
  2. 学习因子(c1, c2):

    • 通常c1 = c2 = 2.0
    • 可以尝试c1从2.5线性减少到0.5,c2从0.5线性增加到2.5
  3. 惯性权重(w):

    • 通常从0.9线性减少到0.4
    • 使用wDamp参数实现线性衰减
  4. 速度限制:

    • 通常设置为搜索空间的10%-20%
    • 防止粒子移动过快错过最优解

扩展功能

  1. 自适应参数调整: 根据搜索进度动态调整PSO参数
  2. 多种群PSO: 使用多个子群探索不同区域
  3. 混合算法: 结合局部搜索算法(如Nelder-Mead)提高精度
  4. 约束处理: 增加其他类型的约束条件
  5. 多目标优化: 扩展为多目标PSO(MOPSO)

这个PSO实现提供了一个灵活的框架,可以用于各种组合权重优化问题,包括投资组合优化、多指标决策、资源分配等。根据具体问题修改目标函数即可应用。

posted @ 2025-10-17 16:18  chen_yig  阅读(10)  评论(0)    收藏  举报