多目标遗传算法NSGAII求解环境经济调度(Python代码实现)

news2024/12/24 2:30:40

目录

1 电力系统环境经济调度数学模型

2 算例——IEEE10节点

2.1 数据​

 2.2 Python代码学习

3 一点拓展知识 


1 电力系统环境经济调度数学模型

 


2 算例——IEEE10节点

2.1 数据

我弄成一个表格,方便编程读写:

 2.2 Python代码学习

多目标遗传算法NSGAII在电力系统多目标问题有广泛的应用,只要把文中的目标函数和约束条件换了,就搞定啦。

部分代码:

#========导入第三方库=============
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
import matplotlib;

matplotlib.use('TkAgg')
from tqdm import tqdm  # 进度条设置

# ========导入数据=============

# ~~~~~~~~~~~~~~~~~~~~~读取文件~~~~~~~~~~~~~~~~~~~~~~
file=pd.read_csv('IEEE10.csv')#机组参数
#B=pd.read_csv('B10.csv')
#B=np.reshape()
B=np.array([[0.000049, 0.000014	,0.000015,	0.000015,	0.000016,	0.000017	,0.000017,	0.000018	,0.000019,	0.00002],
[0.000014,	0.000045,	0.000016,	0.000016,	0.000017	,0.000015,	0.000015	,0.000016	,0.000018,	0.000018],
[0.000015,	0.000016,	0.000039,	0.00001	,0.000012,	0.000012	,0.000014,	0.000014,	0.000016,	0.000016],
[0.000015,	0.000016,	0.00001,	0.00004,	0.000014	,0.00001	,0.000011,	0.000012,	0.000014,	0.000015],
[0.000016,	0.000017,	0.000012,	0.000014,	0.000035,	0.000011,	0.000013,	0.000013,	0.000015,	0.000016],
[0.000017,	0.000015,	0.000012,	0.00001,	0.000011	,0.000036,	0.000012,	0.000012,	0.000014,	0.000015],
[0.000017	,0.000015	,0.000014,	0.000011,	0.000013,	0.000012,	0.000038,	0.000016,	0.000016,	0.000018],
[0.000018	,0.000016,	0.000014,	0.000012,	0.000013,	0.000012,	0.000016	,0.00004,	0.000015,	0.000016],
[0.000019	,0.000018	,0.000016,	0.000014,	0.000015	,0.000014	,0.000016,	0.000015,	0.000042	,0.000019],
[0.00002,	0.000018	,0.000016	,0.000015,	0.000016,	0.000015,	0.000018	,0.000016,	0.000019	,0.000044]])

P_max = file['b']  #机组上限
P_min = file['c']  # #机组下限


# ~~~~~~~~~~~~~~~~~机组特性系数~~~~~~~~~~~~~~~~~~~~~~~~·
ai = file['d']
bi=file['e']
ci=file['f']
di=file['g']
ei=file['h']

# ~~~~~~~排放特性系数~~~~~~~~~~~~~~~~·
ali=file['g']
beti=file['h']
gari=file['i']
eti=file['l']
dali=file['m']

# ======多目标优化算法一次 只能求解单个时刻的解===============
class GaMultiobjective(object):
    def __init__(self, Pload1, P_max, P_min, ai, bi, ci, di, ei, ali, beti, gari, eti, dali):
        self.Pload1 = Pload1  # 负荷
        self.P_max = P_max  # 机组上限
        self.P_min = P_min  # 机组下限
        self.ai = ai
        self.bi = bi
        self.ci = ci
        self.di = di
        self.ei = ei
        self.ali = ali
        self.beti = beti
        self.gari = gari
        self.eti = eti
        self.dali = dali

    # ===初始化种群====
    def Initialize(self):
        X = np.zeros((self.NP, 10))  # 初始化群体,10代表 个机组出力
        for n in range(self.NP):  # 遍历每一个粒子
            X[n, 0] = np.random.uniform(10, 55, 1)[0]  # G1
            X[n, 1] = np.random.uniform(20, 80, 1)[0]  # G2
            X[n, 2] = np.random.uniform(47, 120, 1)[0]  # G3
            X[n, 3] = np.random.uniform(20, 130, 1)[0]  # G4
            X[n, 4] = np.random.uniform(50, 160, 1)[0]  # G5
            X[n, 5] = np.random.uniform(70, 240, 1)[0]  # G6
            X[n, 6] = np.random.uniform(60, 300, 1)[0]  # G7
            X[n, 7] = np.random.uniform(70, 340, 1)[0]  # G8
            X[n, 8] = np.random.uniform(130, 470, 1)[0]  # G9
            X[n, 9] = np.random.uniform(150, 470, 1)[0]  # G10
        return X

    # ==========定义目标函数、和对应的惩罚项=============

    # ===定义函数1 目标函数1:系统运行成本===
    def function1(self, X1):
        """
        个体目标函数
        :param X1:  (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
        :return: 函数1目标函数值
        """
        SUMCOST = []  # 存储总的成本
        for i in range (9):  # 遍历每一台机组,Python是从0开始索引,0-9:10台机组
            cost = self.ci[i] * X1[i] * X1[i] + self.bi[i]* X1[i] +self.ai[i]+\
                   np.abs(self.di[i]*np.sin(ei[i]*(self.P_min[i]-X1[i]))) #考虑阀点效应
            SUMCOST.append(cost)
        return np.sum(SUMCOST)

    # ====定义函数2 总污染排放量====
    def function2(self, X1):
        """
        个体目标函数
        :param X1:  (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
        :return: 函数2目标函数值
        """
        emission=[] #储存总的污染排放量
        for i in range(9):
            e=self.ali[i]+self.beti[i]*X1[i]+self.gari[i]*X1[i]*X1[i]+self.eti[i]*np.exp(self.dali[i]*X1[i])
            emission.append(e)
        return np.sum(emission)

    # ===对应的约束  负荷平衡约束(本例子calc_e() 不起作用,已通过其它方法解决掉负荷平衡约束)===
    def calc_e(self, X1):
        """
    函数1 对应的个体惩罚项
    :param X1: (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
    :return:
    """
        Ploss=0
        for i in range(9):
            for j in range(9):
                Ploss+=X1[i]*B[i][j]*X1[j]
        # cost=np.abs(X1[0]+X1[1]+X1[2]+X1[3]+X1[4]+X1[5]+X1[6]+X1[7]+X1[8]+X1[9]-np.sum(Ploss)-self.Pload1)
        # return cost
        return max(0,abs(sum(X1)-Ploss-Pload1-0.1))

#========导入第三方库=============
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
import matplotlib;

matplotlib.use('TkAgg')
from tqdm import tqdm  # 进度条设置

# ========导入数据=============

# ~~~~~~~~~~~~~~~~~~~~~读取文件~~~~~~~~~~~~~~~~~~~~~~
file=pd.read_csv('IEEE10.csv')#机组参数
#B=pd.read_csv('B10.csv')
#B=np.reshape()
B=np.array([[0.000049, 0.000014    ,0.000015,    0.000015,    0.000016,    0.000017    ,0.000017,    0.000018    ,0.000019,    0.00002],
[0.000014,    0.000045,    0.000016,    0.000016,    0.000017    ,0.000015,    0.000015    ,0.000016    ,0.000018,    0.000018],
[0.000015,    0.000016,    0.000039,    0.00001    ,0.000012,    0.000012    ,0.000014,    0.000014,    0.000016,    0.000016],
[0.000015,    0.000016,    0.00001,    0.00004,    0.000014    ,0.00001    ,0.000011,    0.000012,    0.000014,    0.000015],
[0.000016,    0.000017,    0.000012,    0.000014,    0.000035,    0.000011,    0.000013,    0.000013,    0.000015,    0.000016],
[0.000017,    0.000015,    0.000012,    0.00001,    0.000011    ,0.000036,    0.000012,    0.000012,    0.000014,    0.000015],
[0.000017    ,0.000015    ,0.000014,    0.000011,    0.000013,    0.000012,    0.000038,    0.000016,    0.000016,    0.000018],
[0.000018    ,0.000016,    0.000014,    0.000012,    0.000013,    0.000012,    0.000016    ,0.00004,    0.000015,    0.000016],
[0.000019    ,0.000018    ,0.000016,    0.000014,    0.000015    ,0.000014    ,0.000016,    0.000015,    0.000042    ,0.000019],
[0.00002,    0.000018    ,0.000016    ,0.000015,    0.000016,    0.000015,    0.000018    ,0.000016,    0.000019    ,0.000044]])

P_max = file['b']  #机组上限
P_min = file['c']  # #机组下限


# ~~~~~~~~~~~~~~~~~机组特性系数~~~~~~~~~~~~~~~~~~~~~~~~·
ai = file['d']
bi=file['e']
ci=file['f']
di=file['g']
ei=file['h']

# ~~~~~~~排放特性系数~~~~~~~~~~~~~~~~·
ali=file['g']
beti=file['h']
gari=file['i']
eti=file['l']
dali=file['m']

# ======多目标优化算法一次 只能求解单个时刻的解===============
class GaMultiobjective(object):
    def __init__(self, Pload1, P_max, P_min, ai, bi, ci, di, ei, ali, beti, gari, eti, dali):
        self.Pload1 = Pload1  # 负荷
        self.P_max = P_max  # 机组上限
        self.P_min = P_min  # 机组下限
        self.ai = ai
        self.bi = bi
        self.ci = ci
        self.di = di
        self.ei = ei
        self.ali = ali
        self.beti = beti
        self.gari = gari
        self.eti = eti
        self.dali = dali

    # ===初始化种群====
    def Initialize(self):
        X = np.zeros((self.NP, 10))  # 初始化群体,10代表 个机组出力
        for n in range(self.NP):  # 遍历每一个粒子
            X[n, 0] = np.random.uniform(10, 55, 1)[0]  # G1
            X[n, 1] = np.random.uniform(20, 80, 1)[0]  # G2
            X[n, 2] = np.random.uniform(47, 120, 1)[0]  # G3
            X[n, 3] = np.random.uniform(20, 130, 1)[0]  # G4
            X[n, 4] = np.random.uniform(50, 160, 1)[0]  # G5
            X[n, 5] = np.random.uniform(70, 240, 1)[0]  # G6
            X[n, 6] = np.random.uniform(60, 300, 1)[0]  # G7
            X[n, 7] = np.random.uniform(70, 340, 1)[0]  # G8
            X[n, 8] = np.random.uniform(130, 470, 1)[0]  # G9
            X[n, 9] = np.random.uniform(150, 470, 1)[0]  # G10
        return X

    # ==========定义目标函数、和对应的惩罚项=============

    # ===定义函数1 目标函数1:系统运行成本===
    def function1(self, X1):
        """
        个体目标函数
        :param X1:  (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
        :return: 函数1目标函数值
        """
        SUMCOST = []  # 存储总的成本
        for i in range (9):  # 遍历每一台机组,Python是从0开始索引,0-9:10台机组
            cost = self.ci[i] * X1[i] * X1[i] + self.bi[i]* X1[i] +self.ai[i]+\
                   np.abs(self.di[i]*np.sin(ei[i]*(self.P_min[i]-X1[i]))) #考虑阀点效应
            SUMCOST.append(cost)
        return np.sum(SUMCOST)

    # ====定义函数2 总污染排放量====
    def function2(self, X1):
        """
        个体目标函数
        :param X1:  (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
        :return: 函数2目标函数值
        """
        emission=[] #储存总的污染排放量
        for i in range(9):
            e=self.ali[i]+self.beti[i]*X1[i]+self.gari[i]*X1[i]*X1[i]+self.eti[i]*np.exp(self.dali[i]*X1[i])
            emission.append(e)
        return np.sum(emission)

    # ===对应的约束  负荷平衡约束(本例子calc_e() 不起作用,已通过其它方法解决掉负荷平衡约束)===
    def calc_e(self, X1):
        """
    函数1 对应的个体惩罚项
    :param X1: (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
    :return:
    """
        Ploss=0
        for i in range(9):
            for j in range(9):
                Ploss+=X1[i]*B[i][j]*X1[j]
        # cost=np.abs(X1[0]+X1[1]+X1[2]+X1[3]+X1[4]+X1[5]+X1[6]+X1[7]+X1[8]+X1[9]-np.sum(Ploss)-self.Pload1)
        # return cost
        return max(0,abs(sum(X1)-Ploss-Pload1-0.1))

 

3 一点拓展知识 


现代这种“探索、征服”的心态,从世界地图的演变可以看得一目了然。早在历史进到现代之前,许多文化就已经有了自己的世界地图。当然,当时并没有人真正知道全世界是什么样子,在亚非大陆上的人对美洲一无所知,美洲文化也不知道亚非大陆上的情形。但碰到不熟悉的地区,地图上不是一笔未提,就是画上了想象出来的怪物和奇景。这些地图上并没有空白的空间,让人觉得全世界就在自己的掌握之中。

在15、16世纪,欧洲人的世界地图开始出现大片空白。从这点可以看出科学心态的发展,以及欧洲帝国主义的动机。地图上的空白可以说是在心理及思想上的一大突破,清楚表明欧洲人愿意承认自己对于一大部分的世界还一无所知。

图1 1459年欧洲人的世界地图。可以看到地图上似乎巨细靡遗,就算是当时欧洲人根
                                  本一无所知的南非地区,都有密密麻麻的信息。
1492年,哥伦布从西班牙出发向西航行,希望能找到一条前往东亚的新航线。哥伦布当时相信的仍然是旧的世界地图,以为全世界在地图上一览无遗。哥伦布从旧地图推算,日本应该位于西班牙以西大约7000公里远。但事实上,从西班牙到东亚的距离要超过两万公里,而且中间还隔着个他不知道的美洲大陆。1492年10月12日大约凌晨2点,哥伦布一行人与这片未知大陆有了第一次接触。皮塔号(Pinta)的瞭望手胡安·罗德里格斯·贝尔梅霍(Juan Rodriguez Berme jo)从桅杆上看到了现在的巴哈马群岛,高呼着:“有陆地!有陆地!”

哥伦布当时相信这个小岛就位于东亚海外,属于“Indies”(印度地方,包含今日印度、中南半岛及东印度群岛等地),所以他把当地人称为“Indians”(这正是美国原住民也被称为“印第安人”的原因)。一直到他过世,哥伦布都不认为自己犯了一个大错。不论是对他还是许多当代的人来说,说他发现了一个完全未知的大陆,这根本难以想象。毕竟千百年来,不管是那些伟大的思想家和学者甚至是不可能犯错的《圣经》,都只知道有欧洲、非洲和亚洲。怎么有可能他们全错了呢?难道《圣经》居然漏了大半个世界,只字未提?这种情况,就好像是说在1969年阿波罗11号要前往月球的途中,居然撞到了另一个从来没人看到的月亮。而正因为哥伦布不愿意接受自己的无知,我们可以说他仍然是个中世纪的人,深信着自己已经知道了全世界,所以就算已经有了如此重大的发现,也无法说服他。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flutter 组件】002-基础组件:文本与样式

【Flutter 组件】002-基础组件:文本与样式 文章目录【Flutter 组件】002-基础组件:文本与样式一、Text1、概述2、属性列表3、构造方法4、示例代码演示运行结果二、TextStyle1、概述2、属性列表3、构造方法4、示例代码示例运行结果三、TextSpan1、概述2、…

数字图像处理(入门篇)十 边缘检测

目录 一 边缘检测算子 1 Roberts算子 2 Sobel算子 3 Prewitt算子 二 实践 (1)代码 (2)结果图 边缘检测是计算机视觉中的基本问题,边缘检测的难点就在于如何又快又准确地提取图像的边缘信息。 边缘检测的基本方法…

流媒体分析之webrtc之rtcp

TCP作为RTP控制协议,对于弱网下音视频质量和会话控制具有重要的作用。 1. RTCP Header V:RTCP的版本号,一定等于2; P:如果设置,填充位表示数据包包含末尾的附加填充八位字节,不属于控制信息&am…

基于jsp+mysql+ssm影视爱好者论坛交流系统-计算机毕业设计

项目介绍 设计一个电影学习交流社区,使对电影的学生可以方便的进行交流。同时,通过此课题使学生熟悉网站搭建流程和方法。 意义:此课题实现后,可以为喜欢电影的学生提供一个交流学习的平台,提高学生学习兴趣。同时&am…

想提前躺平的程序员,这10个网站收好了!

我们的口号是:搞钱!搞钱!再搞钱!程序员想兼职但是不知道该上哪找? 为大家整理了7个程序员最常用的接私活平台,希望对你有帮助!记得点赞收藏,先码后看!1、程序员客栈 程序…

基于jsp+mysql+ssm游戏爱好者论坛交流设计-计算机毕业设计

项目介绍 本论坛是一个面向爱好游戏的玩家提供一个交流分享游戏攻略、视频、图片以及娱乐互动,让游戏玩家展示自己最真实的心声!论坛提供注册、登陆、发帖、回复、搜索等功能。用户可以利用论坛进行网上约伴、分享装备属性及其获得方法,进行账号交易等,…

5 - 线程池 Java内置的线程池 - 异步计算结果(Future)

前面介绍 ExecutorService 线程池接口的时候,其中,提交任务的方法 submit() 的返回值就是Future接口类型的。 我们刚刚在学习java内置线程池使用时,没有考虑线程计算的结果,但开发中,我们有时需要利用线程进行一些计算…

2022年牙科医疗行业研究报告

第一章 行业概况 1.1 牙科医疗概念及现状 牙科医疗行业是指以牙科医疗消费为基础,集合了牙科医疗服务、职业牙医教育培训、牙科医疗器材研究开发生产、市场策划、宣传、投资、经营、管理等于一体的医疗产业链。由于牙科疾病的特点,牙科医疗产业在具有一…

iOS扫码一图多码原生处理AVCaptureSession

文章目录前言正文1.定位二维码的位置2.扫码、解析总结前言 业务中一直有扫码的需求,这次说需要扫多个码(详细一点是一图多码),有点东西的。 第一点:怎么做:拿到手第一反应是有没有什么库可以直接调用的&am…

VSCode远程连接免密登录

配置了VSCode远程连接服务器,但每次打开project都需要重新输入密码,比较麻烦,所以下面就介绍一下如何免密码登入 在上一篇blog里面配置好VSCode远程连接服务器之后按照如下操作。 步骤如下: 在windows端: 1、winR打…

softmax原理性质解析并python实现

Softmax原理 Softmax函数用于将分类结果归一化,形成一个概率分布。作用类似于二分类中的Sigmoid函数。 对于一个k维向量z,我们想把这个结果转换为一个k个类别的概率分布p(z)。softmax可以用于实现上述结果,具体计算公式为: 对于k…

【数集项目之 MCDF】(一) 控制寄存器 control_register

写在前面 本项目为MCDF数据整形器设计,所有的参考代码见我的github https://github.com/SuperiorLQF/verilog_ALL/tree/master/MCDF 其中设计的参考文档见github文件中的MCDF修订版.docx文件。选择的工具链是Vscode & iverilog & gtkwave,相关工…

前端框架 Nuxt3 Vue3 SSR 总结

目录 一、Nuxt3安装 二、路由 1、普通路由 2、动态路由 3、获取路由参数 4、路由跳转标签 5、路由跳转api 三、静态资源 四、常用标签 1、title标签、useHead的API 五、公共模板布局 1、默认布局 2、自定义公共模板 3、动态自定义布局 六、插件 七、中间件 …

【QString 函数学习篇】

【QString 函数学习篇】【1】UI设计布局【2】QChar | setAlignment |【3】sprintf | asprintf | setNum | number |【4】toInt | toUpper [十进制->十六进制 | 十进制->二进制]【5】clear | append【6】二进制->十六进制 | 二进制->十进制【7】prepend【8】strimme…

[附源码]Python计算机毕业设计SSM基于的餐厅管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

(十二)Vue之列表渲染

文章目录基本列表遍历数组遍历对象遍历字符串遍历指定次数key的原理虚拟DOM中key的作用用index作为key可能会引发的问题如何选择keyVue学习目录 上一篇:(十一)Vue之条件渲染 基本列表 在vue里基本的列表渲染可以使用v-for指令 v-for指令: …

Reactor手册

Flux Flux 是一个发出0-N个元素组成的异步序列的Publisher,可以被onComplete信号或者onError信号所终止。 Flux.just("Hello", "World").subscribe(System.out::println);// fromArray(),fromIterable(),fromStream()Flux.fromArra…

K8s 核心组件介绍

目录前言一、控制平面组件1.1 kube-apiserver1.2 etcd1.3 kube-scheduler1.4 kube-controller-manager1.5 cloud-controller-manager二、Node 组件2.1 kubelet2.2 kube-proxy2.3 Container Runtime前言 一个完整的 K8s 集群由一组节点(node)服务器组成&…

组队-蓝桥杯

题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 作为篮球队教练,你需要从以下名单中选出 11 号位至 55 号位各一名球员,组成球队的首发阵容。 每位球员担任 11 号位至 55 号位时的评分如下…

关于人脸检测和人脸关键点检测的详解(涉及Opencv 和Dlibd)

关于人脸识别,大家入门opencv,最常见的是用opencv级联分类器器里面的函数进行人脸的识别(当然里面包含很多各种物体的分类器,大家可以一一测试),今天我们来练一下关于人脸识别的级联器。 1,ope…