首页 > 解决方案 > 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多次没有任何问题。

试过的方法:

  1. 调整用 MATLAB 编写的 CPLEX 程序。这部分程序一开始比较简单,解决速度也很快。
  2. 调用gc模块,在主for循环之前和之后添加gc.disable()和。gc.enable()
  3. 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)

标签: pythonmatlabtensorflow

解决方案


推荐阅读