多目标优化中目标函数的编写

管网污染情况下水质监测传感器布设

实验介绍

使用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

目标介绍

  1. 最小化监测时间
    使得选择的节点对应的监测时间尽可能的小
  2. 最大化监测比率
    使得选择的节点能够监测到的污染事件比例尽可能的高(设定一个时间阀值,大于这个时间的则认为该污染事件无法被监测)

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值