粒子群算法求解燃气轮机冷热电联供运行优化
燃气轮机冷热电联供系统像是个会过日子的管家——既要发电又要供热制冷,还得把能耗和成本压到最低。这玩意儿涉及发电效率、余热回收、设备运行策略一堆变量,传统优化方法容易卡在局部最优解里出不来,这时候粒子群算法(PSO)这种群体智能算法就派上用场了。
先看个典型场景:某工业园区需要同时满足20MW电力、15MW热力和8MW冷量需求。系统包含燃气轮机、余热锅炉、电制冷机三个主要设备,我们的目标是找到每小时各设备的最佳出力组合,让每天运行成本最低。
上硬货,先定义适应度函数。这里我们把燃料成本、设备运维成本、购电成本都算进去:
def fitness_function(position): gt_power, whb_heat, ec_cool = position # 燃气耗量计算(二次函数模型) fuel_consumption = 0.3 * gt_power + 0.002 * gt_power**2 # 成本项计算 fuel_cost = fuel_consumption * gas_price maintenance_cost = gt_power*0.05 + whb_heat*0.1 + ec_cool*0.08 power_purchase = max(0, demand_power - gt_power) * grid_price # 约束惩罚项(供需不平衡时重罚) heat_balance = abs(whb_heat - demand_heat) * 1e6 cool_balance = abs(ec_cool - demand_cool) * 1e6 return fuel_cost + maintenance_cost + power_purchase + heat_balance + cool_balance这段代码有意思的地方在于约束处理——直接把供需不平衡量乘以1e6当惩罚项,简单粗暴但有效。实际工程中这种处理方式比拉格朗日乘子法更省事,特别是当约束条件复杂时。
接下来是PSO的核心迭代逻辑。注意这里给燃气轮机出力加了容量限制,毕竟实际运行不能超过设备铭牌参数:
class CCHP_PSO: def __init__(self, n_particles=50, max_iter=200): # 设备出力上下限 [燃气轮机, 余热锅炉, 电制冷机] self.bounds = np.array([[5, 25], [3, 18], [2, 10]]) self.max_velocity = 0.1 * (self.bounds[:,1] - self.bounds[:,0]) def optimize(self): # 初始化粒子位置和速度 positions = np.random.uniform(self.bounds[:,0], self.bounds[:,1], (n_particles, 3)) velocities = np.random.uniform(-self.max_velocity, self.max_velocity, (n_particles, 3)) while iter < max_iter: # 动态惯性权重,前期探索后期开发 w = 0.9 - 0.5 * (iter / max_iter) # 速度更新公式 velocities = w*velocities + c1*r1*(pbest_pos - positions) \ + c2*r2*(gbest_pos - positions) # 边界处理:反弹墙策略 over_upper = positions > self.bounds[:,1] positions[over_upper] = self.bounds[over_upper[:,0],1] velocities[over_upper] *= -0.5 # 同理处理下限... # 更新个体和全局最优 current_fitness = [fitness_function(pos) for pos in positions] pbest_update_mask = current_fitness < pbest_values pbest_values[pbest_update_mask] = current_fitness[pbest_update_mask] gbest_index = np.argmin(current_fitness) if current_fitness[gbest_index] < gbest_value: gbest_value = current_fitness[gbest_index] gbest_pos = positions[gbest_index].copy()这段代码有几个亮点:动态调整的惯性权重让算法前期满地图探索,后期精细搜索;速度更新时使用的认知项c1和社会项c2保持默认2.05效果就不错;碰到边界时不是简单截断而是让粒子"反弹"并减速,避免种群多样性过早丢失。
实际跑起来时发现,系统在早高峰时段(8:00-10:00)的优化结果很有意思——燃气轮机出力会拉到接近上限,同时余热锅炉全力运行。因为这时电价最高,自发自用比买电划算。而凌晨时段算法则倾向于降低燃气轮机出力,转买低谷电价,这时候余热锅炉只维持最低供热需求。
有个坑得注意:设备爬坡速率限制在代码里没体现,这会导致相邻时段优化结果跳变。解决方法是在24小时整体优化时,把时间耦合约束加进去,比如:
# 在适应度函数中增加相邻时段变化率惩罚 delta_gt = np.abs(current_gt_power - previous_gt_power) if delta_gt > max_ramp_rate: penalty += (delta_gt - max_ramp_rate) * 1e4这种时间维度的约束处理会让计算量翻倍,但能避免设备频繁启停。实测发现当粒子数从50增加到80时,收敛速度几乎没下降,毕竟现代计算库的矩阵运算优化确实给力。
最后说个实战技巧:别直接用最终代的最优解,把历代gbest存下来取帕累托前沿上的解,留给调度人员做决策更靠谱。毕竟实际运行还得考虑设备寿命、天气预测这些没写在数学模型里的因素。