文章目录
摘要
本周尝试建模运行对单污水处理厂使用粒子群算法进行优化的代码。此外,还阅读了一篇基于拥挤距离的动态多目标粒子群优化污水处理过程控制的文章,文章中针对污水处理过程能耗与出水水质之间的平衡问题,提出了一种基于拥挤距离的改进动态多目标粒子群优化算法(DMOPSO-CD)。该算法由优化模块和自组织模糊神经网络组成,提高了粒子的全局搜索能力。优化结果表明,在干旱、阴雨和暴雨天气下,污水处理EC分别降低了7.87%、6.28%和7.30%。
Abstract
This week, I read an article about dynamic multi-objective particle swarm optimization (DMOPSO) based on crowding distance for wastewater treatment process control. The article addresses the balance between energy consumption and effluent water quality in the wastewater treatment process and proposes an improved dynamic multi-objective particle swarm optimization algorithm based on crowding distance (DMOPSO-CD). This algorithm is composed of an optimization module and a self-organizing fuzzy neural network, which enhances the global search capability of the particles. The optimization results show that under drought, rainy, and stormy weather conditions, the energy consumption (EC) of wastewater treatment was reduced by 7.87%, 6.28%, and 7.30%, respectively. Additionally, I attempted to model and run a code for optimizing a single wastewater treatment plant using a particle swarm optimization algorithm.
粒子群优化
代码:
这段代码综合使用了数值计算、深度学习和优化算法来模拟和优化单个污水处理厂的能耗和水质改善。以下是对代码各部分的详细解释:
- 导入必要的库
python
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
import random
from matplotlib import rcParams
- numpy:用于数值计算和数组操作。
- torch及其子模块:用于构建和训练深度学习模型(LSTM)。
- matplotlib.pyplot:用于数据和结果的可视化。
- sklearn.preprocessing.StandardScaler:用于数据标准化。
- sklearn.metrics:用于评估模型性能(R²、均方误差、平均绝对误差)。
- random:用于生成随机数。
- matplotlib.rcParams:用于配置Matplotlib的绘图参数。
- 设置中文字体和图形配置
python
rcParams['font.sans-serif'] = ['Microsoft YaHei']
rcParams['axes.unicode_minus'] = False
- font.sans-serif:设置Matplotlib使用的中文字体为"Microsoft YaHei",确保图表中的中文能够正确显示。
- axes.unicode_minus:设置为False,以防止负号显示为方块。
- 固定随机数种子
python
# 固定 Python 随机数生成器的种子
random.seed(42)
# 固定 NumPy 随机数生成器的种子
np.random.seed(42)
# 固定 PyTorch 随机数生成器的种子(包括 CPU 和 GPU)
torch.manual_seed(42) # CPU 上的种子
torch.cuda.manual_seed(42) # GPU 上的种子
torch.cuda.manual_seed_all(42) # 所有 GPU 上的种子
固定随机数种子有助于确保实验的可重复性。无论何时运行代码,生成的随机数序列都是相同的,从而确保结果一致。
- 定义基于实际工艺的 Pij 矩阵模型
4.1 定义处理单元和污水处理厂信息
python
unit_info = {
"格栅池": {"能耗系数": 0.05, "水质系数": 0.1},
"曝气池": {"能耗系数": 0.3, "水质系数": 0.5},
"沉淀池": {"能耗系数": 0.1, "水质系数": 0.4},
"过滤池": {"能耗系数": 0.2, "水质系数": 0.3},
"排放口": {"能耗系数": 0.1, "水质系数": 0.2},
}
plant_info = {
"厂1": {"设计处理量": 20000, "日处理量": 15000, "运行负荷": 0.75},
"厂2": {"设计处理量": 80000, "日处理量": 90000, "运行负荷": 1.13},
"厂3": {"设计处理量": 20000, "日处理量": 21000, "运行负荷": 1.05},
"厂4": {"设计处理量": 1000, "日处理量": 1005, "运行负荷": 1.03},
}
- unit_info:包含不同处理单元(如格栅池、曝气池等)的能耗系数和水质系数。这些系数用于计算能耗和水质改善效果。
- plant_info:包含不同污水处理厂(厂1至厂4)的设计处理量、实际日处理量和运行负荷。运行负荷反映了实际处理量与设计处理量的比值。
4.2 定义 Pij 矩阵计算函数
python
def pij_matrix(plant, unit_inputs):
"""
计算 Pij 矩阵
plant: 处理厂名称
unit_inputs: 单元控制变量数组
"""
plant_data = plant_info[plant]
load_factor = plant_data["运行负荷"]
P = np.zeros((len(unit_info), 2))
for i, (unit, factors) in enumerate(unit_info.items()):
input_factor = unit_inputs[i]
P[i, 0] = factors["能耗系数"] * input_factor * load_factor # 能耗
P[i, 1] = factors["水质系数"] * input_factor / (1 + load_factor) # 水质改善
return P
- pij_matrix :根据所选处理厂和单元控制变量(
unit_inputs
),计算Pij矩阵。矩阵的每一行对应一个处理单元,包含两个值:- 第一个值为能耗:
能耗系数 * 控制变量 * 运行负荷
- 第二个值为水质改善:
水质系数 * 控制变量 / (1 + 运行负荷)
- 第一个值为能耗:
- 重新定义适应度函数
python
def fitness_function_with_penalty(plant, unit_inputs, penalty_weight=1000):
"""
计算适应度函数,加入惩罚机制
"""
P = pij_matrix(plant, unit_inputs)
energy_cost = np.sum(P[:, 0]) # 总能耗
water_quality = np.sum(P[:, 1]) # 水质指标
# 加入惩罚机制:若控制变量趋近于 0,则惩罚
penalty = penalty_weight * (np.sum(unit_inputs == 0)) # 对全 0 解加入惩罚
# 平衡能耗和水质改善目标,权重可根据实际需求调整
total_fitness = energy_cost * 0.6 + water_quality * 0.4 + penalty
return total_fitness, energy_cost, water_quality
- fitness_function_with_penalty :计算适应度函数,同时加入惩罚机制。
- 能耗 和水质改善分别通过Pij矩阵的求和获得。
- 惩罚机制:当控制变量中有变量为0时,增加惩罚项,以避免不合理的解(例如全部控制变量为0)。
- 总适应度:通过加权求和平衡能耗和水质改善,权重分别为0.6和0.4,同时加入惩罚项。
- 定义LSTM深度学习模型
python
class LSTMModel(nn.Module):
def __init__(self, input_size, hidden_size, output_size, num_layers):
super(LSTMModel, self).__init__()
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
# 确保输入 x 的维度为 (batch_size, seq_length, input_size)
if x.dim() == 2: # 如果是 2D 数据 (batch_size, input_size)
x = x.unsqueeze(1) # 添加时间步维度,变成 (batch_size, seq_length=1, input_size)
# 动态初始化隐藏层状态和细胞状态
batch_size = x.size(0)
h_0 = torch.zeros(num_layers, batch_size, hidden_size).to(x.device)
c_0 = torch.zeros(num_layers, batch_size, hidden_size).to(x.device)
# 前向传播
out, _ = self.lstm(x, (h_0, c_0)) # LSTM 输出
out = self.fc(out[:, -1, :]) # 全连接层 (取最后一个时间步的输出)
return out
- LSTMModel :基于PyTorch的LSTM模型,用于预测能耗和水质改善。
- 初始化 :
input_size
:输入特征的维度。hidden_size
:LSTM隐藏层的维度。output_size
:输出的维度,这里为2(能耗和水质改善)。num_layers
:LSTM的层数。
- forward方法 :
- 确保输入的维度为(batch_size, seq_length, input_size)。
- 动态初始化LSTM的隐藏状态和细胞状态。
- 通过LSTM层进行前向传播,取最后一个时间步的输出,再通过全连接层得到最终输出。
- 初始化 :
- 数据标准化
7.1 数据生成函数
python
def generate_data(num_samples=1000):
np.random.seed(42)
plants = list(plant_info.keys())
data = []
targets = []
for _ in range(num_samples):
plant = np.random.choice(plants)
inputs = np.random.rand(len(unit_info)) * 100 # 随机生成单元控制变量
_, energy_cost, water_quality = fitness_function_with_penalty(plant, inputs)
target = [energy_cost, water_quality] # 返回两个目标
data.append(inputs)
targets.append(target)
return np.array(data), np.array(targets)
- generate_data :生成模拟数据。
- 随机选择一个处理厂。
- 随机生成各处理单元的控制变量(范围0-100)。
- 计算对应的能耗和水质改善作为目标。
- 返回输入数据和目标数据。
7.2 数据初始化和标准化
python
# 初始化数据
X, Y = generate_data()
X_train, X_test = X[:800], X[800:]
Y_train, Y_test = Y[:800], Y[800:]
# 只标准化目标值的前两列
scaler_X = StandardScaler()
scaler_Y = StandardScaler()
X_train = scaler_X.fit_transform(X_train)
X_test = scaler_X.transform(X_test)
Y_train = scaler_Y.fit_transform(Y_train[:, :2]) # 仅标准化 [energy_cost, water_quality]
Y_test = scaler_Y.transform(Y_test[:, :2])
- 生成数据:生成1000个样本。
- 划分训练集和测试集:前800个样本作为训练集,后200个作为测试集。
- 标准化 :
- 使用
StandardScaler
对输入数据(X)和目标数据(Y)的前两列(能耗和水质改善)进行标准化,使其均值为0,标准差为1,有助于加快模型训练和提升性能。
- 使用
7.3 转换为PyTorch张量
python
# 转换为 PyTorch 张量
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
X_train = torch.tensor(X_train, dtype=torch.float32).to(device)
Y_train = torch.tensor(Y_train, dtype=torch.float32).to(device)
X_test = torch.tensor(X_test, dtype=torch.float32).to(device)
Y_test = torch.tensor(Y_test, dtype=torch.float32).to(device)
# 确保输入数据的形状
X_train = X_train.unsqueeze(1) # 添加时间步维度,形状变为 (batch_size, seq_length=1, input_size)
X_test = X_test.unsqueeze(1) # 同样处理测试集
- 设备选择:如果有GPU可用,则使用GPU,否则使用CPU。
- 转换为张量:将标准化后的数据转换为PyTorch张量,并移动到指定设备(CPU或GPU)。
- 调整形状:LSTM需要输入的形状为(batch_size, seq_length, input_size),因此对训练集和测试集的输入数据添加时间步维度(seq_length=1)。
- LSTM模型训练
8.1 定义模型参数
python
# 模型参数
input_size = X_train.shape[2] # 特征数
hidden_size = 64
output_size = 2
num_layers = 2
num_epochs = 100
batch_size = 32
learning_rate = 0.001
- input_size:输入特征的数量(对应处理单元的数量)。
- hidden_size:LSTM隐藏层的神经元数量。
- output_size:输出的维度,这里为2(能耗和水质改善)。
- num_layers:LSTM的层数。
- num_epochs:训练轮数。
- batch_size:批次大小(在本代码中未使用,因为全部数据一次性输入)。
- learning_rate:优化器的学习率。
8.2 初始化模型、损失函数和优化器
python
# 定义 LSTM 模型
model = LSTMModel(input_size, hidden_size, output_size, num_layers).to(device)
# 损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
- 模型初始化:创建LSTM模型实例,并将其移动到指定设备。
- 损失函数:使用均方误差(MSE)作为损失函数,适用于回归任务。
- 优化器:使用Adam优化器,具有自适应学习率的优点。
8.3 训练过程
python
# 模型训练
train_losses = []
for epoch in range(num_epochs):
model.train()
optimizer.zero_grad()
outputs = model(X_train) # 输入形状为 (batch_size, seq_length, input_size)
loss = criterion(outputs, Y_train)
loss.backward()
optimizer.step()
train_losses.append(loss.item())
print(f"Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}")
- 训练循环 :
- model.train():设置模型为训练模式(启用Dropout等)。
- optimizer.zero_grad():清除梯度。
- forward pass:将训练数据输入模型,得到输出。
- 计算损失:计算预测输出与真实值之间的MSE。
- backward pass:反向传播计算梯度。
- 优化参数:根据梯度更新模型参数。
- 记录损失:保存每个epoch的损失值,用于后续可视化。
- 打印损失:输出每个epoch的损失值,便于监控训练进展。
8.4 可视化训练过程
python
# 可视化训练过程
plt.figure(figsize=(10, 5))
plt.plot(train_losses, label="Training Loss")
plt.xlabel("Epoch")
plt.ylabel("Loss")
plt.title("LSTM Training Loss")
plt.legend()
plt.show()
- 绘制损失曲线:显示训练过程中损失值的变化趋势,有助于判断模型是否收敛。
- 模型预测及性能评估
9.1 模型预测
python
# 预测
model.eval()
with torch.no_grad():
Y_train_pred = model(X_train).cpu().numpy()
Y_test_pred = model(X_test).cpu().numpy()
- model.eval():设置模型为评估模式(禁用Dropout等)。
- torch.no_grad():在预测时关闭梯度计算,节省内存和计算资源。
- 预测结果:将训练集和测试集输入模型,得到预测结果,并转换为NumPy数组。
9.2 反标准化预测结果
python
# 反标准化预测结果
Y_train_pred = scaler_Y.inverse_transform(Y_train_pred)
Y_test_pred = scaler_Y.inverse_transform(Y_test_pred)
Y_train = scaler_Y.inverse_transform(Y_train.cpu().numpy())
Y_test = scaler_Y.inverse_transform(Y_test.cpu().numpy())
- 反标准化:将标准化后的预测结果和真实值反标准化回原始尺度,以便于后续的评估和解释。
9.3 计算评估指标
python
# 计算 R2、RMSE 和 MAE
train_r2 = r2_score(Y_train, Y_train_pred)
test_r2 = r2_score(Y_test, Y_test_pred)
train_rmse = np.sqrt(mean_squared_error(Y_train, Y_train_pred))
test_rmse = np.sqrt(mean_squared_error(Y_test, Y_test_pred))
train_mae = mean_absolute_error(Y_train, Y_train_pred)
test_mae = mean_absolute_error(Y_test, Y_test_pred)
print(f"Train R2: {train_r2:.4f}, Train RMSE: {train_rmse:.4f}, Train MAE: {train_mae:.4f}")
print(f"Test R2: {test_r2:.4f}, Test RMSE: {test_rmse:.4f}, Test MAE: {test_mae:.4f}")
- R²(决定系数):衡量模型对数据的拟合程度,值越接近1表示拟合越好。
- RMSE(均方根误差):衡量预测值与真实值之间的平均差异,值越小表示预测越精确。
- MAE(平均绝对误差):衡量预测值与真实值之间的平均绝对差异,值越小表示预测越精确。
9.4 可视化预测结果
python
# 可视化预测结果
plt.figure(figsize=(12, 6))
# 绘制训练集结果
plt.subplot(1, 2, 1)
plt.plot(Y_train[:, 0], label="True Train Values", color='blue') # 绘制第一个目标变量
plt.plot(Y_train_pred[:, 0], label="Predicted Train Values", color='green') # 绘制预测值
plt.xlabel("Sample Index")
plt.ylabel("Energy Cost / Water Quality")
plt.title("Training Data Prediction")
plt.legend()
# 绘制测试集结果
plt.subplot(1, 2, 2)
plt.plot(Y_test[:, 0], label="True Test Values", color='blue') # 绘制第一个目标变量
plt.plot(Y_test_pred[:, 0], label="Predicted Test Values", color='green') # 绘制预测值
plt.xlabel("Sample Index")
plt.ylabel("Energy Cost / Water Quality")
plt.title("Test Data Prediction")
plt.legend()
plt.tight_layout()
plt.show()
- 训练集预测结果:比较真实值和预测值,评估模型在训练集上的表现。
- 测试集预测结果:比较真实值和预测值,评估模型在测试集上的泛化能力。
- 粒子群优化(PSO实现)
10.1 定义粒子类
python
class Particle:
def __init__(self, bounds):
self.position = np.random.uniform(bounds[:, 0], bounds[:, 1]) # 初始化位置
self.velocity = np.random.uniform(-1, 1, bounds.shape[0]) # 初始化速度
self.best_position = self.position.copy()
self.best_score = float('inf') # 初始化最优分数
self.score = float('inf') # 当前分数
def update_velocity(self, global_best_position, w=0.9, c1=1.5, c2=1.5):
inertia = w * self.velocity # 惯性
cognitive = c1 * np.random.random() * (self.best_position - self.position) # 认知部分
social = c2 * np.random.random() * (global_best_position - self.position) # 社会部分
self.velocity = inertia + cognitive + social
def update_position(self, bounds):
self.position += self.velocity
self.position = np.clip(self.position, bounds[:, 0], bounds[:, 1]) # 限制在范围内
- Particle类 :表示PSO中的一个粒子,包含位置、速度、个人最优位置和分数。
- 初始化 :
- 位置:在给定边界范围内随机初始化。
- 速度:在-1到1之间随机初始化。
- best_position:个人最佳位置,初始为当前位置。
- best_score 和score:分别表示个人最佳分数和当前分数,初始为无穷大。
- update_velocity:根据惯性、认知和社会部分更新粒子的速度。
- update_position:根据更新后的速度更新粒子的位置,并将其限制在边界范围内。
- 初始化 :
10.2 定义改进的PSO算法
python
def improved_pso(plant, num_particles, num_iterations, bounds):
"""
改进的粒子群优化
"""
particles = [Particle(bounds) for _ in range(num_particles)]
global_best_position = None
global_best_score = float('inf')
pareto_front = [] # 保存 Pareto 前沿解集
for iteration in range(num_iterations):
w = 0.9 - 0.5 * (iteration / num_iterations) # 动态调整惯性系数
for particle in particles:
# 计算适应度值
total_fitness, energy_cost, water_quality = fitness_function_with_penalty(plant, particle.position)
particle.score = total_fitness
if particle.score < particle.best_score:
particle.best_score = particle.score
particle.best_position = particle.position.copy()
# 更新全局最优
for particle in particles:
if particle.best_score < global_best_score:
global_best_score = particle.best_score
global_best_position = particle.best_position.copy()
# 保存 Pareto 前沿点
pareto_front.append((global_best_position.copy(), global_best_score))
# 更新粒子速度和位置
for particle in particles:
particle.update_velocity(global_best_position, w=w)
particle.update_position(bounds)
print(f"Iteration {iteration + 1}/{num_iterations}, Best Score: {global_best_score}")
return global_best_position, global_best_score, pareto_front
- improved_pso :实现改进的PSO算法,用于优化污水处理厂的控制变量,以最小化能耗和最大化水质改善。
- 参数 :
plant
:目标处理厂名称。num_particles
:粒子数量。num_iterations
:迭代次数。bounds
:控制变量的边界范围。
- 过程 :
- 初始化粒子群:创建指定数量的粒子,随机初始化位置和速度。
- 迭代优化 :
- 动态调整惯性系数(w):随着迭代进行,惯性系数逐渐减小,平衡探索和开发。
- 计算适应度:对每个粒子的位置计算适应度(总能耗和水质改善)。
- 更新个人最佳:如果当前分数优于个人最佳分数,则更新个人最佳位置和分数。
- 更新全局最佳:在所有粒子中找到全局最佳分数和位置。
- 保存Pareto前沿:记录每次迭代的全局最佳解。
- 更新粒子速度和位置:根据全局最佳位置和当前粒子的最佳位置更新速度和位置。
- 打印当前迭代的最佳分数。
- 返回值:全局最佳位置、最佳分数和Pareto前沿解集。
- 参数 :
- 执行优化并可视化结果
11.1 设置控制变量范围
python
bounds = np.array([[0, 100]] * len(unit_info)) # 调整控制变量范围
- bounds:控制变量的范围为0到100,对应每个处理单元的控制变量。
11.2 执行PSO优化
python
# 执行改进后的 PSO 优化
best_position, best_score, pareto_front = improved_pso("厂1", 30, 50, bounds)
- 优化参数 :
- plant:选择"厂1"进行优化。
- num_particles:30个粒子。
- num_iterations:50次迭代。
- bounds:控制变量的范围。
11.3 提取并可视化Pareto前沿
python
# 转换为 NumPy 数组
positions = np.array([point[0] for point in pareto_front]) # 提取所有的 global_best_position
scores = np.array([point[1] for point in pareto_front]) # 提取所有的 global_best_score
# 可视化 Pareto 前沿
pareto_energy = []
pareto_quality = []
for position in positions:
_, energy_cost, water_quality = fitness_function_with_penalty("厂1", position)
pareto_energy.append(energy_cost)
pareto_quality.append(water_quality)
pareto_energy = np.array(pareto_energy)
pareto_quality = np.array(pareto_quality)
plt.figure(figsize=(10, 6))
plt.scatter(pareto_energy, pareto_quality, c=np.arange(len(pareto_energy)), cmap="viridis", label="Pareto Front")
plt.colorbar(label="Iteration") # 使用颜色表示迭代次数
plt.xlabel("Energy Cost (能耗)")
plt.ylabel("Water Quality Improvement (水质改善)")
plt.title("Pareto Front Visualization (Improved PSO)")
plt.legend()
plt.grid()
plt.show()
- 提取Pareto前沿 :
- positions:保存所有迭代中全局最佳位置。
- scores:保存所有迭代中全局最佳分数。
- 计算Pareto能耗和水质改善:根据位置计算对应的能耗和水质改善值。
- 绘制Pareto前沿 :
- 使用散点图显示能耗和水质改善的关系,颜色表示迭代次数,展示优化过程中的解集演化。
11.4 可视化全局最优目标值变化
python
# 可视化全局最优目标值变化
plt.figure(figsize=(10, 5))
plt.plot(scores, label="Objective Score (Global Best)")
plt.xlabel("Iteration")
plt.ylabel("Objective Value (Global Best Score)")
plt.title("PSO Optimization Progress")
plt.legend()
plt.show()
- 绘制全局最优分数变化:显示随着迭代进行,全球最佳分数的变化趋势,评估优化过程的收敛情况。
11.5 输出最佳参数和最优目标
python
print(f"最佳参数: {best_position}, 最优目标: {best_score}")
- 打印结果:输出最终找到的最佳控制变量参数和对应的最优目标分数。
- 示例输出
plaintext
Epoch [100/100], Loss: 0.1602
Train R2: 0.8398, Train RMSE: 4.9950, Train MAE: 3.9237
Test R2: 0.8659, Test RMSE: 4.6309, Test MAE: 3.6702
Iteration 50/50, Best Score: 0.03169447697665797
最佳参数: [0.21811694 0.00255149 0.03799073 0.04724564 0.09359534],
最优目标: 0.03169447697665797
- 训练结束后的损失:最后一个epoch的损失为0.1602。
- 训练集性能 :
- R²:0.8398,表示模型对训练数据有较好的拟合。
- RMSE:4.9950,表示预测值与真实值之间的均方根误差。
- MAE:3.9237,表示预测值与真实值之间的平均绝对误差。
- 测试集性能 :
- R²:0.8659,表示模型在测试数据上也有良好的表现。
- RMSE:4.6309。
- MAE:3.6702。
- PSO优化结果 :
- 最佳参数:控制变量的最佳组合,如[0.21811694, 0.00255149, 0.03799073, 0.04724564, 0.09359534]。
- 最优目标:0.03169447697665797,表示最优适应度值。
文献
研究背景
随着全球人口的急剧增长和城市化的快速推进,污水处理系统作为城市基础设施的重要组成部分,其优化与改进变得尤为重要。污水处理的核心目标不仅是通过各种处理工艺确保出水质量达到环保标准,还需要在能耗和经济成本上做到最优。这一过程尤其重要,因为污水处理工艺通常涉及复杂的多变量系统,这些变量彼此之间存在高度的耦合性和非线性关系,且外部条件如天气、污水成分和处理负荷的波动性增加了控制和优化的难度。
污水处理面临的挑战
1)能耗与出水质量的权衡问题: 污水处理的核心挑战在于如何在维持出水质量的同时尽可能降低能耗。出水质量通常由多个关键指标(如化学需氧量 COD、生化需氧量 BOD、悬浮物 SS、氨氮 NH₄⁺-N 和总氮 TN)决定,而能耗主要集中在曝气、回流和其他机械操作上。由于目标之间存在冲突(如提高出水质量可能需要增加曝气时间和能耗),传统单目标优化方法难以找到理想的解决方案。
2)污水成分的复杂性与动态变化: 污水的成分随着工业废水排放、季节性变化和降雨等因素的影响而变得复杂且动态。污水处理厂需要实时调整参数以应对这些变化,这对控制系统的反应速度和稳定性提出了更高要求。
3)非线性和不确定性问题: 污水处理过程本质上是一个多阶段、多环节的复杂生化反应系统,具有强非线性、时间变化和不确定性的特征。这使得处理单元之间的耦合关系更加复杂,局部优化可能无法保证系统整体的最优。
4)多目标优化的必要性: 单一目标优化方法无法同时平衡出水质量和能耗。随着智能算法的发展,多目标优化逐渐成为解决该问题的重要方向。它能够在多个冲突目标之间找到一种权衡解决方案,例如通过 Pareto 最优解集实现能耗和出水质量的同步优化。
现有优化方法的局限性
1)传统方法的局限性: 传统的污水处理优化方法依赖于经验公式或线性规划,难以应对复杂动态变化的污水处理系统。此外,这些方法通常不能捕捉污水处理过程中非线性、多变量的特性,导致优化效果不理想。
2)神经网络与优化方法的结合: 近年来,人工神经网络(ANN)和模糊控制系统被用于建模污水处理过程中的非线性关系。尽管这些方法能够提高建模的准确性,但它们通常仅关注单一目标,忽略了能耗和出水质量之间的平衡。
3)动态条件下的适应性问题: 很多优化算法在静态或简单动态环境下表现较好,但在处理复杂天气(如暴雨或旱情)或高波动性污水流量时表现不足。这是由于这些方法无法动态调整参数,导致系统在面对突发状况时反应迟缓甚至失效。
研究方法
文章提出了一种动态多目标粒子群优化算法(Dynamic Multi-objective Particle Swarm Optimization Based on Crowding Distance, DMOPSO-CD)并结合了自组织模糊神经网络(Self-Organizing Fuzzy Neural Network, SOFNN)来优化污水处理过程,旨在降低能耗(Energy Consumption, EC)并确保出水质量(Effluent Quality, EQ)。研究方法主要包含以下部分:
基于BSM1仿真平台的污水处理建模
污水处理系统的描述
- 模型架构:采用Benchmark Simulation Model No.1 (BSM1) 平台,该平台包含五个活性污泥池(包括两个缺氧池和三个好氧池)和一个二级沉淀池。通过活性污泥池完成硝化和反硝化过程,通过二级沉淀池进行泥水分离。
- 核心变量:各池的流量(Q)、氧传递系数(KLa)、反应速率(R)、污泥浓度(Zas),以及溶解氧(DO)和硝酸盐浓度(SNO)的动态变化。
动态建模方程
BSM1模型通过以下差分方程描述污水处理的物质平衡和动态变化:
- 活性污泥池物质平衡方程 :
对于第 k k k 个池:
d Z a s , k d t = 1 V a s , k ( Q k − 1 Z a s , k − 1 − Q k Z a s , k + R k V a s , k ) \frac{dZ_{as,k}}{dt} = \frac{1}{V_{as,k}} \left( Q_{k-1} Z_{as,k-1} - Q_k Z_{as,k} + R_k V_{as,k} \right) dtdZas,k=Vas,k1(Qk−1Zas,k−1−QkZas,k+RkVas,k)
其中:
- Q k − 1 Q_{k-1} Qk−1:进入第 k k k 池的流量。
- Z a s , k Z_{as,k} Zas,k:第 k k k 池中的污泥浓度。
- V a s , k V_{as,k} Vas,k:第 k k k 池的体积。
- R k R_k Rk:反应速率。
- 溶解氧平衡方程:
d S O , a s , k d t = 1 V a s , k ( Q k − 1 S O , a s , k − 1 − Q k S O , a s , k + K L a k V a s , k ( S O ∗ − S O , a s , k ) ) \frac{dS_{O,as,k}}{dt} = \frac{1}{V_{as,k}} \left( Q_{k-1} S_{O,as,k-1} - Q_k S_{O,as,k} + KLa_k V_{as,k} (S^*O - S{O,as,k}) \right) dtdSO,as,k=Vas,k1(Qk−1SO,as,k−1−QkSO,as,k+KLakVas,k(SO∗−SO,as,k))
其中:
- S O , a s , k S_{O,as,k} SO,as,k:第 k k k 池中的溶解氧浓度。
- S O ∗ S^*_O SO∗:氧的饱和浓度,设为 8 g / m 3 8 \, g/m^3 8g/m3。
- K L a k KLa_k KLak:氧传递系数。
- 二级沉淀池沉降速率模型 :
使用双指数函数描述沉降速率:
v s ( X ) = max [ 0 , v 0 ′ , v 0 ( e − r h ( X − X m i n ) − e − r p ( X − X m i n ) ) ] v_s(X) = \max \left[ 0, v'0, v_0 \left( e^{-r_h(X-X{min})} - e^{-r_p(X-X_{min})} \right) \right] vs(X)=max[0,v0′,v0(e−rh(X−Xmin)−e−rp(X−Xmin))]
其中:
- v s ( X ) v_s(X) vs(X):沉降速率。
- v 0 v_0 v0、 v 0 ′ v'_0 v0′:沉降系数。
- r h r_h rh、 r p r_p rp:沉降速率变化参数。
目标函数与约束条件
多目标优化的目标函数包括:
- 能耗(EC):
E C = A E + P E EC = AE + PE EC=AE+PE
其中:
- A E AE AE:曝气能耗。
A E = 1 1800 ⋅ T ∫ k T ( k + 1 ) T ∑ i = 1 5 V i ⋅ K L a i ( t ) d t AE = \frac{1}{1800 \cdot T} \int_{kT}^{(k+1)T} \sum_{i=1}^5 V_i \cdot KLa_i(t) \, dt AE=1800⋅T1∫kT(k+1)Ti=1∑5Vi⋅KLai(t)dt
- P E PE PE:泵能耗。
P E = 1 1000 ⋅ T ∫ k T ( k + 1 ) T [ 0.004 Q a ( t ) + 0.05 Q w ( t ) + 0.008 Q r ( t ) ] d t PE = \frac{1}{1000 \cdot T} \int_{kT}^{(k+1)T} \left[ 0.004Q_a(t) + 0.05Q_w(t) + 0.008Q_r(t) \right] dt PE=1000⋅T1∫kT(k+1)T[0.004Qa(t)+0.05Qw(t)+0.008Qr(t)]dt
- 出水质量(EQ) :
E Q = 1 1000 ⋅ T ∫ k T ( k + 1 ) T [ C O D e ( t ) + 2 B O D e ( t ) + 2 S S e ( t ) + 10 N H 4 + − N ( t ) + 30 T N ( t ) ] Q e ( t ) d t EQ = \frac{1}{1000 \cdot T} \int_{kT}^{(k+1)T} \left[ COD_e(t) + 2BOD_e(t) + 2SS_e(t) + 10NH_4^+-N(t) + 30TN(t) \right] Q_e(t) dt EQ=1000⋅T1∫kT(k+1)T[CODe(t)+2BODe(t)+2SSe(t)+10NH4+−N(t)+30TN(t)]Qe(t)dt
其中:
- C O D e COD_e CODe、 B O D e BOD_e BODe、 S S e SS_e SSe:化学需氧量、生化需氧量和悬浮固体浓度。
- N H 4 + − N NH_4^+-N NH4+−N、 T N TN TN:氨氮和总氮浓度。
优化目标
在满足以下约束条件的情况下,最小化 E C EC EC 和 E Q EQ EQ:
C O D e ≤ 100 mg/L , B O D e ≤ 10 mg/L , N H 4 + − N ≤ 4 mg/L , T N ≤ 18 mg/L , S S e ≤ 30 mg/L . \begin{aligned} COD_e &\leq 100 \, \text{mg/L}, \\ BOD_e &\leq 10 \, \text{mg/L}, \\ NH_4^+-N &\leq 4 \, \text{mg/L}, \\ TN &\leq 18 \, \text{mg/L}, \\ SS_e &\leq 30 \, \text{mg/L}. \end{aligned} CODeBODeNH4+−NTNSSe≤100mg/L,≤10mg/L,≤4mg/L,≤18mg/L,≤30mg/L.
动态多目标粒子群优化算法(DMOPSO-CD)
粒子群优化的核心公式
粒子的位置和速度更新公式如下:
- 速度更新:
v i ( t + 1 ) = ω v i ( t ) + c 1 ⋅ r a n d ⋅ ( P b e s t − x i ( t ) ) + c 2 ⋅ r a n d ⋅ ( G b e s t − x i ( t ) ) v_i(t+1) = \omega v_i(t) + c_1 \cdot rand \cdot (P_{best} - x_i(t)) + c_2 \cdot rand \cdot (G_{best} - x_i(t)) vi(t+1)=ωvi(t)+c1⋅rand⋅(Pbest−xi(t))+c2⋅rand⋅(Gbest−xi(t))
- 位置更新:
x i ( t + 1 ) = x i ( t ) + v i ( t + 1 ) x_i(t+1) = x_i(t) + v_i(t+1) xi(t+1)=xi(t)+vi(t+1)
其中:
- ω \omega ω:惯性权重,控制全局和局部搜索能力。
- c 1 c_1 c1、 c 2 c_2 c2:学习因子,用于调节个体和群体的搜索能力。
动态参数调整
惯性权重 ω \omega ω 和学习因子 c 1 c_1 c1、 c 2 c_2 c2 动态调整公式:
1.惯性权重:
ω ( t ) = − 0.45 ⋅ i t e r i t e r m a x + 0.95 \omega(t) = -0.45 \cdot \frac{iter}{iter_{max}} + 0.95 ω(t)=−0.45⋅itermaxiter+0.95
- 学习因子:
c 1 ( t ) = − 0.7 ⋅ i t e r i t e r m a x + 1.5 c_1(t) = -0.7 \cdot \frac{iter}{iter_{max}} + 1.5 c1(t)=−0.7⋅itermaxiter+1.5
拥挤距离排序
为了维护解集的多样性,使用拥挤距离估计非劣解邻域的解密度,并重新排序粒子位置。
小概率变异机制
变异速度和位置:
v i ∗ = r a n d ( 0 , 1 ) ⋅ θ ⋅ δ ⋅ v v^*_i = rand(0,1) \cdot \theta \cdot \delta \cdot v vi∗=rand(0,1)⋅θ⋅δ⋅v
x i ∗ = x + v i ∗ x^*_i = x + v^*_i xi∗=x+vi∗
- 其中 θ \theta θ 为随机方向, δ \delta δ 为变异步长。
多目标优化控制架构(SOFNN)
SOFNN控制器
SOFNN基于模糊规则动态调整控制参数,其输出公式为:
y p = ∑ j = 1 n w j τ ϕ j = ∑ j = 1 n [ w j ⋅ exp ( − ∥ x − c j ∥ 2 δ j 2 ) ] ∑ j = 1 n exp ( − ∥ x − c j ∥ 2 δ j 2 ) y_p = \sum_{j=1}^n w_j \tau \phi_j = \frac{\sum_{j=1}^n \left[w_j \cdot \exp\left(-\frac{\|x - c_j\|^2}{\delta_j^2}\right)\right]}{\sum_{j=1}^n \exp\left(-\frac{\|x - c_j\|^2}{\delta_j^2}\right)} yp=j=1∑nwjτϕj=∑j=1nexp(−δj2∥x−cj∥2)∑j=1n[wj⋅exp(−δj2∥x−cj∥2)]
其中:
- c j c_j cj、 δ j \delta_j δj:模糊规则的中心和宽度参数。
- w j w_j wj:连接权重。
研究过程
- 数据预处理:从BSM1平台生成300组样本数据,包括输入变量(如溶解氧、硝酸盐浓度等)和目标变量(能耗和出水质量)。
- 目标设定与Pareto解集生成:使用DMOPSO-CD生成能耗和出水质量之间的Pareto解集。
- SOFNN控制器追踪 :动态调整氧传递系数 K L a 5 KLa_5 KLa5 和回流量 Q a Q_a Qa,实现对目标值的实时追踪。
- 算法验证:在干旱、雨天和暴雨三种气象条件下验证算法的性能,通过仿真分析结果。
研究结果与分析
优化效果:DMOPSO-CD算法在三种天气条件下均表现出较优的优化效果,与其他算法(如NSGA-II、SPEA2等)相比,展现了更好的解集收敛性和多样性。
能耗与出水质量改善:
干旱天气下,能耗减少7.30%,出水质量提高6.98%。雨天条件下,能耗减少6.28%,出水质量提高7.97%。
暴雨条件下,能耗减少7.87%,出水质量提高9.03%。
动态跟踪能力:SOFNN能够有效跟踪设定值,误差范围保持在0.05 mg/L以内,即使在暴雨等复杂条件下,也能维持系统稳定。
总结
DMOPSO-CD算法通过动态调整参数和平衡全局与局部搜索能力,能够实现污水处理过程中的实时优化,显著降低能耗并确保出水质量达标。该方法在不同气象条件下均表现出良好的鲁棒性和适应性,展示了在真实污水处理场景中的应用前景。