├── 4.1_Output_Prediction ├── 20 node │ ├── Topology.png │ ├── Topology.png_temp.bmp │ ├── source_param.csv │ ├── source_param_original.csv │ ├── compressor_param.csv │ ├── node_param.csv │ └── pipeline_param.csv ├── 24 bus │ ├── Power_Gas_Data.xlsx │ ├── gen_param.csv │ ├── gen_param2.csv │ ├── bus_param.csv │ └── line_param.csv ├── gradient_comp.m ├── deep_learning_electricity_gas_getsource.py └── Electricity_Gas_CPLEX.m ├── 4.4_Day_Ahead_Dispatch ├── Power_Gas_Data.xlsx ├── Day_Ahead_Dispatch_Generate_Dataset.m └── Day_Ahead_ANN_training.py ├── 4.2_Scenario_Feasibility ├── 20 node │ ├── Topology.png │ ├── Topology.png_temp.bmp │ ├── source_param.csv │ ├── source_param_original.csv │ ├── compressor_param.csv │ ├── node_param.csv │ └── pipeline_param.csv ├── 24 bus │ ├── Power_Gas_Data.xlsx │ ├── gen_param.csv │ ├── gen_param2.csv │ ├── bus_param.csv │ └── line_param.csv └── bigfluc_feasibility.py ├── 4.3_State_Recovery_Performance ├── 20 node │ ├── Topology.png │ ├── Topology.png_temp.bmp │ ├── source_param.csv │ ├── source_param_original.csv │ ├── compressor_param.csv │ ├── node_param.csv │ └── pipeline_param.csv ├── 24 bus │ ├── Power_Gas_Data.xlsx │ ├── gen_param.csv │ ├── gen_param2.csv │ ├── bus_param.csv │ └── line_param.csv └── electricity_gas_piecewise_pressure.py └── README.md /4.1_Output_Prediction/20 node/Topology.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Prof-Greatfellow/electricity-gas-ANN/HEAD/4.1_Output_Prediction/20 node/Topology.png -------------------------------------------------------------------------------- /4.4_Day_Ahead_Dispatch/Power_Gas_Data.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Prof-Greatfellow/electricity-gas-ANN/HEAD/4.4_Day_Ahead_Dispatch/Power_Gas_Data.xlsx -------------------------------------------------------------------------------- /4.2_Scenario_Feasibility/20 node/Topology.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Prof-Greatfellow/electricity-gas-ANN/HEAD/4.2_Scenario_Feasibility/20 node/Topology.png -------------------------------------------------------------------------------- /4.1_Output_Prediction/24 bus/Power_Gas_Data.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Prof-Greatfellow/electricity-gas-ANN/HEAD/4.1_Output_Prediction/24 bus/Power_Gas_Data.xlsx -------------------------------------------------------------------------------- /4.1_Output_Prediction/20 node/Topology.png_temp.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Prof-Greatfellow/electricity-gas-ANN/HEAD/4.1_Output_Prediction/20 node/Topology.png_temp.bmp -------------------------------------------------------------------------------- /4.2_Scenario_Feasibility/24 bus/Power_Gas_Data.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Prof-Greatfellow/electricity-gas-ANN/HEAD/4.2_Scenario_Feasibility/24 bus/Power_Gas_Data.xlsx -------------------------------------------------------------------------------- /4.3_State_Recovery_Performance/20 node/Topology.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Prof-Greatfellow/electricity-gas-ANN/HEAD/4.3_State_Recovery_Performance/20 node/Topology.png -------------------------------------------------------------------------------- /4.2_Scenario_Feasibility/20 node/Topology.png_temp.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Prof-Greatfellow/electricity-gas-ANN/HEAD/4.2_Scenario_Feasibility/20 node/Topology.png_temp.bmp -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # electricity-gas-ANN 2 | Data and codes for the ANN-based electricity-gas dispatch article published on [Applied Energy](http://doi.org/10.1016/j.apenergy.2021.116480). 3 | -------------------------------------------------------------------------------- /4.3_State_Recovery_Performance/24 bus/Power_Gas_Data.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Prof-Greatfellow/electricity-gas-ANN/HEAD/4.3_State_Recovery_Performance/24 bus/Power_Gas_Data.xlsx -------------------------------------------------------------------------------- /4.3_State_Recovery_Performance/20 node/Topology.png_temp.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Prof-Greatfellow/electricity-gas-ANN/HEAD/4.3_State_Recovery_Performance/20 node/Topology.png_temp.bmp -------------------------------------------------------------------------------- /4.4_Day_Ahead_Dispatch/Day_Ahead_Dispatch_Generate_Dataset.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Prof-Greatfellow/electricity-gas-ANN/HEAD/4.4_Day_Ahead_Dispatch/Day_Ahead_Dispatch_Generate_Dataset.m -------------------------------------------------------------------------------- /4.1_Output_Prediction/20 node/source_param.csv: -------------------------------------------------------------------------------- 1 | source_no,node_no,P_max(kcf),P_min(kcf),unit_cost($/kcf) 2 | 1,1,12000,1000,2.6 3 | 2,5,8000,1000,2.21 4 | 3,8,8000,1000,2.5 5 | 4,11,5000,1000,2.5 6 | 5,13,6000,500,2.3 7 | -------------------------------------------------------------------------------- /4.2_Scenario_Feasibility/20 node/source_param.csv: -------------------------------------------------------------------------------- 1 | source_no,node_no,P_max(kcf),P_min(kcf),unit_cost($/kcf) 2 | 1,1,12000,1000,2.6 3 | 2,5,8000,1000,2.21 4 | 3,8,8000,1000,2.5 5 | 4,11,5000,1000,2.5 6 | 5,13,6000,500,2.3 7 | -------------------------------------------------------------------------------- /4.1_Output_Prediction/20 node/source_param_original.csv: -------------------------------------------------------------------------------- 1 | source_no,node_no,P_max(kcf),P_min(kcf),unit_cost($/kcf) 2 | 1,1,12000,1000,2.2 3 | 2,5,8000,1000,2.4 4 | 3,8,8000,1000,2.5 5 | 4,11,5000,1000,2.1 6 | 5,13,6000,500,2.3 7 | -------------------------------------------------------------------------------- /4.2_Scenario_Feasibility/20 node/source_param_original.csv: -------------------------------------------------------------------------------- 1 | source_no,node_no,P_max(kcf),P_min(kcf),unit_cost($/kcf) 2 | 1,1,12000,1000,2.2 3 | 2,5,8000,1000,2.4 4 | 3,8,8000,1000,2.5 5 | 4,11,5000,1000,2.1 6 | 5,13,6000,500,2.3 7 | -------------------------------------------------------------------------------- /4.3_State_Recovery_Performance/20 node/source_param.csv: -------------------------------------------------------------------------------- 1 | source_no,node_no,P_max(kcf),P_min(kcf),unit_cost($/kcf) 2 | 1,1,12000,1000,2.6 3 | 2,5,8000,1000,2.21 4 | 3,8,8000,1000,2.5 5 | 4,11,5000,1000,2.5 6 | 5,13,6000,500,2.3 7 | -------------------------------------------------------------------------------- /4.3_State_Recovery_Performance/20 node/source_param_original.csv: -------------------------------------------------------------------------------- 1 | source_no,node_no,P_max(kcf),P_min(kcf),unit_cost($/kcf) 2 | 1,1,12000,1000,2.2 3 | 2,5,8000,1000,2.4 4 | 3,8,8000,1000,2.5 5 | 4,11,5000,1000,2.1 6 | 5,13,6000,500,2.3 7 | -------------------------------------------------------------------------------- /4.1_Output_Prediction/20 node/compressor_param.csv: -------------------------------------------------------------------------------- 1 | comp_no,inlet_node,outlet_node,min_ratio,max_ratio,max_flow,ZC,BC,alpha,beta,gamma 2 | 1,5,6,1.2,1.8,8000,0.234,227,0,0.003,0 3 | 2,13,14,1.2,1.8,5000,0.233,226,0,0.002,0 4 | 3,17,18,1.2,1.8,8000,0.235,228,0,0.003,0 -------------------------------------------------------------------------------- /4.2_Scenario_Feasibility/20 node/compressor_param.csv: -------------------------------------------------------------------------------- 1 | comp_no,inlet_node,outlet_node,min_ratio,max_ratio,max_flow,ZC,BC,alpha,beta,gamma 2 | 1,5,6,1.2,1.8,8000,0.234,227,0,0.003,0 3 | 2,13,14,1.2,1.8,5000,0.233,226,0,0.002,0 4 | 3,17,18,1.2,1.8,8000,0.235,228,0,0.003,0 -------------------------------------------------------------------------------- /4.3_State_Recovery_Performance/20 node/compressor_param.csv: -------------------------------------------------------------------------------- 1 | comp_no,inlet_node,outlet_node,min_ratio,max_ratio,max_flow,ZC,BC,alpha,beta,gamma 2 | 1,5,6,1.2,1.8,8000,0.234,227,0,0.003,0 3 | 2,13,14,1.2,1.8,5000,0.233,226,0,0.002,0 4 | 3,17,18,1.2,1.8,8000,0.235,228,0,0.003,0 -------------------------------------------------------------------------------- /4.1_Output_Prediction/24 bus/gen_param.csv: -------------------------------------------------------------------------------- 1 | Bus,Pmax,Pmin,Production Cost,Efficiency 2 | 1,0.4,0.05,0.34,0.638 3 | 2,0.192,0.06,0.42,0 4 | 7,0.3,0.025,0.43,0 5 | 13,0.391,0.09,0.36,0.895 6 | 15,0.315,0.05,0.37,1.111 7 | 16,0.155,0.055,0.45,0 8 | 18,0.4,0.1,0.46,0 9 | 22,0.4,0.1,0.45,0 10 | 21,0.5,0,0.44,0 11 | 23,0.5,0,0.46,0 -------------------------------------------------------------------------------- /4.1_Output_Prediction/24 bus/gen_param2.csv: -------------------------------------------------------------------------------- 1 | Bus,Pmax,Pmin,Production Cost,Efficiency 2 | 1,0.4,0.05,0.4,0.638 3 | 2,0.192,0.06,0.35,0 4 | 7,0.3,0.025,0.437,0 5 | 13,0.391,0.09,0.42,0.895 6 | 15,0.315,0.05,0.41,1.111 7 | 16,0.155,0.055,0.38,0 8 | 18,0.4,0.1,0.39,0 9 | 22,0.4,0.1,0.4,0 10 | 21,0.5,0,0.41,0 11 | 23,0.5,0,0.42,0 -------------------------------------------------------------------------------- /4.2_Scenario_Feasibility/24 bus/gen_param.csv: -------------------------------------------------------------------------------- 1 | Bus,Pmax,Pmin,Production Cost,Efficiency 2 | 1,0.4,0.05,0.34,0.638 3 | 2,0.192,0.06,0.42,0 4 | 7,0.3,0.025,0.43,0 5 | 13,0.391,0.09,0.36,0.895 6 | 15,0.315,0.05,0.37,1.111 7 | 16,0.155,0.055,0.45,0 8 | 18,0.4,0.1,0.46,0 9 | 22,0.4,0.1,0.45,0 10 | 21,0.5,0,0.44,0 11 | 23,0.5,0,0.46,0 -------------------------------------------------------------------------------- /4.2_Scenario_Feasibility/24 bus/gen_param2.csv: -------------------------------------------------------------------------------- 1 | Bus,Pmax,Pmin,Production Cost,Efficiency 2 | 1,0.4,0.05,0.4,0.638 3 | 2,0.192,0.06,0.35,0 4 | 7,0.3,0.025,0.437,0 5 | 13,0.391,0.09,0.42,0.895 6 | 15,0.315,0.05,0.41,1.111 7 | 16,0.155,0.055,0.38,0 8 | 18,0.4,0.1,0.39,0 9 | 22,0.4,0.1,0.4,0 10 | 21,0.5,0,0.41,0 11 | 23,0.5,0,0.42,0 -------------------------------------------------------------------------------- /4.3_State_Recovery_Performance/24 bus/gen_param.csv: -------------------------------------------------------------------------------- 1 | Bus,Pmax,Pmin,Production Cost,Efficiency 2 | 1,0.4,0.05,0.34,0.638 3 | 2,0.192,0.06,0.42,0 4 | 7,0.3,0.025,0.43,0 5 | 13,0.391,0.09,0.36,0.895 6 | 15,0.315,0.05,0.37,1.111 7 | 16,0.155,0.055,0.45,0 8 | 18,0.4,0.1,0.46,0 9 | 22,0.4,0.1,0.45,0 10 | 21,0.5,0,0.44,0 11 | 23,0.5,0,0.46,0 -------------------------------------------------------------------------------- /4.3_State_Recovery_Performance/24 bus/gen_param2.csv: -------------------------------------------------------------------------------- 1 | Bus,Pmax,Pmin,Production Cost,Efficiency 2 | 1,0.4,0.05,0.4,0.638 3 | 2,0.192,0.06,0.35,0 4 | 7,0.3,0.025,0.437,0 5 | 13,0.391,0.09,0.42,0.895 6 | 15,0.315,0.05,0.41,1.111 7 | 16,0.155,0.055,0.38,0 8 | 18,0.4,0.1,0.39,0 9 | 22,0.4,0.1,0.4,0 10 | 21,0.5,0,0.41,0 11 | 23,0.5,0,0.42,0 -------------------------------------------------------------------------------- /4.1_Output_Prediction/24 bus/bus_param.csv: -------------------------------------------------------------------------------- 1 | Bus,pLoadFactor 2 | 1,0.038 3 | 2,0.034 4 | 3,0.063 5 | 4,0.026 6 | 5,0.025 7 | 6,0.048 8 | 7,0.044 9 | 8,0.06 10 | 9,0.061 11 | 10,0.068 12 | 11,0 13 | 12,0 14 | 13,0.093 15 | 14,0.068 16 | 15,0.111 17 | 16,0.035 18 | 17,0 19 | 18,0.117 20 | 19,0.064 21 | 20,0.045 22 | 21,0 23 | 22,0 24 | 23,0 25 | 24,0 26 | -------------------------------------------------------------------------------- /4.2_Scenario_Feasibility/24 bus/bus_param.csv: -------------------------------------------------------------------------------- 1 | Bus,pLoadFactor 2 | 1,0.038 3 | 2,0.034 4 | 3,0.063 5 | 4,0.026 6 | 5,0.025 7 | 6,0.048 8 | 7,0.044 9 | 8,0.06 10 | 9,0.061 11 | 10,0.068 12 | 11,0 13 | 12,0 14 | 13,0.093 15 | 14,0.068 16 | 15,0.111 17 | 16,0.035 18 | 17,0 19 | 18,0.117 20 | 19,0.064 21 | 20,0.045 22 | 21,0 23 | 22,0 24 | 23,0 25 | 24,0 26 | -------------------------------------------------------------------------------- /4.3_State_Recovery_Performance/24 bus/bus_param.csv: -------------------------------------------------------------------------------- 1 | Bus,pLoadFactor 2 | 1,0.038 3 | 2,0.034 4 | 3,0.063 5 | 4,0.026 6 | 5,0.025 7 | 6,0.048 8 | 7,0.044 9 | 8,0.06 10 | 9,0.061 11 | 10,0.068 12 | 11,0 13 | 12,0 14 | 13,0.093 15 | 14,0.068 16 | 15,0.111 17 | 16,0.035 18 | 17,0 19 | 18,0.117 20 | 19,0.064 21 | 20,0.045 22 | 21,0 23 | 22,0 24 | 23,0 25 | 24,0 26 | -------------------------------------------------------------------------------- /4.1_Output_Prediction/20 node/node_param.csv: -------------------------------------------------------------------------------- 1 | node_no,gas_load(kcf),P_max(Psig),P_min(Psig) 2 | 1,0,320,300 3 | 2,0,320,300 4 | 3,4000,305,285 5 | 4,5000,295,275 6 | 5,0,265,245 7 | 6,2500,305,290 8 | 7,0,310,295 9 | 8,0,285,265 10 | 9,2000,270,250 11 | 10,3500,265,245 12 | 11,3000,255,235 13 | 12,5500,200,180 14 | 13,0,190,170 15 | 14,0,240,220 16 | 15,0,235,215 17 | 16,0,220,210 18 | 17,0,160,140 19 | 18,0,215,185 20 | 19,1500,180,170 21 | 20,5000,160,140 22 | -------------------------------------------------------------------------------- /4.2_Scenario_Feasibility/20 node/node_param.csv: -------------------------------------------------------------------------------- 1 | node_no,gas_load(kcf),P_max(Psig),P_min(Psig) 2 | 1,0,320,300 3 | 2,0,320,300 4 | 3,4000,305,285 5 | 4,5000,295,275 6 | 5,0,265,245 7 | 6,2500,305,290 8 | 7,0,310,295 9 | 8,0,285,265 10 | 9,2000,270,250 11 | 10,3500,265,245 12 | 11,3000,255,235 13 | 12,5500,200,180 14 | 13,0,190,170 15 | 14,0,240,220 16 | 15,0,235,215 17 | 16,0,220,210 18 | 17,0,160,140 19 | 18,0,215,185 20 | 19,1500,180,170 21 | 20,5000,160,140 22 | -------------------------------------------------------------------------------- /4.3_State_Recovery_Performance/20 node/node_param.csv: -------------------------------------------------------------------------------- 1 | node_no,gas_load(kcf),P_max(Psig),P_min(Psig) 2 | 1,0,320,300 3 | 2,0,320,300 4 | 3,4000,305,285 5 | 4,5000,295,275 6 | 5,0,265,245 7 | 6,2500,305,290 8 | 7,0,310,295 9 | 8,0,285,265 10 | 9,2000,270,250 11 | 10,3500,265,245 12 | 11,3000,255,235 13 | 12,5500,200,180 14 | 13,0,190,170 15 | 14,0,240,220 16 | 15,0,235,215 17 | 16,0,220,210 18 | 17,0,160,140 19 | 18,0,215,185 20 | 19,1500,180,170 21 | 20,5000,160,140 22 | -------------------------------------------------------------------------------- /4.1_Output_Prediction/20 node/pipeline_param.csv: -------------------------------------------------------------------------------- 1 | line_no,from_bus,to_bus,C(kcf/Psig),Capacity(kcf),flow 2 | 1,1,2,115,10000,1 3 | 2,2,3,112.5,10000,1 4 | 3,3,4,65.1,9500,1 5 | 4,4,8,63.4,8000,1 6 | 6,6,7,66.1,8000,1 7 | 7,7,4,60,5000,1 8 | 8,8,11,61.3,11000,1 9 | 9,8,9,65,6000,1 10 | 10,9,10,61.5,5000,1 11 | 11,11,12,60,12000,1 12 | 12,12,13,62.5,8000,1 13 | 14,13,17,67.5,8000,1 14 | 15,14,15,61,5000,1 15 | 16,15,16,59,5000,1 16 | 18,18,19,65.9,8000,1 17 | 19,19,20,67,6000,1 18 | -------------------------------------------------------------------------------- /4.2_Scenario_Feasibility/20 node/pipeline_param.csv: -------------------------------------------------------------------------------- 1 | line_no,from_bus,to_bus,C(kcf/Psig),Capacity(kcf),flow 2 | 1,1,2,115,10000,1 3 | 2,2,3,112.5,10000,1 4 | 3,3,4,65.1,9500,1 5 | 4,4,8,63.4,8000,1 6 | 6,6,7,66.1,8000,1 7 | 7,7,4,60,5000,1 8 | 8,8,11,61.3,11000,1 9 | 9,8,9,65,6000,1 10 | 10,9,10,61.5,5000,1 11 | 11,11,12,60,12000,1 12 | 12,12,13,62.5,8000,1 13 | 14,13,17,67.5,8000,1 14 | 15,14,15,61,5000,1 15 | 16,15,16,59,5000,1 16 | 18,18,19,65.9,8000,1 17 | 19,19,20,67,6000,1 18 | -------------------------------------------------------------------------------- /4.3_State_Recovery_Performance/20 node/pipeline_param.csv: -------------------------------------------------------------------------------- 1 | line_no,from_bus,to_bus,C(kcf/Psig),Capacity(kcf),flow 2 | 1,1,2,115,10000,1 3 | 2,2,3,112.5,10000,1 4 | 3,3,4,65.1,9500,1 5 | 4,4,8,63.4,8000,1 6 | 6,6,7,66.1,8000,1 7 | 7,7,4,60,5000,1 8 | 8,8,11,61.3,11000,1 9 | 9,8,9,65,6000,1 10 | 10,9,10,61.5,5000,1 11 | 11,11,12,60,12000,1 12 | 12,12,13,62.5,8000,1 13 | 14,13,17,67.5,8000,1 14 | 15,14,15,61,5000,1 15 | 16,15,16,59,5000,1 16 | 18,18,19,65.9,8000,1 17 | 19,19,20,67,6000,1 18 | -------------------------------------------------------------------------------- /4.1_Output_Prediction/gradient_comp.m: -------------------------------------------------------------------------------- 1 | function y=gradient_comp(alpha,beta,B,F,Z,p_squared_out,p_squared_in) 2 | H_now=B*F*((p_squared_out/p_squared_in)^(Z/2)-1); 3 | first_step_grad=2*alpha*H_now+beta; 4 | gradient_F=first_step_grad*B*((p_squared_out/p_squared_in)^(Z/2)-1); 5 | gradient_out=first_step_grad*B*F*Z/2/p_squared_out*((p_squared_out/p_squared_in)^(Z/2)); 6 | gradient_in=-first_step_grad*B*F*Z/2/p_squared_in*((p_squared_out/p_squared_in)^(Z/2)); 7 | y=[gradient_F,gradient_out,gradient_in]; 8 | end -------------------------------------------------------------------------------- /4.1_Output_Prediction/24 bus/line_param.csv: -------------------------------------------------------------------------------- 1 | From Bus,To Bus,X,Max Power Flow 2 | 1,2,0.0139,0.175 3 | 1,3,0.2112,0.175 4 | 1,5,0.0845,0.175 5 | 2,4,0.1267,0.175 6 | 2,6,0.192,0.175 7 | 3,9,0.119,0.175 8 | 3,24,0.0839,0.4 9 | 4,9,0.1037,0.175 10 | 5,10,0.0883,0.175 11 | 6,10,0.0605,0.175 12 | 7,8,0.0614,0.175 13 | 8,9,0.1651,0.175 14 | 8,10,0.1651,0.175 15 | 9,11,0.0839,0.4 16 | 9,12,0.0839,0.4 17 | 10,11,0.0839,0.4 18 | 10,12,0.0839,0.4 19 | 11,13,0.0476,0.5 20 | 11,14,0.0418,0.5 21 | 12,13,0.0476,0.5 22 | 12,23,0.0966,0.5 23 | 13,23,0.0865,0.5 24 | 14,16,0.0389,0.5 25 | 15,16,0.0173,0.5 26 | 15,21,0.049,0.5 27 | 15,21,0.049,0.5 28 | 15,24,0.0519,0.5 29 | 16,17,0.0259,0.5 30 | 16,19,0.0231,0.5 31 | 17,18,0.0144,0.5 32 | 17,22,0.1053,0.5 33 | 18,21,0.0259,0.5 34 | 18,21,0.0259,0.5 35 | 19,20,0.0396,0.5 36 | 19,20,0.0396,0.5 37 | 20,23,0.0216,0.5 38 | 20,23,0.0216,0.5 39 | 21,22,0.0678,1 40 | -------------------------------------------------------------------------------- /4.2_Scenario_Feasibility/24 bus/line_param.csv: -------------------------------------------------------------------------------- 1 | From Bus,To Bus,X,Max Power Flow 2 | 1,2,0.0139,0.175 3 | 1,3,0.2112,0.175 4 | 1,5,0.0845,0.175 5 | 2,4,0.1267,0.175 6 | 2,6,0.192,0.175 7 | 3,9,0.119,0.175 8 | 3,24,0.0839,0.4 9 | 4,9,0.1037,0.175 10 | 5,10,0.0883,0.175 11 | 6,10,0.0605,0.175 12 | 7,8,0.0614,0.175 13 | 8,9,0.1651,0.175 14 | 8,10,0.1651,0.175 15 | 9,11,0.0839,0.4 16 | 9,12,0.0839,0.4 17 | 10,11,0.0839,0.4 18 | 10,12,0.0839,0.4 19 | 11,13,0.0476,0.5 20 | 11,14,0.0418,0.5 21 | 12,13,0.0476,0.5 22 | 12,23,0.0966,0.5 23 | 13,23,0.0865,0.5 24 | 14,16,0.0389,0.5 25 | 15,16,0.0173,0.5 26 | 15,21,0.049,0.5 27 | 15,21,0.049,0.5 28 | 15,24,0.0519,0.5 29 | 16,17,0.0259,0.5 30 | 16,19,0.0231,0.5 31 | 17,18,0.0144,0.5 32 | 17,22,0.1053,0.5 33 | 18,21,0.0259,0.5 34 | 18,21,0.0259,0.5 35 | 19,20,0.0396,0.5 36 | 19,20,0.0396,0.5 37 | 20,23,0.0216,0.5 38 | 20,23,0.0216,0.5 39 | 21,22,0.0678,1 40 | -------------------------------------------------------------------------------- /4.3_State_Recovery_Performance/24 bus/line_param.csv: -------------------------------------------------------------------------------- 1 | From Bus,To Bus,X,Max Power Flow 2 | 1,2,0.0139,0.175 3 | 1,3,0.2112,0.175 4 | 1,5,0.0845,0.175 5 | 2,4,0.1267,0.175 6 | 2,6,0.192,0.175 7 | 3,9,0.119,0.175 8 | 3,24,0.0839,0.4 9 | 4,9,0.1037,0.175 10 | 5,10,0.0883,0.175 11 | 6,10,0.0605,0.175 12 | 7,8,0.0614,0.175 13 | 8,9,0.1651,0.175 14 | 8,10,0.1651,0.175 15 | 9,11,0.0839,0.4 16 | 9,12,0.0839,0.4 17 | 10,11,0.0839,0.4 18 | 10,12,0.0839,0.4 19 | 11,13,0.0476,0.5 20 | 11,14,0.0418,0.5 21 | 12,13,0.0476,0.5 22 | 12,23,0.0966,0.5 23 | 13,23,0.0865,0.5 24 | 14,16,0.0389,0.5 25 | 15,16,0.0173,0.5 26 | 15,21,0.049,0.5 27 | 15,21,0.049,0.5 28 | 15,24,0.0519,0.5 29 | 16,17,0.0259,0.5 30 | 16,19,0.0231,0.5 31 | 17,18,0.0144,0.5 32 | 17,22,0.1053,0.5 33 | 18,21,0.0259,0.5 34 | 18,21,0.0259,0.5 35 | 19,20,0.0396,0.5 36 | 19,20,0.0396,0.5 37 | 20,23,0.0216,0.5 38 | 20,23,0.0216,0.5 39 | 21,22,0.0678,1 40 | -------------------------------------------------------------------------------- /4.2_Scenario_Feasibility/bigfluc_feasibility.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import tensorflow_docs as tfdocs 3 | import tensorflow_docs.plots 4 | import tensorflow_docs.modeling 5 | import pandas as pd 6 | import matplotlib.pyplot as plt 7 | import numpy as np 8 | 9 | 10 | df=pd.read_csv('archived_result/electricity_gas_cplex_largefluc_classification2.csv',index_col=0).reset_index() 11 | No_of_nodes=20 12 | No_of_buses=24 13 | No_of_generators=10 14 | No_of_inputs=df.shape[0] 15 | No_of_training_samples=int(No_of_inputs*0.8) # The rest of the samples are set as the test set. 16 | input_list=['loadfactor'+str(i+1) for i in range(No_of_nodes)]+['load_factor_power'+str(i+1) for i in range(No_of_buses)] 17 | output_list=['feasible?'] 18 | df=df[input_list+output_list] 19 | # Divide up the training and testing datasets 20 | train_dataset=df.loc[(No_of_inputs-No_of_training_samples):] 21 | train_labels=train_dataset[output_list] 22 | train_dataset=train_dataset[input_list] 23 | 24 | train_stats=train_dataset.describe().transpose() 25 | test_dataset=df.loc[:(No_of_inputs-No_of_training_samples)] 26 | test_labels=test_dataset[output_list] 27 | test_dataset=test_dataset[input_list] 28 | 29 | # Normalize data 30 | def normalize(x): 31 | return (x-train_stats['mean'])/train_stats['std'] 32 | normed_train_data=normalize(train_dataset) 33 | normed_test_data=normalize(test_dataset) 34 | 35 | # Build a model 36 | model=tf.keras.models.Sequential([ 37 | tf.keras.layers.Dense(6,input_shape=[No_of_nodes+No_of_buses]), 38 | tf.keras.layers.Dropout(0.1), 39 | tf.keras.layers.Dense(6,activation='relu'), 40 | tf.keras.layers.Dropout(0.1), 41 | tf.keras.layers.Dense(1,activation='sigmoid') 42 | ]) 43 | 44 | 45 | optimizer=tf.keras.optimizers.RMSprop(learning_rate=0.0001) 46 | Epochs=20000 47 | model.compile(loss='binary_crossentropy',optimizer=optimizer,metrics=['binary_crossentropy']) 48 | 49 | early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=50) 50 | 51 | history = model.fit(normed_train_data, train_labels, 52 | epochs=Epochs, validation_split = 0.2, verbose=0, 53 | callbacks=[early_stop, tfdocs.modeling.EpochDots()]) 54 | 55 | #history=model.fit(normed_train_data,train_labels, 56 | # epochs=Epochs,validation_split=0.2,verbose=0, 57 | # callbacks=[tfdocs.modeling.EpochDots()]) 58 | 59 | loss,binary_crossentropy=model.evaluate(normed_test_data,test_labels,verbose=1) 60 | 61 | hist=pd.DataFrame(history.history) 62 | hist['epoch']=history.epoch 63 | plotter=tfdocs.plots.HistoryPlotter(smoothing_std=2) 64 | plotter.plot({'Basic': history}, metric = "binary_crossentropy") 65 | plt.ylabel('binary_crossentropy') 66 | temp=np.round(model.predict(normed_test_data).flatten()-np.array(test_labels).flatten()) 67 | print((sum(abs(temp))/len(temp))) 68 | #power_prediction=model.predict(normed_test_data) -------------------------------------------------------------------------------- /4.4_Day_Ahead_Dispatch/Day_Ahead_ANN_training.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import tensorflow_docs as tfdocs 3 | import tensorflow_docs.plots 4 | import tensorflow_docs.modeling 5 | import pandas as pd 6 | import matplotlib.pyplot as plt 7 | 8 | def compute_values(df,test_dataset,gen,time): 9 | time_scale=24 10 | No_of_inputs=df.shape[0] 11 | No_of_training_samples=int(No_of_inputs*1) # The rest of the samples are set as the test set. 12 | input_list=['powerfactor'+str(i+1) for i in range(time_scale)]+['gasfactor'+str(i+1) for i in range(time_scale)] 13 | output_list=['power_generation'+str(gen+1)+'_'+str(time+1)] 14 | output_length=len(output_list) 15 | df=df[input_list+output_list] 16 | 17 | # Divide up the training and testing datasets 18 | train_dataset=df.loc[(No_of_inputs-No_of_training_samples):] 19 | train_labels=train_dataset[output_list] 20 | train_dataset=train_dataset[input_list] 21 | 22 | train_stats=train_dataset.describe().transpose() 23 | #test_dataset=df.loc[:(No_of_inputs-No_of_training_samples)] 24 | #test_labels=test_dataset[output_list] 25 | #test_dataset=test_dataset[input_list] 26 | 27 | # Normalize data 28 | def normalize(x): 29 | return (x-train_stats['mean'])/train_stats['std'] 30 | normed_train_data=normalize(train_dataset) 31 | normed_test_data=normalize(test_dataset) 32 | 33 | model=tf.keras.models.Sequential([ 34 | tf.keras.layers.Dense(15,input_shape=[len(input_list)]), 35 | tf.keras.layers.Dropout(0.15), 36 | tf.keras.layers.Dense(10,activation='relu'), 37 | tf.keras.layers.Dense(output_length) 38 | ]) 39 | 40 | optimizer=tf.keras.optimizers.RMSprop(learning_rate=0.0002) 41 | Epochs=20000 42 | model.compile(loss='mse',optimizer=optimizer,metrics=['mae','mse']) 43 | 44 | early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=50) 45 | 46 | history = model.fit(normed_train_data, train_labels, 47 | epochs=Epochs, validation_split = 0.2, verbose=0, 48 | callbacks=[early_stop, tfdocs.modeling.EpochDots()]) 49 | 50 | hist=pd.DataFrame(history.history) 51 | hist['epoch']=history.epoch 52 | plotter=tfdocs.plots.HistoryPlotter(smoothing_std=2) 53 | plotter.plot({'Basic': history}, metric = "mae") 54 | plt.ylabel('MAE [MPG]') 55 | return model.predict(normed_test_data) 56 | #power_prediction=model.predict(normed_test_data) 57 | 58 | 59 | 60 | Number_of_generators=8 61 | Number_of_timeslots=24 62 | df=pd.read_csv('training_set.csv',index_col=0).reset_index() 63 | test_dataset=pd.read_csv('test_set.csv',index_col=0).reset_index() 64 | final_statistics=test_dataset.copy() 65 | for gen in range(Number_of_generators): 66 | for tt in range(Number_of_timeslots): 67 | temp=compute_values(df,test_dataset,gen,tt) 68 | final_statistics['power_output_'+str(tt+1)+'_'+str(tt+1)]=pd.Series(temp.squeeze()) -------------------------------------------------------------------------------- /4.3_State_Recovery_Performance/electricity_gas_piecewise_pressure.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | import tensorflow as tf 4 | import tensorflow_docs as tfdocs 5 | import tensorflow_docs.plots 6 | import tensorflow_docs.modeling 7 | import matplotlib.pyplot as plt 8 | 9 | def get_pressure_results(node,whether_pressure=True): 10 | df=pd.read_csv('model_data_electricity_gas_piecewise_getpressure.csv',index_col=0).reset_index() 11 | No_of_sources=5 12 | No_of_generators=10 13 | No_of_buses=24 14 | No_of_nodes=20 15 | list_of_vars_input=['loadfactor'+str(i+1) for i in range(No_of_nodes)]+\ 16 | ['load_factor_power'+str(i+1) for i in range(No_of_buses)] 17 | if whether_pressure: 18 | list_of_vars_output=['nodal_pressure'+str(node+1)] 19 | else: 20 | list_of_vars_output=['pipeline_flow'+str(node+1)] 21 | #df_piecewise_result=df_SOC[list_of_vars_new].rename(columns=lambda x:x+' output') 22 | No_of_inputs=df.shape[0] 23 | No_of_training_samples=int(No_of_inputs*0.8) # The rest of the samples are set as the test set. 24 | #No_of_training_samples=int(No_of_inputs) 25 | input_length=len(list_of_vars_input) 26 | output_length=len(list_of_vars_output) 27 | 28 | train_dataset=df 29 | # Divide up the training and testing datasets 30 | #train_dataset=df.loc[(No_of_inputs-No_of_training_samples):] 31 | 32 | avg=np.average(train_dataset[list_of_vars_output]) 33 | train_labels=train_dataset[list_of_vars_output]-avg 34 | train_dataset=train_dataset[list_of_vars_input] 35 | print('avg=',avg) 36 | test_dataset=df.loc[:(No_of_inputs-No_of_training_samples)] 37 | test_labels=test_dataset[list_of_vars_output]-avg 38 | test_dataset=test_dataset[list_of_vars_input] 39 | 40 | # Normalize data 41 | train_stats=train_dataset.describe().transpose() 42 | 43 | def normalize(x): 44 | return (x-train_stats['mean'])/train_stats['std'] 45 | #return x 46 | normed_train_data=normalize(train_dataset) 47 | normed_test_data=normalize(test_dataset) 48 | 49 | #normed_test_data=normalize(pd.read_csv('pressure_testset_correct.csv',index_col=0).reset_index()[list_of_vars_input]) 50 | if df.describe().loc['std'][list_of_vars_output].values[0]<0.3: 51 | print('\n 399 or 398:',No_of_inputs-No_of_training_samples+1) 52 | return np.zeros((No_of_inputs-No_of_training_samples+1,1))+avg 53 | # Build a model 54 | model=tf.keras.models.Sequential([ 55 | tf.keras.layers.Dense(12,input_shape=[input_length]), 56 | tf.keras.layers.Dropout(0.15), 57 | tf.keras.layers.Dense(8,activation='relu'), 58 | tf.keras.layers.Dense(output_length) 59 | ]) 60 | 61 | 62 | optimizer=tf.keras.optimizers.RMSprop(learning_rate=0.0005) 63 | Epochs=20000 64 | model.compile(loss='mse',optimizer=optimizer,metrics=['mae','mse']) 65 | 66 | early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=50) 67 | #normed_train_data = normed_train_data.repeat().shuffle(No_of_training_samples) 68 | history = model.fit(normed_train_data, train_labels, 69 | epochs=Epochs, validation_split = 0.2,verbose=0, 70 | #callbacks=[early_stop]) 71 | callbacks=[early_stop, tfdocs.modeling.EpochDots()]) 72 | 73 | #loss,mae,mse=model.evaluate(normed_test_data,test_labels,verbose=1) 74 | 75 | hist=pd.DataFrame(history.history) 76 | hist['epoch']=history.epoch 77 | plotter=tfdocs.plots.HistoryPlotter(smoothing_std=2) 78 | plotter.plot({'Basic': history}, metric = "mae") 79 | plt.ylabel('MAE [MPG]') 80 | #print(np.mean(abs(model.predict(normed_test_data).flatten()-np.array(test_labels).flatten()))) 81 | 82 | return model.predict(normed_test_data)+avg 83 | statistics_pressure=pd.DataFrame() 84 | for node in range(20): 85 | temp=get_pressure_results(node,whether_pressure=True) 86 | statistics_pressure['node '+str(node+1)]=pd.Series(temp.squeeze()) 87 | statistics_pressure.to_csv('templist_newversion20200831.csv') -------------------------------------------------------------------------------- /4.1_Output_Prediction/deep_learning_electricity_gas_getsource.py: -------------------------------------------------------------------------------- 1 | # 进行求解 2 | import tensorflow as tf 3 | import tensorflow_docs as tfdocs 4 | import tensorflow_docs.plots 5 | import tensorflow_docs.modeling 6 | import pandas as pd 7 | import matplotlib.pyplot as plt 8 | import numpy as np 9 | 10 | def get_power_gen(df,No_of_nodes=20,No_of_buses=24,No_of_generators=10,zoom=10000): 11 | """"Use an NN to predict power generation""" 12 | #df=pd.read_csv('archived_result/electricity_gas_cplex_smallfluc_differentprice.csv',index_col=0).reset_index() 13 | 14 | No_of_inputs=df.shape[0] 15 | No_of_training_samples=int(No_of_inputs*0.8) # The rest of the samples are set as the test set. 16 | input_list=['loadfactor'+str(i+1) for i in range(No_of_nodes)]+['load_factor_power'+str(i+1) for i in range(No_of_buses)] 17 | output_list=['power_generation'+str(i+1) for i in range(No_of_generators)] 18 | 19 | #output_list=['source_generation'+str(i+1) for i in range(No_of_sources)]+['power_generation'+str(i+1) for i in range(No_of_generators)] 20 | #output_list=['source_generation'+str(i+1) for i in range(No_of_sources)] 21 | #power_gen_list=['power_generation'+str(i+1) for i in range(No_of_generators)] 22 | output_length=len(output_list) 23 | 24 | #df[power_gen_list]*=10000 25 | df[output_list]*=zoom 26 | #avg=np.average(df.loc[(No_of_inputs-No_of_training_samples):][output_list],axis=0) 27 | df=df[input_list+output_list] 28 | # Divide up the training and testing datasets 29 | train_dataset=df.loc[(No_of_inputs-No_of_training_samples):] 30 | train_labels=train_dataset[output_list] 31 | train_dataset=train_dataset[input_list] 32 | 33 | train_stats=train_dataset.describe().transpose() 34 | test_dataset=df.loc[:(No_of_inputs-No_of_training_samples)] 35 | test_labels=test_dataset[output_list] 36 | test_dataset=test_dataset[input_list] 37 | 38 | # Normalize data 39 | def normalize(x): 40 | return (x-train_stats['mean'])/train_stats['std'] 41 | normed_train_data=normalize(train_dataset) 42 | normed_test_data=normalize(test_dataset) 43 | 44 | # Build a model 45 | model=tf.keras.models.Sequential([ 46 | tf.keras.layers.Dense(20,input_shape=[No_of_nodes+No_of_buses]), 47 | tf.keras.layers.Dense(10,activation='relu'), 48 | tf.keras.layers.Dense(output_length) 49 | ]) 50 | 51 | 52 | optimizer=tf.keras.optimizers.RMSprop(learning_rate=0.0004) 53 | Epochs=20000 54 | model.compile(loss='mse',optimizer=optimizer,metrics=['mae','mse']) 55 | 56 | early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=50) 57 | 58 | history = model.fit(normed_train_data, train_labels, 59 | epochs=Epochs, validation_split = 0.2, verbose=0, 60 | callbacks=[early_stop, tfdocs.modeling.EpochDots()]) 61 | 62 | #history=model.fit(normed_train_data,train_labels, 63 | # epochs=Epochs,validation_split=0.2,verbose=0, 64 | # callbacks=[tfdocs.modeling.EpochDots()]) 65 | 66 | loss,mae,mse=model.evaluate(normed_test_data,test_labels,verbose=1) 67 | 68 | hist=pd.DataFrame(history.history) 69 | hist['epoch']=history.epoch 70 | plotter=tfdocs.plots.HistoryPlotter(smoothing_std=2) 71 | plotter.plot({'Basic': history}, metric = "mae") 72 | plt.ylabel('MAE [MPG]') 73 | print(np.mean(abs(model.predict(normed_test_data).flatten()-np.array(test_labels).flatten()))) 74 | #power_prediction=model.predict(normed_test_data) 75 | return model,normed_test_data,test_labels 76 | 77 | def get_gas_source(df,No_of_nodes=20,No_of_buses=24,No_of_sources=5,zoom=1): 78 | """"Use an NN to predict source generation""" 79 | No_of_inputs=df.shape[0] 80 | No_of_training_samples=int(No_of_inputs*0.8) # The rest of the samples are set as the test set. 81 | input_list=['loadfactor'+str(i+1) for i in range(No_of_nodes)]+['load_factor_power'+str(i+1) for i in range(No_of_buses)] 82 | output_list=['source_generation'+str(i+1) for i in range(No_of_sources)] 83 | output_length=len(output_list) 84 | df[output_list]*=zoom 85 | df=df[input_list+output_list] 86 | # Divide up the training and testing datasets 87 | train_dataset=df.loc[(No_of_inputs-No_of_training_samples):] 88 | train_labels=train_dataset[output_list] 89 | train_dataset=train_dataset[input_list] 90 | 91 | train_stats=train_dataset.describe().transpose() 92 | test_dataset=df.loc[:(No_of_inputs-No_of_training_samples)] 93 | test_labels=test_dataset[output_list] 94 | test_dataset=test_dataset[input_list] 95 | 96 | # Normalize data 97 | def normalize(x): 98 | return (x-train_stats['mean'])/train_stats['std'] 99 | normed_train_data=normalize(train_dataset) 100 | normed_test_data=normalize(test_dataset) 101 | 102 | # Build a model 103 | model=tf.keras.models.Sequential([ 104 | tf.keras.layers.Dense(30,input_shape=[No_of_nodes+No_of_buses]), 105 | tf.keras.layers.Dense(10,activation='relu'), 106 | tf.keras.layers.Dense(output_length) 107 | ]) 108 | 109 | optimizer=tf.keras.optimizers.RMSprop(learning_rate=0.001) 110 | Epochs=20000 111 | model.compile(loss='mse',optimizer=optimizer,metrics=['mae','mse']) 112 | 113 | early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=50) 114 | 115 | history = model.fit(normed_train_data, train_labels, 116 | epochs=Epochs, validation_split = 0.2, verbose=0, 117 | callbacks=[early_stop, tfdocs.modeling.EpochDots()]) 118 | 119 | 120 | #history=model.fit(normed_train_data,train_labels, 121 | # epochs=Epochs,validation_split=0.2,verbose=0, 122 | # callbacks=[tfdocs.modeling.EpochDots()]) 123 | 124 | loss,mae,mse=model.evaluate(normed_test_data,test_labels,verbose=1) 125 | 126 | hist=pd.DataFrame(history.history) 127 | hist['epoch']=history.epoch 128 | # plotter=tfdocs.plots.HistoryPlotter(smoothing_std=2) 129 | # plotter.plot({'Basic': history}, metric = "mae") 130 | # plt.ylabel('MAE [MPG]') 131 | print(np.mean(abs(model.predict(normed_test_data).flatten()-np.array(test_labels).flatten()))) 132 | return model,normed_test_data,test_labels -------------------------------------------------------------------------------- /4.1_Output_Prediction/Electricity_Gas_CPLEX.m: -------------------------------------------------------------------------------- 1 | tic; 2 | fid = fopen('training_test_set.csv', 'w'); 3 | 4 | %% Load in power networks 5 | bus_param=csvread('24 bus/bus_param.csv',1); 6 | branch_param=csvread('24 bus/line_param.csv',1); 7 | gen_param=csvread('24 bus/gen_param.csv',1); 8 | Factor=9; 9 | gen_param(:,2)=gen_param(:,2)/Factor; 10 | gen_param(:,3)=gen_param(:,3)/Factor; 11 | branch_param(:,4)=branch_param(:,4)/Factor; 12 | No_of_buses=size(bus_param,1); 13 | No_of_branches=size(branch_param,1); 14 | No_of_generators=size(gen_param,1); 15 | 16 | %% Load in parameters 17 | No_of_nodes=20; 18 | Total_power_load=2.2/Factor; 19 | node_param=csvread(strcat(num2str(No_of_nodes),' node/node_param.csv'),1); 20 | pipeline_param=csvread(strcat(num2str(No_of_nodes),' node/pipeline_param.csv'),1); 21 | source_param=csvread(strcat(num2str(No_of_nodes),' node/source_param.csv'),1); 22 | compressor_param=csvread(strcat(num2str(No_of_nodes),' node/compressor_param.csv'),1); 23 | 24 | Z_list=compressor_param(:,7); 25 | B_list=compressor_param(:,8); 26 | alpha_list=compressor_param(:,9); 27 | beta_list=compressor_param(:,10); 28 | gamma_list=compressor_param(:,11); 29 | 30 | %% Set up Big-M and count the number of facilities 31 | Big_M=1e10; 32 | No_of_pipelines=size(pipeline_param,1); 33 | No_of_sources=size(source_param,1); 34 | No_of_compressors=size(compressor_param,1); 35 | 36 | for j=1:No_of_nodes 37 | fprintf(fid,'loadfactor%d,',j); 38 | end 39 | 40 | for j=1:No_of_buses 41 | fprintf(fid,'load_factor_power%d,',j); 42 | end 43 | 44 | fprintf(fid,'optimal_solution,'); 45 | 46 | for j=1:No_of_sources 47 | fprintf(fid,'source_generation%d,',j); 48 | end 49 | 50 | for j=1:No_of_generators-1 51 | fprintf(fid,'power_generation%d,',j); 52 | end 53 | fprintf(fid,'power_generation%d\n',No_of_generators); 54 | %% Set up the decision_variables 55 | nodal_pressure_squared=sdpvar(No_of_nodes,1,'full'); 56 | source_generation=sdpvar(No_of_sources,1,'full'); 57 | pipeline_flow=sdpvar(No_of_pipelines,1,'full'); 58 | direction_flow=binvar(No_of_pipelines,1,'full'); 59 | pipeline_direction=binvar(No_of_pipelines,1,'full'); 60 | compressor_flow=sdpvar(No_of_compressors,1,'full'); 61 | compressor_H=sdpvar(No_of_compressors,1,'full'); 62 | compressor_consumption=sdpvar(No_of_compressors,1,'full'); 63 | 64 | power_generation=sdpvar(No_of_generators,1,'full'); 65 | angle=sdpvar(No_of_buses,1,'full'); 66 | branch_flow=sdpvar(No_of_branches,1,'full'); 67 | G2P_corr=[5,1,4; % Generator Number 68 | 3,5,11; % Node Number 69 | 1.111,0.638,0.895]; % Power Conversion Effiency 70 | %% Set up upper and lower bounds for the gas nodes. 71 | CONT1= node_param(:,4).^2<=nodal_pressure_squared<=node_param(:,3).^2; 72 | CONT2= -pipeline_param(:,5)<=pipeline_flow<=pipeline_param(:,5); 73 | CONT3= source_param(:,4)<=source_generation<=source_param(:,3); 74 | CONT4= 0<=compressor_flow<=compressor_param(:,6); 75 | 76 | %% Set up gas pressure ratio constraints at a compressor. 77 | CONT5=[]; 78 | for i=1:No_of_compressors 79 | CONT5=[CONT5,(compressor_param(i,4))^2 * nodal_pressure_squared(compressor_param(i,2))<= ... 80 | nodal_pressure_squared(compressor_param(i,3))<=(compressor_param(i,5))^2 * nodal_pressure_squared(compressor_param(i,2))]; 81 | end 82 | 83 | %% Generator Output & DC power flow 84 | CONT6= gen_param(:,3)<=power_generation<=gen_param(:,2); 85 | CONT7=[]; 86 | for i=1:No_of_branches 87 | CONT7=[CONT7,branch_flow(i)==(angle(branch_param(i,1))-angle(branch_param(i,2)))/(branch_param(i,3)*10)]; 88 | end 89 | 90 | CONT8= -branch_param(:,4)<=branch_flow<=branch_param(:,4); 91 | 92 | 93 | %% Gas Flow Equation 94 | W=sdpvar(No_of_pipelines,1,'full'); 95 | CONT9=[]; 96 | for i=1:No_of_pipelines 97 | CONT9=[CONT9,-Big_M*direction_flow(i)<=nodal_pressure_squared(pipeline_param(i,2))-nodal_pressure_squared(pipeline_param(i,3)),... 98 | nodal_pressure_squared(pipeline_param(i,2))-nodal_pressure_squared(pipeline_param(i,3))<=Big_M*(1-direction_flow(i))]; % OK 99 | CONT9=[CONT9,-Big_M*direction_flow(i)<=pipeline_flow(i),pipeline_flow(i)<=Big_M*(1-direction_flow(i))]; %OK 100 | CONT9=[CONT9,-Big_M*direction_flow(i)+nodal_pressure_squared(pipeline_param(i,2))-nodal_pressure_squared(pipeline_param(i,3))<=W(i), ... 101 | W(i)<=Big_M*direction_flow(i)+nodal_pressure_squared(pipeline_param(i,2))-nodal_pressure_squared(pipeline_param(i,3))]; %OK 102 | CONT9=[CONT9,-Big_M*(1-direction_flow(i))-nodal_pressure_squared(pipeline_param(i,2))+nodal_pressure_squared(pipeline_param(i,3))<=W(i),... 103 | W(i)<=Big_M*(1-direction_flow(i))-nodal_pressure_squared(pipeline_param(i,2))+nodal_pressure_squared(pipeline_param(i,3))]; %OK 104 | end 105 | 106 | CONT10=[]; 107 | K=pipeline_param(:,4).^2; 108 | for i=1:No_of_pipelines 109 | CONT10=[CONT10,norm([2*pipeline_flow(i),K(i)-W(i)])<=K(i)+W(i)]; % OK 110 | end 111 | coeff=0.1; 112 | rng(1); 113 | toc; 114 | tic; 115 | for iter=1:10000 116 | load_factor_power=rand([No_of_buses,1])*coeff*2-coeff; 117 | load_factor=rand([No_of_nodes,1])*coeff*2-coeff; 118 | direction_flow=zeros(No_of_pipelines,1); 119 | 120 | %% Nodal balance Equation (For Natural Gas) 121 | node_injection=sdpvar(No_of_nodes,1,'full'); 122 | CONT11= node_injection(:)==0; 123 | 124 | for i=1:No_of_sources 125 | node_injection(source_param(i,2))=node_injection(source_param(i,2))+source_generation(i); 126 | end 127 | 128 | for i=1:size(G2P_corr,2) 129 | node_param(G2P_corr(2,i),2)=0; 130 | end 131 | 132 | node_injection=node_injection-node_param(:,2).*(1+load_factor); 133 | 134 | for i=1:size(G2P_corr,2) 135 | node_injection(G2P_corr(2,i))=node_injection(G2P_corr(2,i))-power_generation(G2P_corr(1,i))*G2P_corr(3,i)*35.3147*1e3; 136 | end 137 | 138 | for i=1:No_of_pipelines 139 | node_injection(pipeline_param(i,2))=node_injection(pipeline_param(i,2))-pipeline_flow(i); 140 | node_injection(pipeline_param(i,3))=node_injection(pipeline_param(i,3))+pipeline_flow(i); 141 | end 142 | 143 | for i=1:No_of_compressors 144 | node_injection(compressor_param(i,2))=node_injection(compressor_param(i,2))-compressor_flow(i)-compressor_consumption(i); 145 | node_injection(compressor_param(i,3))=node_injection(compressor_param(i,3))+compressor_flow(i); 146 | end 147 | 148 | CONT12= node_injection==0; 149 | 150 | %% Nodal Balance Equations for power system 151 | power_injection=sdpvar(No_of_buses,1,'full'); 152 | CONT13= power_injection==0; 153 | for i=1:No_of_generators 154 | power_injection(gen_param(i,1))=power_injection(gen_param(i,1))+power_generation(i); 155 | end 156 | 157 | for i=1:No_of_buses 158 | power_injection(i)=power_injection(i)-bus_param(i,2)*(1+load_factor_power(i))*Total_power_load; 159 | end 160 | 161 | for i=1:No_of_branches 162 | power_injection(branch_param(i,1))=power_injection(branch_param(i,1))-branch_flow(i); 163 | power_injection(branch_param(i,2))=power_injection(branch_param(i,2))+branch_flow(i); 164 | end 165 | CONT14= power_injection==0; 166 | %% Set objective and solve 167 | objective=sum(source_param(:,5).*source_generation)+sum(gen_param(:,4).*power_generation*1e6); 168 | penalty_factor=0.001*ones(No_of_pipelines,1); 169 | penalty=sum(penalty_factor.*(K+W)); 170 | Constraints=[CONT1,CONT2,CONT3,CONT4,CONT5,CONT6,CONT7,CONT8,CONT9,CONT10,CONT11,CONT12,CONT13,CONT14]; 171 | ops=sdpsettings('solver','cplex','verbose',0); 172 | epsilon=0.01; 173 | Max_iteration=50; 174 | consumption_old=-1*ones(No_of_compressors,1); 175 | break_indicator=1; 176 | for iteration=1:Max_iteration 177 | sol=optimize(Constraints,objective+penalty,ops); 178 | if sol.problem~=0 179 | break_indicator=0; 180 | break 181 | end 182 | consumption_new=value(compressor_consumption); 183 | error=abs(consumption_new-consumption_old); 184 | if max(error)>epsilon 185 | for i=1:No_of_compressors 186 | if error(i)>epsilon 187 | current_flow=value(compressor_flow(i)); 188 | current_p_out=value(nodal_pressure_squared(compressor_param(i,3))); 189 | current_p_in=value(nodal_pressure_squared(compressor_param(i,2))); 190 | current_H=B_list(i)*current_flow*((current_p_out/current_p_in)^(Z_list(i)/2)-1); 191 | current_consumption=alpha_list(i)*current_H^2+beta_list(i)*current_H+gamma_list(i); 192 | temp=gradient_comp(alpha_list(i),beta_list(i),B_list(i),current_flow, ... 193 | Z_list(i),current_p_out,current_p_in); 194 | gradient_F=temp(1);gradient_out=temp(2);gradient_in=temp(3); 195 | Constraints=[Constraints,compressor_consumption(i)>= ... 196 | current_consumption+gradient_F*(compressor_flow(i)-current_flow)+ ... 197 | gradient_out*(nodal_pressure_squared(compressor_param(i,3))-current_p_out)+ ... 198 | gradient_in*(nodal_pressure_squared(compressor_param(i,2))-current_p_in)]; 199 | consumption_old=consumption_new; 200 | end 201 | end 202 | else 203 | break 204 | end 205 | end 206 | % if break_indicator 207 | % for j=1:No_of_nodes 208 | % fprintf(fid,'%d,',load_factor(j)); 209 | % end 210 | % 211 | % for j=1:No_of_buses 212 | % fprintf(fid,'%d,',load_factor_power(j)); 213 | % end 214 | % 215 | % fprintf(fid,'%d,',value(objective)); 216 | % 217 | % for j=1:No_of_sources 218 | % fprintf(fid,'%d,',value(source_generation(j))); 219 | % end 220 | % 221 | % for j=1:No_of_generators-1 222 | % fprintf(fid,'%d,',value(power_generation(j))); 223 | % end 224 | % fprintf(fid,'%d\n',value(power_generation(No_of_generators))); 225 | % end 226 | end 227 | toc; --------------------------------------------------------------------------------