【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)

 💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Python代码、数据、文章


💥1 概述

摘 要:为了使售电公司能够更好地迎接可再生能源消纳权重指标发生改变带来的挑战,改变

了各个时段的可再生能源消纳权重指标,建立了考虑储能和可再生能源消纳责任制的售电公司

购售电模型。首先,构建了考虑可再生能源消纳责任制的售电公司购电侧模型;然后,建立了

考虑可再生能源消纳责任制、储能以及正态分布形式的自身风光出力误差的售电公司利润函

数,并以该利润函数最大化为目标函数;最后,通过在遗传算法中引入罚函数对其进行求解。

通过算例验证了储能、可再生能源消纳权重对售电公司收益的影响以及储能在消纳权重发生改

变时的作用。

关键词:可再生能源消纳责任制;储能;购售电策略;利润函数;遗传算法

近年来,一方面,“碳中和”愿景加速了可再生能源的开发,但却因电网基础设施建设等因素发展滞后,加剧了弃风、弃光现象[1-3];另一方面,分布式储能等产消者大量出现在售电侧[4-5],但其充放电的不确定性致使售电公司迫切寻求符合自身利益的储能调度计划,因此同时研究可再生能源消纳和储能显得极其重要。在可再生能源消纳方面,售电公司作为新兴市场主体应该勇于承担可再生能源消纳的责任,这既响应了国家能源局发出的可再生能源消纳责任制[6-7]又能提升自身的社会竞争力。总之,同时考虑储能和可再生能源消纳责任制对售电公司利润及购售电策略的影响是一个重要的研究方向。

📚2 运行结果

部分代码:

##步骤2 惩罚项
def calc_e(X):
    SUMCOST = []  # 存储群体惩罚项
    for i in range(NP):  # 每一个个体
        # 计算1个个体的惩罚项 X的维度是3 * 24
        grid = X[i, 0, :]  # 主网出力
        xdcll = X[i, 1, :]  # 蓄电池出力,大于0放电
        cutpl = X[i, 2, :]  # 可削减负荷
        COST = []  # 存储个体惩罚项
        ##################对蓄电池进行惩罚  #############
        # XDCRL = 1200  # 蓄电池额定容量为 1200 kWh
        soc = np.zeros((25, 1))  # 初始化储能荷电状态
        soc[0] = 0.4  # 开始SOC=0.4
        for i in range(24):  # 遍历24个时刻
            soc[i + 1] = xdcll[i] / XDCRL + soc[i]  # 下一时刻的soc=上一时刻soc+充放电soc变化量
        # 对soc越限进行惩罚  #储能电池剩余电量下限240kwh soc=0.2,上下1080kwh soc=0.9.
        for i in range(25):  # 遍历soc
            if soc[i] < 0.2:
                cost = np.abs(soc[i] - 0.2)
                COST.append(np.abs(cost))
            if soc[i] > 0.9:
                cost = np.abs(soc[i] - 0.9)
                COST.append(cost)
        # 对储能单位时间充放电功率越限进行惩罚 储能单位时间充放电功率soc最大为0.2
        for i in range(24):  # 遍历24个时刻
            if np.abs(xdcll[i] / XDCRL) > 0.2:
                cost = np.abs(xdcll[i] / XDCRL) - 0.2
                COST.append(cost)
        # 对蓄电池首末进行惩罚
        if soc[-1] != 0.4:
            cost = 10
            COST.append(cost)
        ##################对可削减负荷进行惩罚  #############
        for i in range(24):
            if cutpl[i] > CUTPL[i]:  # 如果大于最大可削减负荷
                COST.append(cutpl[i] - CUTPL[i])
            if cutpl[i] < 0:
                COST.append(np.abs(cutpl[i]))
        ##################对功率平衡 进行惩罚  #############
        pf = PF * (1 + e1)  # PF预测值  pf真实值
        ps = PS * (1 + e2)  # =PS光伏预测值 ps真实值
        # 可削减负荷=初始负荷-储能-风-光-主网功率
        for i in range(24):
            if np.abs(PL[i] - xdcll[i] - pf[i] - ps[i] - grid[i] - cutpl[i]) > 0.01:  # 如果 初始负荷-储能-风-光-主网-可削减负荷>0.01
                cost = np.abs(PL[i] - xdcll[i] - pf[i] - ps[i] - grid[i] - cutpl[i]) - 0.01

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]陈名扬,刘敏,鲁杰.考虑储能和可再生能源消纳责任制的售电公司购售电策略[J].电力科学与工程,2021,37(10):18-27.

🌈4 Python代码、数据、文章

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!下面是一个简单的遗传算法Python 实现示例: ```python import numpy as np # 遗传算法参数 POP_SIZE = 50 # 种群大小 DNA_SIZE = 10 # DNA 长度 CROSSOVER_RATE = 0.8 # 交叉概率 MUTATION_RATE = 0.01 # 变异概率 N_GENERATIONS = 200 # 迭代次数 def F(x): """目标函数,这里以一个简单的函数 f(x) = x^2 为例""" return x**2 def translateDNA(pop): """将二进制 DNA 转化为具体的数值""" return pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2**DNA_SIZE-1) * 5 def get_fitness(pop): """计算种群中每个个体的适应度值""" x = translateDNA(pop) return F(x) def select(pop, fitness): """通过轮盘赌选择操作生成新的种群""" idx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True, p=fitness/fitness.sum()) return pop[idx] def crossover_and_mutation(pop): """对种群进行交叉和变异操作""" new_pop = [] for parent in pop: child = parent.copy() if np.random.rand() < CROSSOVER_RATE: # 随机选择另一个个体进行交叉 crossover_idx = np.random.randint(0, POP_SIZE, size=1) cross_points = np.random.randint(0, 2, size=DNA_SIZE).astype(np.bool) child[cross_points] = pop[crossover_idx, cross_points] # 变异操作 mask = np.random.rand(DNA_SIZE) < MUTATION_RATE child[mask] = 1 - child[mask] new_pop.append(child) return np.array(new_pop) # 初始化种群 pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE)) # 迭代遗传算法 for _ in range(N_GENERATIONS): fitness = get_fitness(pop) pop = select(pop, fitness) pop = crossover_and_mutation(pop) # 打印最优解 x = translateDNA(pop) best_idx = np.argmax(F(x)) print("最优解 x:", x[best_idx]) print("最优解 f(x):", F(x[best_idx])) ``` 在这个示例中,我们以目标函数 f(x) = x^2 为例,使用二进制编码来表示个体的 DNA。遗传算法的主要步骤包括初始化种群、计算适应度值、选择、交叉和变异。最后,打印出迭代过程中得到的最优解。 你可以根据自己的需求和目标函数进行修改和扩展。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值