我没有太多使用遗传算法的经验,所以我想向社区征求一些有用的意见。我想为我的术语错误道歉。如果需要,请纠正我。
我要优化的问题是孤岛微电网中的最佳潮流。在简单的微电网中,我们有 2 个柴油发电机 (DG)、1 个 PV 阵列、1 个储能系统 (ESS) 和负载。假设我们知道下一周期的负载和光伏阵列输出功率值。
因此,目标函数应最小化为 OPEX 作为每个微电网组件t
在周期内每个时刻的运营成本的总和T
:
其中a
,b
是一些运营成本系数,是柴油发电机二进制(0/1 或 ON/OFF)状态变量,P
是当时微电网组件的输出功率t
。
这里有一些约束(真正的问题几乎没有非线性约束,所以我只写了三个约束):
- 功率平衡
- ESS' 最大卸料深度
- 柴油发电机组功率限制
因此,它是具有非线性约束的混合整数问题。我尝试使用遗传算法来调整问题以解决它。我使用pymoo Python 库通过 NSGA2 算法进行多目标优化。让我们考虑一下,为此T
我们有一些强大的数据:Load
PV
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
,而是将人口中的个体定义为大小为 ( , )的数组?T
n_var
对于描述的问题,人口中的一个人可能看起来像
是否可以实施这种方法?如果是,怎么做pymoo
?
非常感谢您的宝贵时间!任何意见和建议将不胜感激。