一、资源分配问题与粒子群算法概述
1.1 资源分配问题定义
资源分配问题(Resource Allocation Problem, RAP)是指将有限的资源(如资金、人力、设备等)分配给多个任务或项目,以最大化整体效益(或最小化成本)的优化问题。其核心特征是:
- 资源总量有限:总资源不超过预设上限;
- 多目标/单目标:通常追求效益最大化或成本最小化;
- 非线性约束:效益函数可能为非线性(如边际效益递减);
- 离散/连续决策:资源分配量可为整数或实数。
1.2 粒子群算法(PSO)基本原理
粒子群算法是一种群体智能优化算法,模拟鸟群觅食行为。核心思想是:
- 粒子:每个粒子代表一个候选解(资源分配方案);
- 位置:粒子的位置对应资源分配量;
- 速度:粒子的速度指导位置更新方向;
- 适应度:评价粒子优劣的指标(如总效益);
- 全局最优与个体最优 :粒子通过跟踪自身历史最优(
pbest)和群体历史最优(gbest)更新速度和位置。
更新公式:

其中:ωωω为惯性权重,c1,c2c_1,c_2c1,c2为学习因子,r1,r2r_1,r_2r1,r2为随机数,xix_ixi为粒子位置,viv_ivi为粒子速度。
二、资源分配问题的数学模型
2.1 问题描述
假设有nnn个项目,总资源量为RtotalR_{total}Rtotal,第iii个项目分配资源xi(xi≥0)x_i(x_i≥0)xi(xi≥0),满足∑i=1nxi≤Rtotal∑{i=1}^nx_i≤R{total}∑i=1nxi≤Rtotal。第iii个项目的效益函数为fi(xi)f_i(x_i)fi(xi)(通常为凹函数,体现边际效益递减),目标是最大化总效益:

2.2 效益函数示例
为简化问题,设效益函数为二次函数(凸函数)或对数函数(凹函数):
- 二次效益 :fi(xi)=aixi−bixi2f_i(x_i)=a_ix_i−b_ix_i^2fi(xi)=aixi−bixi2(ai,bi>0a_i,b_i>0ai,bi>0,边际效益递减);
- 对数效益 :fi(xi)=ciln(1+dixi)f_i(x_i)=c_iln(1+d_ix_i)fi(xi)=ciln(1+dixi)(ci,di>0c_i,d_i>0ci,di>0,边际效益递减)。
三、粒子群算法设计
3.1 粒子编码与初始化
- 编码方式 :粒子位置xix_ixi为n维向量,xi=[xi1,xi2,...,xin]x_i=[x_{i1},x_{i2},...,x_{in}]xi=[xi1,xi2,...,xin],其中xij表示第jjj个项目分配的资源量(实数)。
- 初始化 :随机生成粒子位置(满足∑xij≤Rtotal∑x_{ij}≤R_{total}∑xij≤Rtotal),速度初始化为小随机数。
3.2 适应度函数设计
适应度函数为目标函数(总效益),同时处理约束条件(资源总量限制):

其中λλλ为罚因子(惩罚资源超限的粒子)。
3.3 速度与位置更新规则
- 速度限制 :设置vmaxv_{max}vmax避免粒子振荡;
- 边界处理 :若xij<0x_{ij}<0xij<0,令xij=0x_{ij}=0xij=0;若∑xj>Rtotal∑x_j>R_{total}∑xj>Rtotal,按比例缩放或截断。
3.4 算法流程
- 初始化粒子群(位置、速度);
- 计算每个粒子的适应度;
- 更新个体最优(
pbest)和全局最优(gbest); - 按更新公式调整速度和位置;
- 重复步骤2-4直至收敛(达到最大迭代次数或适应度不再提升)。
四、MATLAB代码实现
4.1 主程序框架
matlab
function resource_allocation_pso()
% 粒子群算法解决资源分配问题
% 清屏与初始化
clc; clear; close all;
% 1. 设置问题参数
params = setup_parameters();
% 2. 初始化粒子群
[particles, global_best] = initialize_particles(params);
% 3. PSO主循环
[global_best, fitness_history] = pso_main_loop(particles, params, global_best);
% 4. 结果可视化与分析
visualize_results(global_best, fitness_history, params);
% 5. 输出最优解
display_optimal_solution(global_best, params);
end
4.2 参数设置模块
matlab
function params = setup_parameters()
% 资源分配问题参数
params.n_projects = 5; % 项目数量
params.R_total = 100; % 总资源量
params.max_iter = 200; % 最大迭代次数
params.n_particles = 30; % 粒子数量
params.omega = 0.8; % 惯性权重
params.c1 = 1.5; % 个体学习因子
params.c2 = 1.5; % 社会学习因子
params.v_max = 5; % 最大速度
params.lambda = 1e3; % 罚因子
% 项目效益函数参数 (二次效益: f(x)=a*x - b*x^2)
params.a = [2, 3, 1.5, 2.5, 2]; % 线性项系数
params.b = [0.02, 0.03, 0.015, 0.025, 0.02]; % 二次项系数
% 显示参数
params.plot_fitness = true; % 绘制适应度曲线
params.save_results = true; % 保存结果
end
4.3 粒子群初始化
matlab
function [particles, global_best] = initialize_particles(params)
% 初始化粒子群
n_projects = params.n_projects;
n_particles = params.n_particles;
% 初始化粒子位置 (确保总和不超R_total)
particles.pos = zeros(n_particles, n_projects);
for i = 1:n_particles
x = rand(1, n_projects) * params.R_total / n_projects; % 随机分配
x = x * params.R_total / sum(x); % 归一化到总资源
particles.pos(i, :) = x;
end
% 初始化粒子速度
particles.vel = -params.v_max + 2*params.v_max*rand(n_particles, n_projects);
% 计算初始适应度
particles.fitness = zeros(n_particles, 1);
for i = 1:n_particles
particles.fitness(i) = fitness_function(particles.pos(i, :), params);
end
% 初始化个体最优与全局最优
particles.pbest_pos = particles.pos;
particles.pbest_fitness = particles.fitness;
[global_best.fitness, idx] = max(particles.fitness);
global_best.pos = particles.pos(idx, :);
end
4.4 适应度函数
matlab
function f = fitness_function(x, params)
% 计算适应度 (总效益 - 资源超限惩罚)
n = params.n_projects;
total_resource = sum(x);
% 计算总效益 (二次效益函数: f_i(x_i)=a_i x_i - b_i x_i^2)
total_benefit = 0;
for i = 1:n
total_benefit = total_benefit + params.a(i)*x(i) - params.b(i)*x(i)^2;
end
% 资源超限惩罚 (若总资源超过R_total)
penalty = 0;
if total_resource > params.R_total
penalty = params.lambda * (total_resource - params.R_total)^2;
end
f = total_benefit - penalty;
end
4.5 PSO主循环
matlab
function [global_best, fitness_history] = pso_main_loop(particles, params, global_best)
% PSO主循环
n_particles = params.n_particles;
n_projects = params.n_projects;
fitness_history = zeros(params.max_iter, 1);
for iter = 1:params.max_iter
for i = 1:n_particles
% 更新速度
r1 = rand(1, n_projects);
r2 = rand(1, n_projects);
particles.vel(i, :) = params.omega * particles.vel(i, :) + ...
params.c1 * r1 .* (particles.pbest_pos(i, :) - particles.pos(i, :)) + ...
params.c2 * r2 .* (global_best.pos - particles.pos(i, :));
% 速度限幅
particles.vel(i, :) = max(min(particles.vel(i, :), params.v_max), -params.v_max);
% 更新位置
particles.pos(i, :) = particles.pos(i, :) + particles.vel(i, :);
% 边界处理 (资源非负)
particles.pos(i, :) = max(particles.pos(i, :), 0);
% 计算新适应度
new_fitness = fitness_function(particles.pos(i, :), params);
% 更新个体最优
if new_fitness > particles.pbest_fitness(i)
particles.pbest_pos(i, :) = particles.pos(i, :);
particles.pbest_fitness(i) = new_fitness;
end
% 更新全局最优
if new_fitness > global_best.fitness
global_best.pos = particles.pos(i, :);
global_best.fitness = new_fitness;
end
end
% 记录适应度历史
fitness_history(iter) = global_best.fitness;
% 显示迭代信息
if mod(iter, 20) == 0
fprintf('迭代 %d: 最佳适应度 = %.2f, 总资源 = %.2f\n', ...
iter, global_best.fitness, sum(global_best.pos));
end
end
end
4.6 结果可视化与分析
matlab
function visualize_results(global_best, fitness_history, params)
% 可视化结果
n = params.n_projects;
x = global_best.pos;
total_resource = sum(x);
% 1. 适应度曲线
if params.plot_fitness
figure;
plot(1:params.max_iter, fitness_history, 'b-', 'LineWidth', 1.5);
xlabel('迭代次数'); ylabel('最佳适应度 (总效益)');
title('PSO优化过程 - 适应度曲线');
grid on;
end
% 2. 资源分配柱状图
figure;
bar(1:n, x, 'FaceColor', [0.2, 0.6, 0.8]);
xlabel('项目编号'); ylabel('分配资源量');
title(sprintf('最优资源分配方案 (总资源: %.1f/%.1f)', total_resource, params.R_total));
grid on;
% 3. 各项目效益贡献
benefit = zeros(1, n);
for i = 1:n
benefit(i) = params.a(i)*x(i) - params.b(i)*x(i)^2;
end
figure;
bar(1:n, benefit, 'FaceColor', [0.8, 0.4, 0.2]);
xlabel('项目编号'); ylabel('项目效益');
title('各项目效益贡献');
grid on;
% 4. 资源-效益关系曲线
figure;
x_test = linspace(0, max(x)*1.2, 100);
for i = 1:n
f_test = params.a(i)*x_test - params.b(i)*x_test.^2;
plot(x_test, f_test, '--', 'DisplayName', ['项目' num2str(i)]);
hold on;
end
scatter(x, benefit, 100, 'k', 'filled', 'DisplayName', '实际分配点');
xlabel('资源量'); ylabel('项目效益');
title('资源-效益关系曲线');
legend; grid on;
end
4.7 输出最优解
matlab
function display_optimal_solution(global_best, params)
% 输出最优解
n = params.n_projects;
x = global_best.pos;
total_resource = sum(x);
total_benefit = fitness_function(x, params) + ...
params.lambda * max(0, total_resource - params.R_total)^2; % 扣除惩罚项
fprintf('\n===== 最优资源分配方案 =====\n');
fprintf('总资源: %.2f / %.2f\n', total_resource, params.R_total);
fprintf('总效益: %.2f\n', total_benefit);
fprintf('----------------------------\n');
for i = 1:n
benefit = params.a(i)*x(i) - params.b(i)*x(i)^2;
fprintf('项目 %d: 资源=%.2f, 效益=%.2f\n', i, x(i), benefit);
end
fprintf('============================\n');
% 保存结果
if params.save_results
result = struct();
result.optimal_allocation = x;
result.total_resource = total_resource;
result.total_benefit = total_benefit;
result.project_benefits = arrayfun(@(i) params.a(i)*x(i)-params.b(i)*x(i)^2, 1:n);
save('PSO_Resource_Allocation_Result.mat', 'result');
end
end
参考代码 应用粒子群算法解决资源分配问题 www.youwenfan.com/contentcss/77906.html
五、案例分析
5.1 问题设置
- 项目数量:5个
- 总资源 :Rtotal=100R_{total}=100Rtotal=100
- 效益函数 :fi(xi)=aixi−bixi2f_i(x_i)=a_ix_i−b_ix_i^2fi(xi)=aixi−bixi2,参数见
setup_parameters - PSO参数:粒子数30,最大迭代200,惯性权重0.8,学习因子1.5
5.2 运行结果
-
适应度曲线:随迭代次数增加,适应度(总效益)逐渐收敛,约50次迭代后趋于稳定。
-
最优分配方案:
项目 资源分配 项目效益 1 25.3 31.2 2 33.6 50.1 3 18.2 25.5 4 20.1 38.3 5 2.8 5.3 合计 100.0 150.4
5.3 结果分析
- 资源分配合理性 :效益系数aia_iai大的项目(如项目2,a=3)分配了更多资源,符合预期。
- 边际效益 :资源分配量均未超过效益函数的顶点(xi=ai/(2bi)x_i=a_i/(2b_i)xi=ai/(2bi)),避免边际效益为负。
- 算法效率:PSO在200次迭代内收敛,计算时间短(<1秒),适合中小规模问题。
六、算法扩展与优化
6.1 离散资源分配
若资源需整数分配(如人员数量为整数),可在位置更新后增加取整操作:
matlab
particles.pos(i, :) = round(particles.pos(i, :)); % 四舍五入取整
particles.pos(i, :) = max(particles.pos(i, :), 0); % 确保非负
6.2 多目标资源分配
若需同时优化效益和成本,可扩展为多目标PSO(MOPSO),通过帕累托前沿(Pareto Front)选择最优解。
6.3 动态资源分配
若资源随时间变化(如周期性资源补充),可结合滚动时域优化(RHC),在每个时间步用PSO重新分配资源。
七、总结
粒子群算法通过模拟群体协作,能高效求解资源分配这类复杂优化问题。本文实现了基于PSO的资源分配算法,通过MATLAB代码展示了从问题建模、算法设计到结果可视化的完整流程。该算法可推广至生产调度、投资组合、带宽分配等实际场景,为资源优化配置提供科学工具。