多目标优化中目标函数的编写
管网污染情况下水质监测传感器布设
实验介绍
使用EPANET2进行污染物注入实验,设置水力模拟时间为12小时,步长为1小时,水质模拟时间为5分钟一次,报告为5分钟一次,逐个对管网节点以固定速率注入污染物,得到管网其他节点最开始出现污染物的时间,由此可以得到一个时间监测矩阵,行为污染事件,列为节点编号,值为污染事件发生时某节点最开始出现污染物的时间
矩阵大致如图:
10,20,30,50,40,45,35, ... 15,45,55,60,70,65,20,25
10,20,30,50,40,45,35, ... 15,45,55,60,70,65,20,25
40,50,75,80,90,95,25, ... 65,70,25,90,80,95,35,10
40,50,75,80,90,95,25, ... 65,70,25,90,80,95,35,10
...
...
40,50,75,80,90,95,25, ... 65,70,25,90,80,95,35,10
10,20,30,50,40,45,35, ... 15,45,55,60,70,65,20,25
10,20,30,50,40,45,35, ... 15,45,55,90,80,95,35,10
40,50,75,80,90,95,25, ... 65,70,25,90,80,95,35,10
40,50,75,80,90,95,25, ... 65,70,25,90,80,95,35,10
目标介绍
- 最小化监测时间
使得选择的节点对应的监测时间尽可能的小 - 最大化监测比率
使得选择的节点能够监测到的污染事件比例尽可能的高(设定一个时间阀值,大于这个时间的则认为该污染事件无法被监测)
Python代码
import csv
import numpy as np
def fitness1(x):
result = []
p=perfect_pareto_front()
p_sum = 0
p_result=0
for i in x:
for p_num in range(p.shape[0]): #31 迭代0-30
#print(p[p_num][i])
p_i = p[p_num][i] # 取出行号为p_num和列号为i的数值
p_sum = p_sum+p_i
#print(p_sum)
p_result = p_result + p_sum
#print(p_result)
result.append(p_result)
l=[]
for i in x:
for p_num in range(p.shape[0]):
if(p[p_num][i]>50): # 假设时间超过50分钟的设定为无效的监测事件
#print("shixiao")
l.append(p_num) # 将未检测到的事件编号放入list
l=list(set(l))
#print(l)
m = (len(l)/(p.shape[0])) # 计算所有未能监测到的事件与所有事件之比
m = float('%.3f' % m)
#print(m)
result.append(m)
return result
def perfect_pareto_front(): # 将csv中的数据拿出来,构成一个[[0 0 0.5] [0 0 0.5] [0.458 0.154 0.2545]...]这样的矩阵
with open('./demo1.csv', encoding='utf8') as file:
p = [list(map(float, row)) for row in csv.reader(file)]
return np.array(p)
if __name__ == "__main__":
p=perfect_pareto_front()
I = p.shape[0]
#print(I)
#f=fitness([1,2,3,4])
#print(f)
m = fitness1([0,2,3,5,6])
print(m)
后续
会进行NSGA2的二进制编码,使用节点编号编码,目前正在研究zhong