python - DQN+CPLEX:随着迭代的进行,我的程序变得越来越慢
问题描述
该程序结合了基于TensorFlow的DQN算法和Matlab中的CPLEX求解器。目的是寻找基于深度强化学习的储能最优运行控制策略。DQN 用于储能系统。CPLEX 解决了微电网规划和调度问题(混合整数线性规划)。现在的主要问题是程序一开始迭代非常快,但可能迭代到EPSIOD = 100
左右,运行速度开始明显下降,无法得到最终想要的结果。
对于DQN算法,我直接使用了别人已经写好的程序框架。应用场景为 OpenAI Gym 中的 CartPole-v0 游戏。代码网址为:https ://github.com/ljpzzz/machinelearning/blob/master/reinforcement-learning/dqn.py
在我的python程序中,该matlab.engine
模块用于调用matlab中的CPLEX求解器来求解微电网规划问题。返回的参数供DQN算法存储和使用。每次迭代 ( for episode in range (EPISODE + 1):
) 都会推进STEP
步骤 ( for step in range (1, STEP + 1):
)。每次迭代首先调用 Matlab 函数 ( engine.MILP_1
) 进行初始规划。再进一步调用matlab函数进行规划调整(engine.Reward_MILP2
),其具体使用位置如下图所示。
值得注意的是,我之前把这个程序中的CPLEX换成了Matlab的潮流求解器MATPOWER来计算33节点的潮流(另一个项目)。在这种情况下,整个程序始终可以保持一个比较理想的速度,并且迭代EPISODE = 20000
多次没有任何问题。
试过的方法:
- 调整用 MATLAB 编写的 CPLEX 程序。这部分程序一开始比较简单,解决速度也很快。
- 调用
gc
模块,在主for循环之前和之后添加gc.disable()
和。gc.enable()
reset_default_graph()
在函数中添加create_Q_network
,如下图所示。
但是,上述方法不能单独使用和组合使用。有什么办法可以让这个程序以良好的速度运行吗?非常感谢!
这是我的主要代码:
# Hyper Parameters
EPISODE = 3000 #Episode limitation
STEP = 24 # Step limitation in an episode
TEST = 24 # The number of experiment test every 100 episode
T= 24
def main():
agent = DQN()
P_sc_max = 500
k1 = 11
P_be_max = 500
k2 = 51
P_sc_ini1, P_be_ini1 = engine.CHESS_discrete(P_sc_max, k1, P_be_max, k2, nargout=2)
P_be_ini=P_be_ini1[0]
workbook_test = xlwt.Workbook(encoding='utf-8')
worksheet_test= workbook_test.add_sheet('test_data')
for episode in range(EPISODE+1):
total_reward = 0.0
load_MG_pre,PV,PV_pre,WT,WT_pre,P_wt,P_wt_pre,pric_b,pric_b_pre,pric_s,pric_s_pre,pric_ob,pric_os= ini()
SoC_mg_0 = 0.5
SoC_be_0 = 0.1 * random.randint(3, 7)
state =np.concatenate(([1],[SoC_be_0],[pric_b_pre[0]],[0]))
P_b_station_pre, P_s_station_pre = engine.MILP_1(SoC_be_0,
SoC_mg_0,
matlab.double(load_MG_pre[0:24]),
matlab.double(PV_pre[0:24]),
matlab.double(WT_pre[0:24]),
matlab.double(pric_b_pre[0:24]),
matlab.double(pric_s_pre[0:24]),
nargout=2)
state[3] = P_b_station_pre - P_s_station_pre
SoC_be=SoC_be_0
P_b_station=P_b_station_pre
P_s_station=P_s_station_pre
SoC_mg=SoC_mg_0
gc.disable()
num_step=0
for step in range(1,STEP+1):
action = agent.egreedy_action(state)
P_be=P_be_ini[action]
reward, P_station, SoC_be_new, P_b_station_new, P_s_station_new, SoC_mg_new, done = engine.Reward_MILP2(
P_be, SoC_be,P_b_station,P_s_station,
pric_b[step - 1],pric_s[step - 1],
pric_ob[step - 1],pric_os[step - 1],
SoC_mg,
matlab.double(load_MG_pre[step - 1:step + 23]),
matlab.double(PV_pre[step - 1:step + 23]),
matlab.double(WT_pre[step - 1:step + 23]),
matlab.double(pric_b_pre[step - 1:step + 23]),
matlab.double(pric_s_pre[step - 1:step + 23]),
nargout=7)
SoC_be=SoC_be_new
P_b_station =P_b_station_new
P_s_station =P_s_station_new
P_MG = P_b_station_new - P_s_station_new
SoC_mg = SoC_mg_new
next_state=np.concatenate(([1+step],[SoC_be],[pric_b[step]],[P_MG]))
agent.perceive(state, action, reward, next_state, done)
state = next_state
total_reward += reward
num_step += 1
if done:
break
gc.enable()
if episode % 100 == 0:
ave_reward = total_reward / TEST
worksheet_test.write(0,int(episode / 100), ave_reward)
worksheet_test.write(1, int(episode / 100), num_step)
workbook_test.save('Test_data.xls')
workbook_test.save('Test_data.xls')
x2 = xlrd.open_workbook("Test_data.xls")
sheet2 = x2.sheet_by_name("test_data")
for i in range(0, int(EPISODE / 100) + 1):
print('episode: ', i, 'Evaluation Average Reward:', sheet2.row(0)[i].value)
解决方案
推荐阅读
- django - django urls.py:两个具有相似路径的模块
- haskell - Haskell elem 函数的 Big O 运行时
- python - 每次列表长度增加一定数量时做一些事情
- javascript - 如何使用 python 和 selenium 从脚本标签中获取变量?
- python - 真正有数据时,Shopify api 不返回任何内容
- ios - 使用 Titanium Appcelerator 在 iOS 上读取 NFC 标签
- pdf - Autodesk Forge 查看器:从 HTTP 打开 PDF
- javascript - 我的 Discord 音乐机器人会提前 20 秒停止歌曲
- android-studio - android studio中的代码不变
- go - 无法将 yaml 数组映射和解组到 golang 结构