粒子群(PSO)算法优化充电站选址定容(MATLAB源码) 给出集中充电站位置,和各种充点需求点以及周边界限,确定充电站的最优地址。

选址问题有多麻烦?看看外卖小哥每天跑断腿就懂了。充电站选址更复杂,得考虑居民区分布、电网负载、建设成本,活脱脱一个带约束的全局优化难题。老方法用遗传算法容易陷入局部最优,今天咱们换个路子——粒子群优化(PSO),这算法跟鸟群找食似的,特别适合多维空间寻优。

先上核心代码骨架:

% 粒子群参数
n_particles = 50;       % 鸟群规模
max_iter = 200;         % 最多飞几轮
w = 0.8;                % 惯性权重(决定方向保持力度)
c1 = 1.2;               % 自我认知系数
c2 = 1.7;               % 社会认知系数

% 初始化粒子群
particle_pos = rand(n_particles, 2) * area_size; % 随机撒点
particle_vel = zeros(n_particles, 2);            % 初速度清零
pbest_pos = particle_pos;                        % 个体最优记忆
pbest_val = inf(n_particles, 1);                 % 适应度初始值
gbest_pos = [0, 0];                              % 全局最优

这里有个骚操作:把充电站选址抽象为二维平面坐标寻优。每个粒子坐标代表一个候选站址,速度向量决定移动方向。适应度函数才是重头戏,得把建设成本、服务半径、需求满足率全揉进去:

function cost = fitness_func(position)
    % 计算到所有需求点的欧式距离
    distances = sqrt(sum((position - demand_points).^2, 2)); 
    
    % 服务覆盖率(500米内算覆盖)
    coverage = sum(distances <= 500) / num_demand;
    
    % 建设成本与土地价格正相关
    land_cost = land_price_matrix(round(position(1)), round(position(2)));
    
    % 加权适应度(需求满足率优先)
    cost = 0.6*(1-coverage) + 0.3*land_cost/max_price + 0.1*position_deviation;
    
    % 硬约束:不能超出行政边界
    if ~inpolygon(position(1), position(2), boundary_x, boundary_y)
        cost = cost + 1e6; % 惩罚项
    end
end

主循环里藏着粒子群的灵魂——速度更新公式。注意看这个动态权重调整,前期广撒网,后期精细搜:

for iter = 1:max_iter
    w = 0.9 - 0.5*(iter/max_iter); % 惯性权重递减
    
    for i = 1:n_particles
        % 速度更新(核心公式)
        vel = w * particle_vel(i,:) + ...
              c1*rand().*(pbest_pos(i,:) - particle_pos(i,:)) + ...
              c2*rand().*(gbest_pos - particle_pos(i,:));
        
        % 位置更新
        new_pos = particle_pos(i,:) + vel;
        
        % 评估新位置
        current_cost = fitness_func(new_pos);
        
        % 更新个体最优
        if current_cost < pbest_val(i)
            pbest_val(i) = current_cost;
            pbest_pos(i,:) = new_pos;
        end
    end
    
    % 更新全局最优
    [min_val, idx] = min(pbest_val);
    if min_val < gbest_val
        gbest_val = min_val;
        gbest_pos = pbest_pos(idx,:);
    end
end

实际跑起来发现几个反直觉的现象:最优选址往往不在需求点密集区中心,而是稍微偏向电网主干道方向。因为算法自动平衡了建设成本和服务效率——就像现实中的加油站,不会全开在市中心。

粒子群(PSO)算法优化充电站选址定容(MATLAB源码) 给出集中充电站位置,和各种充点需求点以及周边界限,确定充电站的最优地址。

参数调优有个秘诀:c2(社会认知系数)要比c1大20%左右,让粒子更倾向于向全局最优靠拢。迭代次数别超过200次,后期基本在震荡,白耗算力。

最后画个热力图更直观,红区就是最优选址候选:

contourf(X_grid, Y_grid, cost_map, 'LineColor','none');
hold on;
plot(gbest_pos(1), gbest_pos(2), 'wp', 'MarkerSize',20);
scatter(demand_points(:,1), demand_points(:,2), 'g.');

看到没?那个白色五角星的位置,兼顾了居民区(绿点密集区)和道路接入便利性,这就是算法的精明之处。下次给电动车找充电桩时,说不定你用的就是这套算法的变种呢。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐