1

我没有太多使用遗传算法的经验,所以我想向社区征求一些有用的意见。我想为我的术语错误道歉。如果需要,请纠正我。

我要优化的问题是孤岛微电网中的最佳潮流。在简单的微电网中,我们有 2 个柴油发电机 (DG)、1 个 PV 阵列、1 个储能系统 (ESS) 和负载。假设我们知道下一周期的负载和光伏阵列输出功率值。

因此,目标函数应最小化为 OPEX 作为每个微电网组件t在周期内每个时刻的运营成本的总和T

其中ab是一些运营成本系数,是柴油发电机二进制(0/1 或 ON/OFF)状态变量,P是当时微电网组件的输出功率t

这里有一些约束(真正的问题几乎没有非线性约束,所以我只写了三个约束):

  1. 功率平衡

  1. ESS' 最大卸料深度

  1. 柴油发电机组功率限制

因此,它是具有非线性约束的混合整数问题。我尝试使用遗传算法来调整问题以解决它。我使用pymoo Python 库通过 NSGA2 算法进行多目标优化。让我们考虑一下,为此T我们有一些强大的数据:LoadPV

from pymoo.model.problem import FunctionalProblem
from pymoo.factory import get_sampling, get_crossover, get_mutation
from pymoo.operators.mixed_variable_operator import MixedVariableSampling, MixedVariableMutation, MixedVariableCrossover
from pymoo.algorithms.nsga2 import NSGA2
from pymoo.factory import get_sampling, get_crossover, get_mutation, get_termination
from pymoo.optimize import minimize

PV = np.array([10, 19.8, 16, 25, 7.8, 42.8, 10]) #PV inverter output power, kW
Load = np.array([100, 108, 150, 150, 90, 16, 170]) #Load, kW

balance_eps = 0.001 #equality constraint relaxing coefficient

DG1_pmin = 0.3 #DG1 min power
DG2_pmin = 0.3 #DG2 min power
P_dg1 = 75 #DG1 rated power, kW
P_dg2 = 75 #DG1 rated power, kW

P_PV_inv = 50 #PV inverter rated power, kW

P_ESS_inv = 30 #ESS bidirectional inverter absolute rated discharge/charge power, kW

ESS_c = 100 #ESS capacity, kWh

SOC_min = 30
SOC_max = 100
    
objs = [lambda x: x[0]*x[2]*200 + x[1]*x[3]*200 + x[4]*0.002 #objective function]

constr_eq = [lambda x: ((Load[t] - x[0]*x[2] - x[1]*x[3] - x[4] - PV[t] )**2)]

constr_ieq = [lambda x: -SOC_t + 100*x[4]/ESS_c + SOC_min,
    lambda x: SOC_t - 100*x[4]/ESS_c - SOC_max]

problem = FunctionalProblem(n_var=n_var, objs, constr_eq=constr_eq, constr_eq_eps=1e-03, constr_ieq=constr_ieq, 
          xl=np.array([0, 0, DG1_pmin*P_dg1, DG2_pmin*P_dg2, -P_ESS_inv]), xu=np.array([1, 1, P_dg1, P_dg2, P_ESS_inv]))

mask = ["int", "int", "real", "real", "real"]

sampling = MixedVariableSampling(mask, {
    "real": get_sampling("real_random"),
    "int": get_sampling("int_random")})

crossover = MixedVariableCrossover(mask, {
    "real": get_crossover("real_sbx", prob=1.0, eta=3.0),
    "int": get_crossover("int_sbx", prob=1.0, eta=3.0)})

mutation = MixedVariableMutation(mask, {
    "real": get_mutation("real_pm", eta=3.0),
    "int": get_mutation("int_pm", eta=3.0)})

algorithm = NSGA2(
    pop_size=150,
    sampling=sampling,
    crossover=crossover,
    mutation=mutation,
    eliminate_duplicates=True)

我们有n_var = 5正在优化的决策变量:. 我们还应该可以访问 的先前值SOC。我写了一个递归代码来实现一个连续的优化链:

x=[]
s=[]
SOC_t = 100 #SOC at t = -1

for t in range (0, 7):

    res = minimize(
        problem,
        algorithm,
        seed=1,
        termination = get_termination("n_gen", 300),
        save_history=True, verbose=False)

    SOC_t = SOC_t - 100*res.X[4]/ESS_c

    print(res.X[:2], np.around(res.X[2:].astype(np.double), 3), np.around(SOC_t, 2))
    x.append(res.X)
    s.append(SOC_t) 

因此,我们为每个时间步初始化了大小为 150 的种群t,该种群中的个体看起来像. 运行此代码,我得到了这些优化结果:

[1 1] [27.272 34.635 28.071] 71.93
[0 1] [28.127 58.168 30.   ] 41.93
[1 1] [50.95  71.423 11.599] 30.33
[1 1] [53.966 70.97  0.034] 30.3
[1 1] [24.636 59.236 -1.702] 32.0
[0 0] [40.831  29.184 -26.832] 58.83
[1 1] [68.299 63.148 28.572] 30.26

即使是我在遗传算法方面的一点经验也让我可以说,这种方法是不合适和低效的。

所以,这是我的问题(如果你还在阅读我的帖子:)

有没有办法通过不连续优化设置为 的特定变量来优化此类问题t,而是将人口中的个体定义为大小为 ( , )的数组?Tn_var

对于描述的问题,人口中的一个人可能看起来像

是否可以实施这种方法?如果是,怎么做pymoo

非常感谢您的宝贵时间!任何意见和建议将不胜感激。

4

0 回答 0