├── vers.m ├── L_tine.m ├── SCUC_nodeY.m ├── TS_UCC_DRO.m ├── vers_nonb.m ├── ReadDataSCUC.m ├── data ├── Wind_power.xlsx ├── Wind_power_flc.xlsx ├── SCUC6.txt ├── SCUC30.txt └── SCUC118.txt ├── Sumt.m ├── Zboth.m ├── Zhat_nonb.m ├── ReadWindData.m ├── U_matrix.m ├── Zbin.m ├── Zhat.m ├── L_hat.m ├── README.md └── BDR_UCC_DRO.m /vers.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfengYang/MDR_MS_DRO/HEAD/vers.m -------------------------------------------------------------------------------- /L_tine.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfengYang/MDR_MS_DRO/HEAD/L_tine.m -------------------------------------------------------------------------------- /SCUC_nodeY.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfengYang/MDR_MS_DRO/HEAD/SCUC_nodeY.m -------------------------------------------------------------------------------- /TS_UCC_DRO.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfengYang/MDR_MS_DRO/HEAD/TS_UCC_DRO.m -------------------------------------------------------------------------------- /vers_nonb.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfengYang/MDR_MS_DRO/HEAD/vers_nonb.m -------------------------------------------------------------------------------- /ReadDataSCUC.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfengYang/MDR_MS_DRO/HEAD/ReadDataSCUC.m -------------------------------------------------------------------------------- /data/Wind_power.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfengYang/MDR_MS_DRO/HEAD/data/Wind_power.xlsx -------------------------------------------------------------------------------- /data/Wind_power_flc.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfengYang/MDR_MS_DRO/HEAD/data/Wind_power_flc.xlsx -------------------------------------------------------------------------------- /Sumt.m: -------------------------------------------------------------------------------- 1 | %% Sum_t by yy 2021.10.28 2 | function [sumt] = Sumt(t) 3 | 4 | sumt = 0; 5 | for i = 1:t 6 | sumt = sumt + i; 7 | end 8 | 9 | end -------------------------------------------------------------------------------- /Zboth.m: -------------------------------------------------------------------------------- 1 | %% Zboth by yy 2022.3.25 2 | function [Z] = Zboth(Y1,Y2,t,T,W,n,C1,C2,bpN,bN) 3 | 4 | Z = [0,Y1(n,t) - C1,Y2(n,t) - C2]; 5 | for tt = 1:t 6 | for w = 1:W 7 | Z = [Z,0,Y1(n,T+1+(Sumt(t-1)+(tt-1))*W*bN+(w-1)*bN :T+(Sumt(t-1)+(tt-1))*W*bN+w*bN),zeros(1,bpN)]; 8 | end 9 | end 10 | 11 | 12 | end -------------------------------------------------------------------------------- /Zhat_nonb.m: -------------------------------------------------------------------------------- 1 | %% Zhat_nonb by yy 2022.4.10 2 | function [Z] = Zhat_nonb(Y,t,T,W,n,C,bN) 3 | 4 | Z = []; 5 | for tt = 1:t 6 | if tt == t 7 | Z = [Z,0,Y(n,t) - C]; 8 | else 9 | Z = [Z,0,0]; 10 | end 11 | end 12 | 13 | for tt = 1:t 14 | for w = 1:W 15 | Z = [Z,0,Y(n,T+1+(Sumt(t-1)+(tt-1))*W*bN+(w-1)*bN :T+(Sumt(t-1)+(tt-1))*W*bN+w*bN)]; 16 | end 17 | end 18 | 19 | end -------------------------------------------------------------------------------- /ReadWindData.m: -------------------------------------------------------------------------------- 1 | %% ReadWindData by yy 2021.8.27 2 | function [data_Wind] = ReadWindData(data,Filedir) 3 | 4 | wind_num = data.Wind.wind_Number; %number of wind units 5 | 6 | wind = xlsread(Filedir); %read wind data 7 | data = wind(1:end,2:end); 8 | data = data(:,9:8+wind_num); 9 | data = rmmissing(data,1); 10 | data = data * 0.0009; 11 | data(data < 1e-3) = 0; 12 | 13 | for i = 1:wind_num 14 | data_Wind{i} = reshape(data(:,i),24,[]); 15 | end 16 | 17 | end 18 | 19 | -------------------------------------------------------------------------------- /U_matrix.m: -------------------------------------------------------------------------------- 1 | %% U_matrix by yy 2021.10.29 2 | function [U] = U_matrix(verts_noksi,t) 3 | 4 | U = []; 5 | v = []; 6 | [row,col] = size(verts_noksi); 7 | I = row*2; 8 | for i = 1:I 9 | if i <= row 10 | v(i,:) = verts_noksi(i,1+(t-1)*8:4+(t-1)*8); 11 | else 12 | v(i,:) = verts_noksi(i-row,5+(t-1)*8:8*t); 13 | end 14 | end 15 | for i = 1:I 16 | U = blkdiag(U,v(i,:)); 17 | end 18 | % U = blkdiag(v(1,:),v(2,:),v(3,:),v(4,:),v(5,:),v(6,:),v(7,:),v(8,:),v(9,:),v(10,:)); 19 | end 20 | -------------------------------------------------------------------------------- /Zbin.m: -------------------------------------------------------------------------------- 1 | %% Zbin by yy 2022.3.28 2 | function [Z] = Zbin(Y,t,T,W,n,C,bpN,bN) 3 | 4 | Z = []; 5 | for tt = 1:t 6 | if tt==t 7 | Z = [Z,0,0,Y(n,t) - C]; 8 | else 9 | Z = [Z,0,0,0]; 10 | end 11 | end 12 | for tt = 1:t 13 | for w = 1:W 14 | Z = [Z,0,zeros(1,bN),Y(n,T+1+(Sumt(t-1)+(tt-1))*W*bpN+(w-1)*bpN :T+(Sumt(t-1)+(tt-1))*W*bpN+w*bpN)]; 15 | end 16 | end 17 | 18 | end 19 | 20 | % function [Z] = Zbin(Y,t,T,W,n,C,bpN,bN) 21 | % 22 | % Z = [0,0,Y(n,t) - C]; 23 | % for tt = 1:t 24 | % for w = 1:W 25 | % Z = [Z,0,zeros(1,bN),Y(n,T+1+(Sumt(t-1)+(tt-1))*W*bpN+(w-1)*bpN :T+(Sumt(t-1)+(tt-1))*W*bpN+w*bpN)]; 26 | % end 27 | % end 28 | % 29 | % end -------------------------------------------------------------------------------- /Zhat.m: -------------------------------------------------------------------------------- 1 | %% Zhat by yy 2022.3.25 2 | function [Z] = Zhat(Y,t,T,W,n,C,bpN,bN) 3 | 4 | Z = []; 5 | for tt = 1:t 6 | if tt == t 7 | Z = [Z,0,Y(n,t) - C,0]; 8 | else 9 | Z = [Z,0,0,0]; 10 | end 11 | end 12 | 13 | for tt = 1:t 14 | for w = 1:W 15 | Z = [Z,0,Y(n,T+1+(Sumt(t-1)+(tt-1))*W*bN+(w-1)*bN :T+(Sumt(t-1)+(tt-1))*W*bN+w*bN),zeros(1,bpN)]; 16 | end 17 | end 18 | 19 | end 20 | 21 | % function [Z] = Zhat(Y,t,T,W,n,C,bpN,bN) 22 | % if bpN == 0 23 | % Z = [0,Y(n,t) - C]; 24 | % else 25 | % Z = [0,Y(n,t) - C,0]; 26 | % end 27 | % for tt = 1:t 28 | % for w = 1:W 29 | % Z = [Z,0,Y(n,T+1+(Sumt(t-1)+(tt-1))*W*bN+(w-1)*bN :T+(Sumt(t-1)+(tt-1))*W*bN+w*bN),zeros(1,bpN)]; 30 | % end 31 | % end 32 | % 33 | % end 34 | -------------------------------------------------------------------------------- /L_hat.m: -------------------------------------------------------------------------------- 1 | %% Lhat by yy 2021.8.27 2 | % function [ksi_hat] = L_hat(ksi,bN,bp) 3 | % 4 | % ksi_hat = []; 5 | % if (bN == 1) 6 | % ksi_hat = ksi; 7 | % else 8 | % for i = 1:bN 9 | % if (i == 1) 10 | % mid = min(ksi,bp(i+1,1)); 11 | % ksi_hat = [ksi_hat;mid]; 12 | % else 13 | % mid = min(ksi,bp(i+1,1)); 14 | % mid = mid - bp(i,1); 15 | % mid = max(0,mid); 16 | % ksi_hat = [ksi_hat;mid]; 17 | % end 18 | % end 19 | % end 20 | % 21 | % end 22 | function [ksi_hat] = L_hat(ksi,bN,bp) 23 | 24 | ksi_hat = []; 25 | if (bN == 1) 26 | ksi_hat = ksi; 27 | else 28 | for i = 1:bN 29 | mid = min(ksi,bp(i+1,1)); 30 | mid = mid - bp(i,1); 31 | mid = max(0,mid); 32 | ksi_hat = [ksi_hat;mid]; 33 | end 34 | end 35 | 36 | end -------------------------------------------------------------------------------- /data/SCUC6.txt: -------------------------------------------------------------------------------- 1 | 6 7 1 100 50 0.1 3 2 | 1 1 176.950782 13.51476415 0.0004 220 100 200 -80 4 4 4 55 10 3 | 2 2 129.9709568 32.63061347 0.001 100 10 70 -40 3 3 2 50 200 4 | 3 6 137.4120219 17.69711347 0.005 20 10 50 -40 0 1 1 20 100 5 | 0 6 | 1 1.15 0.95 7 | 2 1.15 0.85 8 | 3 1.15 0.85 9 | 4 1.15 0.91 10 | 5 1.15 0.85 11 | 6 1.15 0.85 12 | 0 13 | 1 1 2 1 0.0050 0.170 0 200 14 | 2 1 4 1 0.0030 0.258 0 100 15 | 3 2 4 1 0.0070 0.197 0 100 16 | 4 5 6 1 0.0020 0.140 0 100 17 | 5 3 6 1 0.0005 0.018 0 100 18 | 0 19 | 6 2 3 1 0 0.037 0 500 0.97 20 | 7 4 5 1 0 0.037 0 500 0.97 21 | 0 22 | 1 175.19 50.37 0.88 0.88 1.75 3.50 8.76 23 | 2 165.15 47.48 0.83 0.83 1.65 3.30 8.26 24 | 3 158.67 45.62 0.79 0.79 1.59 3.17 7.93 25 | 4 154.73 44.49 0.77 0.77 1.55 3.09 7.74 26 | 5 155.06 44.58 0.78 0.78 1.55 3.10 7.75 27 | 6 160.48 46.14 0.80 0.80 1.60 3.21 8.02 28 | 7 173.39 49.85 0.87 0.87 1.73 3.47 8.67 29 | 8 177.60 51.06 0.95 0.95 1.90 3.81 9.52 30 | 9 186.81 53.71 1.03 1.03 2.06 4.11 10.28 31 | 10 206.96 59.50 1.09 1.09 2.17 4.34 10.86 32 | 11 228.61 65.73 1.14 1.14 2.29 4.57 11.43 33 | 12 236.10 67.88 1.18 1.18 2.36 4.72 11.80 34 | 13 242.18 69.63 1.21 1.21 2.42 4.84 12.11 35 | 14 243.60 70.03 1.22 1.22 2.44 4.87 12.18 36 | 15 248.86 71.55 1.24 1.24 2.49 4.98 12.44 37 | 16 255.79 73.54 1.28 1.28 2.56 5.12 12.79 38 | 17 256.00 73.60 1.28 1.28 2.56 5.12 12.80 39 | 18 246.74 70.94 1.23 1.23 2.47 4.93 12.34 40 | 19 245.97 70.72 1.23 1.23 2.46 4.92 12.30 41 | 20 237.35 68.24 1.19 1.19 2.37 4.75 11.87 42 | 21 237.31 68.23 1.19 1.19 2.37 4.75 11.87 43 | 22 232.67 66.89 1.14 1.14 2.27 4.54 11.36 44 | 23 195.93 56.33 1.01 1.01 2.01 4.02 10.05 45 | 24 195.60 56.23 0.98 0.98 1.97 3.94 9.84 46 | 0 47 | 3 20 23 48 | 4 40 38.5 49 | 5 40 38.5 50 | 0 51 | 1 52 | 3 53 | 0 54 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Fully Adaptive Distributionally Robust Multi-stage Framework for Uncertain Unit Commitment Based on Mixed Decision Rules 2 | 3 | ================ 4 | 5 | What about this project/study? 6 | 7 | 8 | With growing penetration of wind power into the power grid, while achieving low cost sustainable electricity supply, it also 9 | introduces technical challenges with the associated intermittency. This paper proposes a fully adaptive Wasserstein-based 10 | distributionally robust multi-stage frame-work based on mixed decision rules (MDR) for uncertain unit commitment problem (UUC) to 11 | better adapt wind pow-er respecting non-anticipativity both in unit state decision and dispatch process. Comparing with the existing 12 | multi-stage model, the proposed framework introduces an im-proved MDR to handle all decision variables to expand feasible region, thus, 13 | this framework can obtain various typical models by adjusting the number of relevant periods of decision variables. As a result, our 14 | model can find feasi-ble solution to some problems that are not feasible in the traditional models while finding better solution to 15 | feasible problems. The proposed model is reformulated with ad-vanced optimization method and improved MDR to form the mixed integer 16 | linear programming (MILP) model to address the computational intractability. The effectiveness and efficiency of the proposed model 17 | have been validated with case studies using IEEE benchmark systems. 18 | 19 | 20 | User Guide 21 | ----------- 22 | 23 | The description of implement code files 24 | 25 | BDR_UCC_DRO : Our proposed DR_MDR framework. 26 | 27 | TS_UCC_DRO : The typical multi-stage DRO model. 28 | 29 | ReadDataSCUC : Read the data. 30 | 31 | ReadWindData : Read the wind data. 32 | 33 | SCUC_nodeY : Construct network admittance matrix. 34 | 35 | L_hat : Continuous lifting operator. 36 | 37 | L_tine : Binary lifting operator. 38 | 39 | Sumt : Calculate number of periods. 40 | 41 | U_matrix : Construct vertices matrix. 42 | 43 | Zbin : Construct binary coefficient vector. 44 | 45 | Zboth : Construct mixed coefficient vector. 46 | 47 | Zhat : Construct continuous coefficient vector. 48 | 49 | Zhat_nonb : Construct continuous coefficient vector for typical models. 50 | 51 | vers : Construct vertices set. 52 | 53 | vers_nonb : Construct vertices set for typical models. 54 | 55 | data: All IEEE datas in the simulations. 56 | 57 | SCUC_X_Y :IEEE X-bus Y-periods test system. 58 | 59 | Wind_power : Historal wind data. 60 | 61 | expansion: 62 | ----------- 63 | 64 | The current BDR_UCC_DRO is suitable for 6-bus test system. 65 | If you want to expand it to a larger test system, you should revise the file path to corresponding system file, 66 | and define decision variables for each buses, and align all variables with they decision variables. 67 | 68 | 69 | Prerequisite: 70 | ----------- 71 | 72 | Matlab R2018a 73 | Cplex 12.7.1 74 | Mosek 9.2 75 | 76 | 77 | 78 | 79 | Publication: 80 | ----------- 81 | If you find our paper/code is useful to you, please cite it. 82 | 83 | 84 | 85 | 86 | About Us 87 | ----------- 88 | Authors:Ying Yang (yingyoung1997@gmail.com), Lingfeng Yang (ylf@gxu.edu.cn),Zhaoyang Dong 89 | Team:www.scholat.com/team/eidp 90 | Webpage: http://jians.gxu.edu.cn/default.do 91 | -------------------------------------------------------------------------------- /data/SCUC30.txt: -------------------------------------------------------------------------------- 1 | 30 41 1 100 50 0.1 6 2 | 1 1 10 0.02 0.0002 60 10 50 -50 1 1 1 30 10 3 | 2 2 10 0.015 0.00024 60 10 60 -40 2 2 2 30 15 4 | 3 5 20 0.018 0.00008 150 10 40 -40 4 4 4 70 20 5 | 4 8 10 0.01 0.00012 120 10 40 -10 2 2 2 60 0 6 | 5 11 20 0.018 0.00008 150 10 24 -6 4 4 4 55 20 7 | 6 13 10 0.015 0.0002 60 10 24 -6 2 2 2 10 30 8 | 0 9 | 1 1.15 0.95 10 | 2 1.15 0.95 11 | 3 1.15 0.95 12 | 4 1.15 0.95 13 | 5 1.15 0.95 14 | 6 1.15 0.95 15 | 7 1.15 0.95 16 | 8 1.15 0.95 17 | 9 1.15 0.95 18 | 10 1.15 0.95 19 | 11 1.15 0.95 20 | 12 1.15 0.95 21 | 13 1.15 0.95 22 | 14 1.15 0.95 23 | 15 1.15 0.95 24 | 16 1.15 0.95 25 | 17 1.15 0.95 26 | 18 1.15 0.95 27 | 19 1.15 0.95 28 | 20 1.15 0.95 29 | 21 1.15 0.95 30 | 22 1.15 0.95 31 | 23 1.15 0.95 32 | 24 1.15 0.95 33 | 25 1.15 0.95 34 | 26 1.15 0.95 35 | 27 1.15 0.95 36 | 28 1.15 0.95 37 | 29 1.15 0.95 38 | 30 1.15 0.95 39 | 0 40 | 1 1 2 1 0.0192 0.0575 0.0264 200 41 | 2 1 3 1 0.0452 0.1652 0.0204 200 42 | 3 2 4 1 0.057 0.1737 0.0184 200 43 | 4 3 4 1 0.0132 0.0379 0.0042 200 44 | 5 2 5 1 0.0472 0.1983 0.0209 200 45 | 6 2 6 1 0.0581 0.1763 0.0187 200 46 | 7 4 6 1 0.0119 0.0414 0.0045 200 47 | 8 5 7 1 0.046 0.116 0.0102 200 48 | 9 6 7 1 0.0267 0.082 0.0085 200 49 | 10 6 8 1 0.012 0.042 0.0045 200 50 | 11 9 11 1 0 0.208 0 200 51 | 12 12 13 1 0 0.14 0 200 52 | 13 12 14 1 0.1231 0.2559 0 200 53 | 14 12 15 1 0.0662 0.1304 0 200 54 | 15 12 16 1 0.0945 0.1987 0 200 55 | 16 14 15 1 0.221 0.1997 0 200 56 | 17 16 17 1 0.0524 0.1923 0 200 57 | 18 15 18 1 0.1073 0.2185 0 200 58 | 19 18 19 1 0.0639 0.1292 0 200 59 | 20 19 20 1 0.034 0.068 0 200 60 | 21 10 20 1 0.0936 0.209 0 200 61 | 22 10 17 1 0.0324 0.0845 0 200 62 | 23 10 21 1 0.0348 0.0749 0 200 63 | 24 10 22 1 0.0727 0.1499 0 200 64 | 25 21 22 1 0.0116 0.0236 0 200 65 | 26 15 23 1 0.1 0.202 0 200 66 | 27 22 24 1 0.115 0.179 0 200 67 | 28 23 24 1 0.132 0.27 0 200 68 | 29 24 25 1 0.1885 0.3292 0 200 69 | 30 25 26 1 0.2544 0.38 0 200 70 | 31 25 27 1 0.1093 0.2087 0 200 71 | 32 27 29 1 0.2198 0.4153 0 200 72 | 33 27 30 1 0.3202 0.6027 0 200 73 | 34 29 30 1 0.2399 0.4533 0 200 74 | 35 8 28 1 0.0636 0.2 0.0214 200 75 | 36 6 28 1 0.0169 0.0599 0.0065 200 76 | 37 9 10 1 0 0.11 0 200 77 | 0 78 | 38 6 9 1 0 0.208 0 500 0.978 79 | 39 6 10 1 0 0.556 0 500 0.969 80 | 40 4 12 1 0 0.256 0 500 0.932 81 | 41 28 27 1 0 0.396 0 500 0.968 82 | 0 83 | 1 315.34 37.46 0.88 0.88 1.75 3.5 8.76 84 | 2 297.26 35.31 0.83 0.83 1.65 3.3 8.26 85 | 3 285.6 33.93 0.79 0.79 1.59 3.17 7.93 86 | 4 278.52 33.09 0.77 0.77 1.55 3.09 7.74 87 | 5 279.11 33.16 0.78 0.78 1.55 3.1 7.75 88 | 6 288.86 34.32 0.8 0.8 1.6 3.21 8.02 89 | 7 312.11 37.08 0.87 0.87 1.73 3.47 8.67 90 | 8 349.78 37.98 0.95 0.95 1.9 3.81 9.52 91 | 9 370.01 39.95 1.03 1.03 2.06 4.11 10.28 92 | 10 394.48 44.25 1.09 1.09 2.17 4.34 10.86 93 | 11 411.49 48.89 1.14 1.14 2.29 4.57 11.43 94 | 12 424.94 50.49 1.18 1.18 2.36 4.72 11.8 95 | 13 435.94 51.79 1.21 1.21 2.42 4.84 12.11 96 | 14 438.48 52.08 1.22 1.22 2.44 4.87 12.18 97 | 15 447.94 53.22 1.24 1.24 2.49 4.98 12.44 98 | 16 478.06 54.7 1.28 1.28 2.56 5.12 12.79 99 | 17 511.98 54.74 1.28 1.28 2.56 5.12 12.8 100 | 18 444.14 52.76 1.23 1.23 2.47 4.93 12.34 101 | 19 442.75 52.6 1.23 1.23 2.46 4.92 12.3 102 | 20 427.24 50.75 1.19 1.19 2.37 4.75 11.87 103 | 21 427.15 50.75 1.19 1.19 2.37 4.75 11.87 104 | 22 408.85 49.75 1.14 1.14 2.27 4.54 11.36 105 | 23 349.54 38.92 1.01 1.01 2.01 4.02 10.05 106 | 24 336.51 38.1 0.98 0.98 1.97 3.94 9.84 107 | 0 108 | 2 21.7 12.7 109 | 3 2.4 1.2 110 | 4 7.6 1.6 111 | 5 94.2 19. 112 | 7 22.8 10.9 113 | 8 30. 30. 114 | 10 5.8 2. 115 | 12 11.2 7.5 116 | 14 6.2 1.6 117 | 15 8.2 2.5 118 | 16 3.5 1.8 119 | 17 9. 5.8 120 | 18 3.2 .9 121 | 19 9.5 3.4 122 | 20 2.2 .7 123 | 21 17.5 11.2 124 | 23 3.2 1.6 125 | 24 8.7 6.7 126 | 26 3.5 2.3 127 | 29 2.4 .9 128 | 30 10.6 1.9 -------------------------------------------------------------------------------- /data/SCUC118.txt: -------------------------------------------------------------------------------- 1 | 118 186 69 100 50 0.1 54 2 | 1 4 31.67 26.2438 0.069663 30 5 300 -300 1 1 1 15 40 3 | 2 6 31.67 26.2438 0.069663 30 5 50 -13 1 1 1 15 40 4 | 3 8 31.67 26.2438 0.069663 30 5 300 -300 1 1 1 15 40 5 | 4 10 6.78 12.8875 0.010875 300 150 200 -147 8 8 8 150 440 6 | 5 12 6.78 12.8875 0.010875 300 100 120 -35 8 8 8 150 110 7 | 6 15 31.67 26.2438 0.069663 30 10 30 -10 1 1 1 15 40 8 | 7 18 10.15 17.8200 0.012800 100 25 50 -16 5 5 5 50 50 9 | 8 19 31.67 26.2438 0.069663 30 5 24 -8 1 1 1 15 40 10 | 9 24 31.67 26.2438 0.069663 30 5 300 -300 1 1 1 15 40 11 | 10 25 6.78 12.8875 0.010875 300 100 140 -47 8 8 8 150 100 12 | 11 26 32.96 10.7600 0.003000 350 100 1000 -1000 8 8 8 175 100 13 | 12 27 31.67 26.2438 0.069663 30 8 300 -300 1 1 1 15 40 14 | 13 31 31.67 26.2438 0.069663 30 8 300 -300 1 1 1 15 40 15 | 14 32 10.15 17.8200 0.012800 100 25 42 -14 5 5 5 50 50 16 | 15 34 31.67 26.2438 0.069663 30 8 24 -8 1 1 1 15 40 17 | 16 36 10.15 17.8200 0.012800 100 25 24 -8 5 5 5 50 50 18 | 17 40 31.67 26.2438 0.069663 30 8 300 -300 1 1 1 15 40 19 | 18 42 31.67 26.2438 0.069663 30 8 300 -300 1 1 1 15 40 20 | 19 46 10.15 17.8200 0.012800 100 25 100 -100 5 5 5 50 59 21 | 20 49 28 12.3299 0.002401 250 50 210 -85 8 8 8 125 100 22 | 21 54 28 12.3299 0.002401 250 50 300 -300 8 8 8 125 100 23 | 22 55 10.15 17.8200 0.012800 100 25 23 -8 5 5 5 50 50 24 | 23 56 10.15 17.8200 0.012800 100 25 15 -8 5 5 5 50 50 25 | 24 59 39 13.2900 0.004400 200 50 180 -60 10 8 8 100 100 26 | 25 61 39 13.2900 0.004400 200 50 300 -100 10 8 8 100 100 27 | 26 62 10.15 17.8200 0.012800 100 25 20 -20 5 5 5 50 50 28 | 27 65 64.16 8.3391 0.010590 420 100 200 -67 10 10 10 210 250 29 | 28 66 64.16 8.3391 0.010590 420 100 200 -67 10 10 10 210 250 30 | 29 69 6.78 12.8875 0.010875 300 80 99999 -99999 10 8 8 150 100 31 | 30 70 74.33 15.4708 0.045923 80 30 32 -10 4 4 4 40 45 32 | 31 72 31.67 26.2438 0.069663 30 10 100 -100 1 1 1 15 40 33 | 32 73 31.67 26.2438 0.069663 30 5 100 -100 1 1 1 15 40 34 | 33 74 17.95 37.6968 0.028302 20 5 9 -6 1 1 1 10 30 35 | 34 76 10.15 17.8200 0.012800 100 25 23 -8 5 5 5 50 50 36 | 35 77 10.15 17.8200 0.012800 100 25 70 -20 5 5 5 50 50 37 | 36 80 6.78 12.8875 0.010875 300 150 280 -165 10 8 8 150 440 38 | 37 82 10.15 17.8200 0.012800 100 25 9900 -9900 5 5 5 50 50 39 | 38 85 31.67 26.2438 0.069663 30 10 23 -8 1 1 1 15 40 40 | 39 87 32.96 10.7600 0.003000 300 100 1000 -100 10 8 8 150 440 41 | 40 89 6.78 12.8875 0.010875 200 50 300 -210 10 8 8 100 400 42 | 41 90 17.95 37.6968 0.028302 20 8 300 -300 1 1 1 10 30 43 | 42 91 58.81 22.9423 0.009774 50 20 100 -100 1 1 1 25 45 44 | 43 92 6.78 12.8875 0.010875 300 100 9 -3 8 8 8 150 100 45 | 44 99 6.78 12.8875 0.010875 300 100 100 -100 8 8 8 150 100 46 | 45 100 6.78 12.8875 0.010875 300 100 155 -50 8 8 8 150 110 47 | 46 103 17.95 37.6968 0.028302 20 8 40 -15 1 1 1 10 30 48 | 47 104 10.15 17.8200 0.012800 100 25 23 -8 5 5 5 50 50 49 | 48 105 10.15 17.8200 0.012800 100 25 23 -8 5 5 5 50 50 50 | 49 107 17.95 37.6968 0.028302 20 8 200 -200 1 1 1 10 30 51 | 50 110 58.81 22.9423 0.009774 50 25 23 -8 2 2 2 25 45 52 | 51 111 10.15 17.8200 0.012800 100 25 1000 -100 5 5 5 50 50 53 | 52 112 10.15 17.8200 0.012800 100 25 1000 -100 5 5 5 50 50 54 | 53 113 10.15 17.8200 0.012800 100 25 200 -100 5 5 5 50 50 55 | 54 116 58.81 22.9423 0.009774 50 25 1000 -1000 2 2 2 25 45 56 | 0 57 | 1 1.05 0.94 58 | 2 1.06 0.95 59 | 3 1.06 0.95 60 | 4 1.09 0.99 61 | 5 1.09 0.99 62 | 6 1.09 0.97 63 | 7 1.09 0.97 64 | 8 1.09 0.98 65 | 9 1.09 0.98 66 | 10 1.09 0.98 67 | 11 1.08 0.97 68 | 12 1.09 0.98 69 | 13 1.05 0.95 70 | 14 1.07 0.98 71 | 15 1.05 0.98 72 | 16 1.07 0.98 73 | 17 1.09 0.98 74 | 18 1.07 0.98 75 | 19 1.06 0.98 76 | 20 1.04 0.96 77 | 21 1.03 0.95 78 | 22 1.04 0.97 79 | 23 1.09 0.98 80 | 24 1.09 0.98 81 | 25 1.09 0.98 82 | 26 1.09 0.98 83 | 27 1.09 0.96 84 | 28 1.08 0.94 85 | 29 1.08 0.93 86 | 30 1.06 0.98 87 | 31 1.09 0.94 88 | 32 1.08 0.97 89 | 33 1.04 0.96 90 | 34 1.08 0.97 91 | 35 1.08 0.96 92 | 36 1.08 0.96 93 | 37 1.09 0.98 94 | 38 1.04 0.95 95 | 39 1.09 0.93 96 | 40 1.09 0.93 97 | 41 1.09 0.93 98 | 42 1.09 0.92 99 | 43 1.06 0.96 100 | 44 1.06 0.97 101 | 45 1.06 0.98 102 | 46 1.09 0.98 103 | 47 1.09 0.98 104 | 48 1.09 0.98 105 | 49 1.09 0.98 106 | 50 1.09 0.99 107 | 51 1.07 0.97 108 | 52 1.06 0.97 109 | 53 1.06 0.96 110 | 54 1.09 0.97 111 | 55 1.09 0.97 112 | 56 1.09 0.97 113 | 57 1.08 0.98 114 | 58 1.07 0.97 115 | 59 1.09 0.98 116 | 60 1.09 0.99 117 | 61 1.09 0.99 118 | 62 1.09 0.98 119 | 63 1.06 0.96 120 | 64 1.07 0.98 121 | 65 1.07 0.98 122 | 66 1.09 0.98 123 | 67 1.09 0.98 124 | 68 1.08 0.98 125 | 69 1.09 0.98 126 | 70 1.06 0.98 127 | 71 1.06 0.99 128 | 72 1.09 0.99 129 | 73 1.06 0.99 130 | 74 1.03 0.93 131 | 75 1.04 0.94 132 | 76 1.02 0.93 133 | 77 1.08 0.98 134 | 78 1.07 0.99 135 | 79 1.07 0.99 136 | 80 1.09 0.99 137 | 81 1.07 0.98 138 | 82 1.09 0.98 139 | 83 1.07 0.99 140 | 84 1.03 0.96 141 | 85 1.02 0.96 142 | 86 0.96 0.93 143 | 87 1.09 0.98 144 | 88 1.06 0.98 145 | 89 1.09 0.98 146 | 90 1.09 0.98 147 | 91 1.09 0.98 148 | 92 1.09 0.98 149 | 93 1.08 0.98 150 | 94 1.07 0.98 151 | 95 1.05 0.98 152 | 96 1.07 0.98 153 | 97 1.08 0.98 154 | 98 1.08 0.98 155 | 99 1.09 0.98 156 | 100 1.09 0.98 157 | 101 1.08 0.98 158 | 102 1.09 0.98 159 | 103 1.09 0.98 160 | 104 1.08 0.99 161 | 105 1.08 0.98 162 | 106 1.07 0.96 163 | 107 1.06 0.94 164 | 108 1.08 0.98 165 | 109 1.08 0.98 166 | 110 1.09 0.97 167 | 111 1.09 0.97 168 | 112 1.09 0.97 169 | 113 1.09 0.98 170 | 114 1.08 0.96 171 | 115 1.08 0.96 172 | 116 1.09 0.98 173 | 117 1.06 0.95 174 | 118 1.03 0.93 175 | 0 176 | 1 1 2 1 0.0303 0.0999 0.0254 175 177 | 2 1 3 1 0.0129 0.0424 0.01082 175 178 | 3 4 5 1 0.00176 0.00798 0.0021 500 179 | 4 3 5 1 0.0241 0.108 0.0284 175 180 | 5 5 6 1 0.0119 0.054 0.01426 175 181 | 6 6 7 1 0.00459 0.0208 0.0055 175 182 | 7 8 9 1 0.00244 0.0305 1.162 500 183 | 9 9 10 1 0.00258 0.0322 1.23 500 184 | 10 4 11 1 0.0209 0.0688 0.01748 175 185 | 11 5 11 1 0.0203 0.0682 0.01738 175 186 | 12 11 12 1 0.00595 0.0196 0.00502 175 187 | 13 2 12 1 0.0187 0.0616 0.01572 175 188 | 14 3 12 1 0.0484 0.16 0.0406 175 189 | 15 7 12 1 0.00862 0.034 0.00874 175 190 | 16 11 13 1 0.02225 0.0731 0.01876 175 191 | 17 12 14 1 0.0215 0.0707 0.01816 175 192 | 18 13 15 1 0.0744 0.2444 0.06268 175 193 | 19 14 15 1 0.0595 0.195 0.0502 175 194 | 20 12 16 1 0.0212 0.0834 0.0214 175 195 | 21 15 17 1 0.0132 0.0437 0.0444 500 196 | 22 16 17 1 0.0454 0.1801 0.0466 175 197 | 23 17 18 1 0.0123 0.0505 0.01298 175 198 | 24 18 19 1 0.01119 0.0493 0.01142 175 199 | 25 19 20 1 0.0252 0.117 0.0298 175 200 | 26 15 19 1 0.012 0.0394 0.0101 175 201 | 27 20 21 1 0.0183 0.0849 0.0216 175 202 | 28 21 22 1 0.0209 0.097 0.0246 175 203 | 29 22 23 1 0.0342 0.159 0.0404 175 204 | 30 23 24 1 0.0135 0.0492 0.0498 175 205 | 31 23 25 1 0.0156 0.08 0.0864 500 206 | 33 25 27 1 0.0318 0.163 0.1764 500 207 | 34 27 28 1 0.01913 0.0855 0.0216 175 208 | 35 28 29 1 0.0237 0.0943 0.0238 175 209 | 37 8 30 1 0.00431 0.0504 0.514 175 210 | 38 26 30 1 0.00799 0.086 0.908 500 211 | 39 17 31 1 0.0474 0.1563 0.0399 175 212 | 40 29 31 1 0.0108 0.0331 0.0083 175 213 | 41 23 32 1 0.0317 0.1153 0.1173 140 214 | 42 31 32 1 0.0298 0.0985 0.0251 175 215 | 43 27 32 1 0.0229 0.0755 0.01926 175 216 | 44 15 33 1 0.038 0.1244 0.03194 175 217 | 45 19 34 1 0.0752 0.247 0.0632 175 218 | 46 35 36 1 0.00224 0.0102 0.00268 175 219 | 47 35 37 1 0.011 0.0497 0.01318 175 220 | 48 33 37 1 0.0415 0.142 0.0366 175 221 | 49 34 36 1 0.00871 0.0268 0.00568 175 222 | 50 34 37 1 0.00256 0.0094 0.00984 500 223 | 52 37 39 1 0.0321 0.106 0.027 175 224 | 53 37 40 1 0.0593 0.168 0.042 175 225 | 54 30 38 1 0.00464 0.054 0.422 175 226 | 55 39 40 1 0.0184 0.0605 0.01552 175 227 | 56 40 41 1 0.0145 0.0487 0.01222 175 228 | 57 40 42 1 0.0555 0.183 0.0466 175 229 | 58 41 42 1 0.041 0.135 0.0344 175 230 | 59 43 44 1 0.0608 0.2454 0.06068 175 231 | 60 34 43 1 0.0413 0.1681 0.04226 175 232 | 61 44 45 1 0.0224 0.0901 0.0224 175 233 | 62 45 46 1 0.04 0.1356 0.0332 175 234 | 63 46 47 1 0.038 0.127 0.0316 175 235 | 64 46 48 1 0.0601 0.189 0.0472 175 236 | 65 47 49 1 0.0191 0.0625 0.01604 175 237 | 66 42 49 1 0.0715 0.323 0.086 175 238 | 67 42 49 2 0.0715 0.323 0.086 175 239 | 68 45 49 1 0.0684 0.186 0.0444 175 240 | 69 48 49 1 0.0179 0.0505 0.01258 175 241 | 70 49 50 1 0.0267 0.0752 0.01874 175 242 | 71 49 51 1 0.0486 0.137 0.0342 175 243 | 72 51 52 1 0.0203 0.0588 0.01396 175 244 | 73 52 53 1 0.0405 0.1635 0.04058 175 245 | 74 53 54 1 0.0263 0.122 0.031 175 246 | 75 49 54 1 0.073 0.289 0.0738 175 247 | 76 49 54 2 0.0869 0.291 0.073 175 248 | 77 54 55 1 0.0169 0.0707 0.0202 175 249 | 78 54 56 1 0.00275 0.00955 0.00732 175 250 | 79 55 56 1 0.00488 0.0151 0.00374 175 251 | 80 56 57 1 0.0343 0.0966 0.0242 175 252 | 81 50 57 1 0.0474 0.134 0.0332 175 253 | 82 56 58 1 0.0343 0.0966 0.0242 175 254 | 83 51 58 1 0.0255 0.0719 0.01788 175 255 | 84 54 59 1 0.0503 0.2293 0.0598 175 256 | 85 56 59 1 0.0825 0.251 0.0569 175 257 | 86 56 59 2 0.0803 0.239 0.0536 175 258 | 87 55 59 1 0.04739 0.2158 0.05646 175 259 | 88 59 60 1 0.0317 0.145 0.0376 175 260 | 89 59 61 1 0.0328 0.15 0.0388 175 261 | 90 60 61 1 0.00264 0.0135 0.01456 500 262 | 91 60 62 1 0.0123 0.0561 0.01468 175 263 | 92 61 62 1 0.00824 0.0376 0.0098 175 264 | 94 63 64 1 0.00172 0.02 0.216 500 265 | 96 38 65 1 0.00901 0.0986 1.046 500 266 | 97 64 65 1 0.00269 0.0302 0.38 500 267 | 98 49 66 1 0.018 0.0919 0.0248 500 268 | 99 49 66 2 0.018 0.0919 0.0248 500 269 | 100 62 66 1 0.0482 0.218 0.0578 175 270 | 101 62 67 1 0.0258 0.117 0.031 175 271 | 103 66 67 1 0.0224 0.1015 0.02682 175 272 | 104 65 68 1 0.00138 0.016 0.638 500 273 | 105 47 69 1 0.0844 0.2778 0.07092 175 274 | 106 49 69 1 0.0985 0.324 0.0828 175 275 | 108 69 70 1 0.03 0.127 0.122 500 276 | 109 24 70 1 0.00221 0.4115 0.10198 175 277 | 110 70 71 1 0.00882 0.0355 0.00878 175 278 | 111 24 72 1 0.0488 0.196 0.0488 175 279 | 112 71 72 1 0.0446 0.18 0.04444 175 280 | 113 71 73 1 0.00866 0.0454 0.01178 175 281 | 114 70 74 1 0.0401 0.1323 0.03368 175 282 | 115 70 75 1 0.0428 0.141 0.036 175 283 | 116 69 75 1 0.0405 0.122 0.124 500 284 | 117 74 75 1 0.0123 0.0406 0.01034 175 285 | 118 76 77 1 0.0444 0.148 0.0368 175 286 | 119 69 77 1 0.0309 0.101 0.1038 175 287 | 120 75 77 1 0.0601 0.1999 0.04978 175 288 | 121 77 78 1 0.00376 0.0124 0.01264 175 289 | 122 78 79 1 0.00546 0.0244 0.00648 175 290 | 123 77 80 1 0.017 0.0485 0.0472 500 291 | 124 77 80 2 0.0294 0.105 0.0228 500 292 | 125 79 80 1 0.0156 0.0704 0.0187 175 293 | 126 68 81 1 0.00175 0.0202 0.808 500 294 | 128 77 82 1 0.0298 0.0853 0.08174 200 295 | 129 82 83 1 0.0112 0.03665 0.03796 200 296 | 130 83 84 1 0.0625 0.132 0.0258 175 297 | 131 83 85 1 0.043 0.148 0.0348 175 298 | 132 84 85 1 0.0302 0.0641 0.01234 175 299 | 133 85 86 1 0.035 0.123 0.0276 500 300 | 134 86 87 1 0.02828 0.2074 0.0445 500 301 | 135 85 88 1 0.02 0.102 0.0276 175 302 | 136 85 89 1 0.0239 0.173 0.047 175 303 | 137 88 89 1 0.0139 0.0712 0.01934 500 304 | 138 89 90 1 0.0518 0.188 0.0528 500 305 | 139 89 90 2 0.0238 0.0997 0.106 500 306 | 140 90 91 1 0.0254 0.0836 0.0214 175 307 | 141 89 92 1 0.0099 0.0505 0.0548 500 308 | 142 89 92 2 0.0393 0.1581 0.0414 500 309 | 143 91 92 1 0.0387 0.1272 0.03268 175 310 | 144 92 93 1 0.0258 0.0848 0.0218 175 311 | 145 92 94 1 0.0481 0.158 0.0406 175 312 | 146 93 94 1 0.0223 0.0732 0.01876 175 313 | 147 94 95 1 0.0132 0.0434 0.0111 175 314 | 148 80 96 1 0.0356 0.182 0.0494 175 315 | 149 82 96 1 0.0162 0.053 0.0544 175 316 | 150 94 96 1 0.0269 0.0869 0.023 175 317 | 151 80 97 1 0.0183 0.0934 0.0254 175 318 | 152 80 98 1 0.0238 0.108 0.0286 175 319 | 153 80 99 1 0.0454 0.206 0.0546 200 320 | 154 92 100 1 0.0648 0.295 0.0472 175 321 | 155 94 100 1 0.0178 0.058 0.0604 175 322 | 156 95 96 1 0.0171 0.0547 0.01474 175 323 | 157 96 97 1 0.0173 0.0885 0.024 175 324 | 158 98 100 1 0.0397 0.179 0.0476 175 325 | 159 99 100 1 0.018 0.0813 0.0216 175 326 | 160 100 101 1 0.0277 0.1262 0.0328 175 327 | 161 92 102 1 0.0123 0.0559 0.01464 175 328 | 162 101 102 1 0.0246 0.112 0.0294 175 329 | 163 100 103 1 0.016 0.0525 0.0536 500 330 | 164 100 104 1 0.0451 0.204 0.0541 175 331 | 165 103 104 1 0.0466 0.1584 0.0407 175 332 | 166 103 105 1 0.0535 0.1625 0.0408 175 333 | 167 100 106 1 0.0605 0.229 0.062 175 334 | 168 104 105 1 0.00994 0.0378 0.00986 175 335 | 169 105 106 1 0.014 0.0547 0.01434 175 336 | 170 105 107 1 0.053 0.183 0.0472 175 337 | 171 105 108 1 0.0261 0.0703 0.01844 175 338 | 172 106 107 1 0.053 0.183 0.0472 175 339 | 173 108 109 1 0.0105 0.0288 0.0076 175 340 | 174 103 110 1 0.03906 0.1813 0.0461 175 341 | 175 109 110 1 0.0278 0.0762 0.0202 175 342 | 176 110 111 1 0.022 0.0755 0.02 175 343 | 177 110 112 1 0.0247 0.064 0.062 175 344 | 178 17 113 1 0.00913 0.0301 0.00768 175 345 | 179 32 113 1 0.0615 0.203 0.0518 500 346 | 180 32 114 1 0.0135 0.0612 0.01628 175 347 | 181 27 115 1 0.0164 0.0741 0.01972 175 348 | 182 114 115 1 0.0023 0.0104 0.00276 175 349 | 183 68 116 1 0.00034 0.00405 0.164 500 350 | 184 12 117 1 0.0329 0.14 0.0358 175 351 | 185 75 118 1 0.0145 0.0481 0.01198 175 352 | 186 76 118 1 0.0164 0.0544 0.01356 175 353 | 0 354 | 1 8 5 1 0 0.0267 0 500 0.985 355 | 2 26 25 1 0 0.0382 0 500 0.96 356 | 3 30 17 1 0 0.0388 0 500 0.96 357 | 4 38 37 1 0 0.0375 0 500 0.935 358 | 5 63 59 1 0 0.0386 0 500 0.96 359 | 6 64 61 1 0 0.0268 0 500 0.985 360 | 7 65 66 1 0 0.037 0 500 0.935 361 | 8 68 69 1 0 0.037 0 500 0.935 362 | 9 81 80 1 0 0.037 0 500 0.935 363 | 0 364 | 1 4200 1623.47 42 42 84 84 210 365 | 2 3960 1530.70 39.6 39.6 79.2 79.2 198 366 | 3 3480 1345.16 34.8 34.8 69.6 69.6 174 367 | 4 2400 927.70 24 24 48 48 120 368 | 5 3000 1159.62 30 30 60 60 150 369 | 6 3600 1391.54 36 36 72 72 180 370 | 7 4200 1623.47 42 42 84 84 210 371 | 8 4680 1809.01 46.8 46.8 93.6 93.6 234 372 | 9 4920 1901.78 49.2 49.2 98.4 98.4 246 373 | 10 5280 2040.93 52.8 52.8 105.6 105.6 264 374 | 11 5340 2064.12 53.4 53.4 106.8 106.8 267 375 | 12 5040 1948.16 50.4 50.4 100.8 100.8 252 376 | 13 4800 1855.39 48 48 96 96 240 377 | 14 4560 1762.62 45.6 45.6 91.2 91.2 228 378 | 15 5280 2040.93 52.8 52.8 105.6 105.6 264 379 | 16 5400 2087.31 54 54 108 108 270 380 | 17 5100 1971.35 51 51 102 102 255 381 | 18 5340 2064.12 53.4 53.4 106.8 106.8 267 382 | 19 5640 2180.08 56.4 56.4 112.8 112.8 282 383 | 20 5880 2272.85 58.8 58.8 117.6 117.6 294 384 | 21 6000 2319.24 60 60 120 120 300 385 | 22 5400 2087.31 54 54 108 108 270 386 | 23 5220 2017.74 52.2 52.2 104.4 104.4 261 387 | 24 4920 1901.78 49.2 49.2 98.4 98.4 246 388 | 0 389 | 1 54.14 8.66 390 | 2 21.23 9.55 391 | 3 41.4 10.62 392 | 4 31.85 12.74 393 | 6 55.2 23.35 394 | 7 20.17 2.12 395 | 11 74.31 24.42 396 | 12 49.89 10.62 397 | 13 36.09 16.99 398 | 14 14.86 1.06 399 | 15 95.54 31.85 400 | 16 26.54 10.62 401 | 17 11.68 3.18 402 | 18 63.69 36.09 403 | 19 47.77 26.54 404 | 20 19.11 3.18 405 | 21 14.86 8.49 406 | 22 10.62 5.31 407 | 23 7.43 3.18 408 | 27 65.82 13.8 409 | 28 18.05 7.43 410 | 29 25.48 4.25 411 | 31 45.65 28.66 412 | 32 62.63 24.42 413 | 33 24.42 9.55 414 | 34 62.63 27.6 415 | 35 35.03 9.55 416 | 36 32.91 18.05 417 | 39 27 11 418 | 40 20 23 419 | 41 37 10 420 | 42 37 23 421 | 43 18 7 422 | 44 16 8 423 | 45 53 22 424 | 46 28 10 425 | 47 34 0 426 | 48 20 11 427 | 49 87 30 428 | 50 17 4 429 | 51 17 8 430 | 52 18 5 431 | 53 23 11 432 | 54 113 32 433 | 55 63 22 434 | 56 84 18 435 | 57 12 3 436 | 58 12 3 437 | 59 277 113 438 | 60 78 3 439 | 62 77 14 440 | 66 39 18 441 | 67 28 7 442 | 70 66 20 443 | 74 68 27 444 | 75 47 11 445 | 76 68 36 446 | 77 61 28 447 | 78 71 26 448 | 79 39 32 449 | 80 130 26 450 | 82 54 27 451 | 83 20 10 452 | 84 11 7 453 | 85 24 15 454 | 86 21 10 455 | 88 48 10 456 | 90 78 42 457 | 92 65 10 458 | 93 12 7 459 | 94 30 16 460 | 95 42 31 461 | 96 38 15 462 | 97 15 9 463 | 98 34 8 464 | 100 37 18 465 | 101 22 15 466 | 102 5 3 467 | 103 23 16 468 | 104 38 25 469 | 105 31 26 470 | 106 43 16 471 | 107 28 12 472 | 108 2 1 473 | 109 8 3 474 | 110 39 30 475 | 112 25 13 476 | 114 8.49 3.18 477 | 115 23.35 7.43 478 | 117 21.23 8.49 479 | 118 33 15 -------------------------------------------------------------------------------- /BDR_UCC_DRO.m: -------------------------------------------------------------------------------- 1 | %% BDR_UCC_DRO_Last by yy 2022.04.10 2 | 3 | FileName_SCUC = 'data/SCUC6.txt'; 4 | FileName_Wind = 'data\Wind_power.xlsx'; 5 | 6 | SCUC_data = ReadDataSCUC(FileName_SCUC); 7 | Wind_data = ReadWindData(SCUC_data,FileName_Wind); 8 | 9 | % T = SCUC_data.totalLoad.T; % period T 10 | T = 12; 11 | G = SCUC_data.units.N; % number of thermal units 12 | N = SCUC_data.baseparameters.busN; % number of buses 13 | W = SCUC_data.Wind.wind_Number; % number of wind units 14 | M = size(Wind_data{1,1},2); % number of samples 15 | Gbus = SCUC_data.units.bus_G; % thermal units 16 | Wbus = SCUC_data.Wind.wind_Node; % wind units 17 | Dbus = SCUC_data.busLoad.bus_PDQR; % load buses 18 | Pramp = SCUC_data.units.ramp; %ramp constraints 19 | Pstart = 0.5 * SCUC_data.units.PG_up; %startup ramp constraints 20 | Pshut = SCUC_data.units.PG_up; %shutdown ramp constraints 21 | Pup = SCUC_data.units.PG_up; %upper bound of generation 22 | Plow = SCUC_data.units.PG_low; %lower bound 23 | Ton = SCUC_data.units.T_on; %min on time 24 | Toff = SCUC_data.units.T_off; %min off time 25 | L = 4; %parameter for linearize 26 | fa = SCUC_data.units.alpha; %constant coefficient for generation cost 27 | fb = SCUC_data.units.beta; %linear term coefficient for generation cost 28 | fc = SCUC_data.units.gamma; % quadratic term for generation cost 29 | Ccold = SCUC_data.units.start_cost*2; % cost of cold start 30 | Chot = SCUC_data.units.start_cost; % cost of hot start 31 | Tcold = min(max(Toff,1),T); %time of cold start 32 | Lup = 0.3*ones(N,1); % upper bound of load loss 33 | Llow = 0*ones(N,1); %lower bound of load loss 34 | 35 | % construct coefficient matrix of DC network B 36 | type_of_pf = 'DC'; 37 | Y = SCUC_nodeY(SCUC_data,type_of_pf); 38 | B = -Y.B; 39 | 40 | u0 = zeros(G,1); %initial state of units,assume all shutdown at beggin 41 | T0 = zeros(G,1); %min periods that unit should keep in initial state 42 | P0 = zeros(G,1); %intial generation 43 | U0 = zeros(G,1); 44 | L0 = zeros(G,1); 45 | tao0 = Toff+Tcold+1; 46 | 47 | for index = 1:G 48 | mid_u = min(T,u0(index) * (Ton(index) - T0(index))); 49 | mid_l = min(T,(1-u0(index)) * (Toff(index) + T0(index))); 50 | U0(index) = max(0,mid_u); 51 | L0(index) = max(0,mid_l); 52 | end 53 | 54 | all_branch.I = [ SCUC_data.branch.I; SCUC_data.branchTransformer.I ]; % all branch begin bus 55 | all_branch.J = [ SCUC_data.branch.J; SCUC_data.branchTransformer.J ]; % all branch end bus 56 | all_branch.P = [ SCUC_data.branch.P; SCUC_data.branchTransformer.P ]; % transmission limitation of each branch 57 | 58 | % calculate uncertainty set 59 | PW = []; % put wind generation variables in a matrix 60 | for i = 1:W 61 | PW = [PW; Wind_data{1,i}]; 62 | end 63 | PW = [PW(1:T,:);PW(24+1:24+T,:)]; 64 | % for i = 1:W 65 | % PW = [PW; 0.05*ones(24,30)]; 66 | % end 67 | % average value of wind generation 68 | PW_miu = zeros(W*T,1); 69 | for i = 1:M 70 | PW_miu = PW_miu + PW(:,i); 71 | end 72 | PW_miu = PW_miu / M; 73 | % error of wind generation 74 | VW = zeros(W*T,M); 75 | for j = 1:M 76 | VW(:,j) = PW(:,j) - PW_miu; 77 | end 78 | VW_positive = max(VW,[],2); 79 | VW_negative = min(VW,[],2); 80 | % ksi support set 81 | ksi_positive = [1;VW_positive]; 82 | ksi_negative = [1;VW_negative]; 83 | % end of calculate uncertainty set 84 | 85 | % non-linear decision rule 86 | bN = 3; % number of segments 87 | bpN = bN-1; % inflection points 88 | bp = zeros(bN - 1,1); % equally spaced vector 89 | kl = 1+bpN+bN; % dimension of one ksi 90 | verts = []; % set of vertices 91 | for t = 1:T 92 | for i = 1:W 93 | step = (VW_positive((t-1)*W+i) - VW_negative((t-1)*W+i)) / bN; %calculate the length of each segment 94 | bp = linspace(VW_negative((t-1)*W+i)+ step,VW_positive((t-1)*W+i)-step,bN-1)'; 95 | verts = [verts, vers(bN,bp,VW_positive((t-1)*W+i),VW_negative((t-1)*W+i))]; 96 | end 97 | end 98 | verts_nonksi = verts(2:6,:); 99 | vN = length(verts)/(W*T); %number of verts 100 | % verts = [ones(2*bN,(bN+1)*W), verts]; 101 | % end of non-linear decision rule 102 | 103 | % use decision rules handle all ksi vector 104 | for m = 1:M 105 | ksi = VW(:,m); 106 | ksi_hat = []; 107 | ksi_tine = []; 108 | ksi_hat2 = []; 109 | ksi_tine2 = []; 110 | ksi_wan_now = []; 111 | for t = 1:T 112 | for i = 1:W 113 | step = (VW_positive((t-1)*W+i) - VW_negative((t-1)*W+i)) / bN; 114 | bp = linspace(VW_negative((t-1)*W+i)+ step,VW_positive((t-1)*W+i)-step,bN-1)'; 115 | bp = [VW_negative((t-1)*W+i);bp;VW_positive((t-1)*W+i)]; 116 | ksi_hat = L_hat(ksi((t-1)*W+i),bN,bp); 117 | ksi_tine = L_tine(ksi((t-1)*W+i),bN,bp); 118 | ksi_hat2 = [ksi_hat2; L_hat(ksi((i-1)*T+t),bN,bp)]; 119 | ksi_tine2 = [ksi_tine2; L_tine(ksi((i-1)*T+t),bN,bp)]; 120 | ksi_wan_now = [ksi_wan_now;ksi((t-1)*W+i);ksi_hat;ksi_tine]; 121 | end 122 | end 123 | % ksi_wan{m} = [ones(T,1); ones(T,1); ksi_hat; ksi_tine]; %arrange as this order :ksi_hat0;ksi_tine0;ksi_hat;ksi_tine 124 | ksi_wan{m} = [ ones(T,1);ones(T,1);ones(T,1);ksi_wan_now]; %arrange as this order: ksi0;ksi_hat0;ksi_tine0;ksi;ksi_hat;ksi_tine 125 | ksi_wan2{m} = [ ksi_hat2; ksi_tine2]; %arrange as: ksi_hat;ksi_tine 126 | end 127 | % end of use decision rules handle all ksi vector 128 | 129 | % % construct wasserstein ambiguity set 130 | % eta = 0.95; % confident level 131 | % rho = sdpvar(1); %radius of ambiguity set 132 | % sum_C = 0; 133 | % for i = 1:M 134 | % mid = PW(:,i) - PW_miu; 135 | % mid = rho * norm(mid,1)^2; 136 | % mid = exp(mid); 137 | % sum_C = sum_C + mid; 138 | % end 139 | % sum_C = sum_C / M; 140 | % obj_C = 1 + log(sum_C); 141 | % Constraints_C = rho >= 0; 142 | % Objective_C = 2 * ( ((1 / (2 * rho)) * obj_C) ^(1/2) ); 143 | % options_C = sdpsettings('verbose',0,'debug',1,'savesolveroutput',1);%, 'fmincon.TolX',1e-4 144 | % sol_C = optimize(Constraints_C,Objective_C,options_C); 145 | % C = sol_C.solveroutput.fmin; 146 | % mid_eps = log( 1 / (1-eta)); 147 | % mid_eps = mid_eps / M; 148 | % eps = C * sqrt(mid_eps); 149 | % % end of construct wasserstein ambiguity set 150 | eps = 4.5; 151 | % construct closed convex hull 152 | % verts already finished in last section 153 | 154 | % end of construct closed convex hull 155 | 156 | %calculate ksi length 157 | leng_k = 0; 158 | for k = 1:T 159 | leng_k = leng_k+k; 160 | end 161 | %end of calculate ksi length 162 | 163 | % construct continuous constraints 164 | % define continuous variables 165 | YG = sdpvar(G,T+W*bN*leng_k); %generation decision variable for thermal units 166 | % YG = 1:64; 167 | % YG = [YG;YG;YG;YG;YG;YG]; 168 | Ytheta = sdpvar(N,T+W*bN*leng_k); %nodal phase angle decision variables 169 | Yz = sdpvar(G,T+W*bN*leng_k); % cost variable for thermal units 170 | YS = sdpvar(G,T+W*bN*leng_k); % startup cost variable for thermal units 171 | YPw = sdpvar(W,T+W*bN*leng_k); % wind generation decision variable 172 | Yl = sdpvar(N,T+W*bN*leng_k); %load loss decision variable 173 | % integer variable 174 | % not binary variable 175 | Xu = intvar(G,T+W*bpN*leng_k); %unit state varibale 176 | Xs = intvar(G,T+W*bpN*leng_k); %the action of turn on 177 | Xd = intvar(G,T+W*bpN*leng_k); %the action of turn off 178 | 179 | % construct constraints 180 | cons = []; 181 | cons = [cons, -1 <= Xu <= 1]; % integer variable's range 182 | cons = [cons, -1 <= Xs <= 1]; 183 | cons = [cons, -1 <= Xd <= 1]; 184 | 185 | % reference bus 186 | Ytheta(1,:) = zeros(1,T+W*bN*leng_k); 187 | % end of reference bus 188 | 189 | % keep in initial state 190 | for g = 1:G 191 | for t = 1:(U0(g)+L0(g)) 192 | Xu(g,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN) = zeros(1,t*W*bpN); 193 | Xu(g,t) = 0; 194 | end 195 | end 196 | % end of keep in initial state 197 | 198 | % construct inequality constraints 199 | Uc_l = []; %matrix of verts 200 | Uc_c = []; %lamda coefficient matrix 201 | Uc = []; 202 | Uconstant_0 = []; 203 | Uconstant_0 = blkdiag(1, Uconstant_0); 204 | Uconstant_0 = blkdiag(1, Uconstant_0); 205 | Uconstant_0 = blkdiag(1, Uconstant_0); 206 | Ulamda_0 = []; 207 | Ulamda_0 = blkdiag(-1, Ulamda_0); 208 | Ulamda_0 = blkdiag(-1, Ulamda_0); 209 | Ulamda_0 = blkdiag(-1, Ulamda_0); 210 | for t = 1:T 211 | Uconstant = []; 212 | for w = 1:W 213 | Uconstant = blkdiag(Uconstant,ones(1,vN)); 214 | end 215 | Ulamda = blkdiag(-verts(:,1+(t-1)*2*vN:vN+(t-1)*2*vN),-verts(:,1+vN+(t-1)*2*vN:2*vN*t)); 216 | Uc_l = blkdiag(Ulamda_0,Uc_l); 217 | Uc_l = blkdiag(Uc_l,Ulamda); 218 | Uc_c = blkdiag(Uconstant_0,Uc_c); 219 | Uc_c = blkdiag(Uc_c,Uconstant); 220 | Uc = [Uc_l;Uc_c]; 221 | Wc_l = diag(ones(t*W*kl+3*t,1)); 222 | Wc_c = zeros(t*W+3*t,t*W*kl+3*t); 223 | Wc = [Wc_l;Wc_c]; 224 | hc = [zeros(t*W*kl + 3*t,1);ones(t*W+3*t,1)]; 225 | for n = 1:N % traverse all buses 226 | % constraints for upper bound of load loss 227 | Lamda_lup = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 228 | Lamda2_lup = sdpvar((t*W)*vN + 3*t,1); 229 | Zlup = -Zhat(Yl,t,T,W,n,Lup(n,1),bpN,bN); 230 | cons = [cons, Wc'* Lamda_lup == Zlup']; 231 | cons = [cons, Uc'* Lamda_lup + Lamda2_lup == 0]; 232 | cons = [cons, hc'* Lamda_lup >= 0]; 233 | cons = [cons, Lamda2_lup >= 0]; 234 | % constraints for lower bound of load loss 235 | Lamda_llow = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 236 | Lamda2_llow = sdpvar((t*W)*vN + 3*t,1); 237 | Zllow = Zhat(Yl,t,T,W,n,Llow(n,1),bpN,bN); 238 | cons = [cons, Wc'* Lamda_llow == Zllow']; 239 | cons = [cons, Uc'* Lamda_llow + Lamda2_llow == 0]; 240 | cons = [cons, hc'* Lamda_llow >= 0]; 241 | cons = [cons, Lamda2_llow >= 0]; 242 | %check if current bus contains wind generation 243 | if ismember(n,Wbus) 244 | index = find(Wbus==n); 245 | Lamda_w = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 246 | Lamda2_w = sdpvar((t*W)*vN + 3*t,1); 247 | Aw = [PW_miu((t-1)*W+index,1)-YPw(index,t), -YPw(index,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN)]; 248 | Zw = []; 249 | for tt = 1:t 250 | if tt == t 251 | Zw = [Zw,0,Aw(1,1),0]; 252 | else 253 | Zw = [Zw,0,0,0]; 254 | end 255 | end 256 | for tt = 1:t 257 | for w = 1:W 258 | if (tt==t && w==index) 259 | Zw = [Zw,1,Aw(1,2+(tt-1)*W*bN+(w-1)*bN:1+(tt-1)*W*bN+w*bN),zeros(1,bpN)]; 260 | else 261 | Zw = [Zw,0,Aw(1,2+(tt-1)*W*bN+(w-1)*bN:1+(tt-1)*W*bN+w*bN),zeros(1,bpN)]; 262 | end 263 | end 264 | end 265 | cons = [cons, Wc'* Lamda_w == Zw']; 266 | cons = [cons, Uc'* Lamda_w + Lamda2_w == 0]; 267 | cons = [cons, hc'* Lamda_w >= 0]; 268 | cons = [cons, Lamda2_w >= 0]; 269 | % lower bound of wind generation 270 | Lamda_wlow = [sdpvar(t*W*(1+bN+bpN) + 3*t,1); sdpvar(t*W + 3*t,1)]; 271 | Lamda2_wlow = sdpvar((t*W)*vN + 3*t,1); 272 | Zwlow = Zhat(YPw,t,T,W,index,0,bpN,bN); 273 | cons = [cons, Wc'* Lamda_wlow == Zwlow']; 274 | cons = [cons, Uc'* Lamda_wlow + Lamda2_wlow == 0]; 275 | cons = [cons, hc'* Lamda_wlow >= 0]; 276 | cons = [cons, Lamda2_wlow >= 0]; 277 | end 278 | % check if current bus contains thermal unit 279 | if ismember(n,Gbus) 280 | index = find(Gbus==n); 281 | %lowest generation cost 282 | Lamda_wan = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 283 | Lamda2_wan = sdpvar((t*W)*vN + 3*t,1); 284 | Zwan = Zhat(YS,t,T,W,index,0,bpN,bN); 285 | cons = [cons, Wc'* Lamda_wan == Zwan']; 286 | cons = [cons, Uc'* Lamda_wan + Lamda2_wan == 0]; 287 | cons = [cons, hc'* Lamda_wan >= 0]; 288 | cons = [cons, Lamda2_wan >= 0]; 289 | 290 | % linearize the cost of generation 291 | for l = 0:(L-1) 292 | Lamda_cost = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 293 | Lamda2_cost = sdpvar((t*W)*vN + 3*t,1); 294 | p_i_l = Plow(index) + (Pup(index) - Plow(index)) / L * l; 295 | Acost = [Yz(index,t), Yz(index,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN)] - (2*fc(index)*p_i_l+fb(index)) * [YG(index,t),YG(index,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN)]; 296 | Bcost = -(fa(index)-fc(index)*p_i_l*p_i_l) * [Xu(index,t),Xu(index,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN)]; 297 | Zcost = []; 298 | for tt = 1:t 299 | if tt == t 300 | Zcost = [Zcost,0,Acost(1,1),Bcost(1,1)]; 301 | else 302 | Zcost = [Zcost,0,0,0]; 303 | end 304 | end 305 | for tt = 1:t 306 | for w = 1:W 307 | Zcost = [Zcost,0,Acost(1,2+(tt-1)*W*bN+(w-1)*bN:1+(tt-1)*W*bN+w*bN),Bcost(1,2+(tt-1)*W*bpN+(w-1)*bpN:1+(tt-1)*W*bpN+w*bpN)]; 308 | end 309 | end 310 | cons = [cons, Wc'* Lamda_cost == Zcost']; 311 | cons = [cons, Uc'* Lamda_cost + Lamda2_cost == 0]; 312 | cons = [cons, hc'* Lamda_cost >= 0]; 313 | cons = [cons, Lamda2_cost >= 0]; 314 | end 315 | 316 | % cost of startup 317 | if (t-tao0(index)+1<=0)&&(max(0,-T0(index))= 0]; 349 | cons = [cons, Lamda2_open >= 0]; 350 | 351 | %upper bound of generation 352 | Lamda_up = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 353 | Lamda2_up = sdpvar((t*W)*vN + 3*t,1); 354 | Aup = [YG(index,t),YG(index,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN)]; 355 | Bup = Pup(index) * [Xu(index,t),Xu(index,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN)]; 356 | Zup = []; 357 | for tt = 1:t 358 | if tt == t 359 | Zup = [Zup,0,-Aup(1,1),Bup(1,1)]; 360 | else 361 | Zup = [Zup,0,0,0]; 362 | end 363 | end 364 | for tt = 1:t 365 | for w = 1:W 366 | Zup = [Zup,0,-Aup(1,2+(tt-1)*W*bN+(w-1)*bN:1+(tt-1)*W*bN+w*bN),Bup(1,2+(tt-1)*W*bpN+(w-1)*bpN:1+(tt-1)*W*bpN+w*bpN)]; 367 | end 368 | end 369 | cons = [cons, Wc'* Lamda_up == Zup']; 370 | cons = [cons, Uc'* Lamda_up + Lamda2_up == 0]; 371 | cons = [cons, hc'* Lamda_up >= 0]; 372 | cons = [cons, Lamda2_up >= 0]; 373 | 374 | %lower bound of generation 375 | Lamda_low = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 376 | Lamda2_low = sdpvar((t*W)*vN + 3*t,1); 377 | Alow = [YG(index,t),YG(index,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN)]; 378 | Blow = Plow(index) * [Xu(index,t),Xu(index,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN)]; 379 | Zlow = []; 380 | for tt = 1:t 381 | if tt == t 382 | Zlow = [Zlow,0,Alow(1,1),-Blow(1,1)]; 383 | else 384 | Zlow = [Zlow,0,0,0]; 385 | end 386 | end 387 | for tt = 1:t 388 | for w = 1:W 389 | Zlow = [Zlow,0,Alow(1,2+(tt-1)*W*bN+(w-1)*bN:1+(tt-1)*W*bN+w*bN),-Blow(1,2+(tt-1)*W*bpN+(w-1)*bpN:1+(tt-1)*W*bpN+w*bpN)]; 390 | end 391 | end 392 | cons = [cons, Wc'* Lamda_low == Zlow']; 393 | cons = [cons, Uc'* Lamda_low + Lamda2_low == 0]; 394 | cons = [cons, hc'* Lamda_low >= 0]; 395 | cons = [cons, Lamda2_low >= 0]; 396 | 397 | %up ramping 398 | Lamda_ramp_up = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 399 | Lamda2_ramp_up = sdpvar((t*W)*vN + 3*t,1); 400 | if t == 1 401 | Aramp_up = -[YG(index,t),YG(index,T+1:T+W*bN)]; %当t=1时,只剩s和p1两项 402 | Bramp_up = Pstart(index) * [Xs(index,t),Xs(index,T+1:T+W*bpN)]; 403 | else 404 | Aramp_up = [YG(index,t-1),YG(index,T+1+Sumt(t-2)*W*bN:T+Sumt(t-1)*W*bN),zeros(1,W*bN)] - [YG(index,t),YG(index,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN)]; 405 | Bramp_up = Pramp(index) * [Xu(index,t-1),Xu(index,T+1+Sumt(t-2)*W*bpN:T+Sumt(t-1)*W*bpN),zeros(1,W*bpN)] + Pstart(index) * [Xs(index,t),Xs(index,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN)]; 406 | end 407 | Zramp_up = []; 408 | for tt = 1:t 409 | if tt == t 410 | Zramp_up = [Zramp_up,0,Aramp_up(1,1),Bramp_up(1,1)]; 411 | else 412 | Zramp_up = [Zramp_up,0,0,0]; 413 | end 414 | end 415 | for tt = 1:t 416 | for w = 1:W 417 | Zramp_up = [Zramp_up,0,Aramp_up(1,2+(tt-1)*W*bN+(w-1)*bN:1+(tt-1)*W*bN+w*bN),Bramp_up(1,2+(tt-1)*W*bpN+(w-1)*bpN:1+(tt-1)*W*bpN+w*bpN)]; 418 | end 419 | end 420 | cons = [cons, Wc'* Lamda_ramp_up == Zramp_up']; 421 | cons = [cons, Uc'* Lamda_ramp_up + Lamda2_ramp_up == 0]; 422 | cons = [cons, hc'* Lamda_ramp_up >= 0]; 423 | cons = [cons, Lamda2_ramp_up >= 0]; 424 | 425 | %down ramping 426 | Lamda_ramp_down = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 427 | Lamda2_ramp_down = sdpvar((t*W)*vN + 3*t,1); 428 | if t == 1 429 | Aramp_down = [YG(index,t),YG(index,T+1:T+W*bN)]; 430 | Bramp_down = Pshut(index) * [Xd(index,t),Xd(index,T+1:T+W*bpN)] + Pramp(index) * [Xu(index,t),Xu(index,T+1:T+W*bpN)]; 431 | else 432 | Aramp_down = [YG(index,t),YG(index,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN)] - [YG(index,t-1),YG(index,T+1+Sumt(t-2)*W*bN:T+Sumt(t-1)*W*bN), zeros(1,W*bN)]; 433 | Bramp_down = Pshut(index) * [Xd(index,t),Xd(index,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN)] + Pramp(index) * [Xu(index,t),Xu(index,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN)]; 434 | end 435 | Zramp_down = []; 436 | for tt = 1:t 437 | if tt == t 438 | Zramp_down = [Zramp_down,0,Aramp_down(1,1),Bramp_down(1,1)]; 439 | else 440 | Zramp_down = [Zramp_down,0,0,0]; 441 | end 442 | end 443 | for tt = 1:t 444 | for w = 1:W 445 | Zramp_down = [Zramp_down,0,Aramp_down(1,2+(tt-1)*W*bN+(w-1)*bN:1+(tt-1)*W*bN+w*bN),Bramp_down(1,2+(tt-1)*W*bpN+(w-1)*bpN:1+(tt-1)*W*bpN+w*bpN)]; 446 | end 447 | end 448 | cons = [cons, Wc'* Lamda_ramp_down == Zramp_down']; 449 | cons = [cons, Uc'* Lamda_ramp_down + Lamda2_ramp_down== 0]; 450 | cons = [cons, hc'* Lamda_ramp_down >= 0]; 451 | cons = [cons, Lamda2_ramp_down >= 0]; 452 | 453 | %only binary 454 | %startpu u>0 constraints 455 | Lamda_u0 = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 456 | Lamda2_u0 = sdpvar((t*W)*vN + 3*t,1); 457 | Zu0 = Zbin(Xu,t,T,W,index,0,bpN,bN); 458 | cons = [cons, Wc'* Lamda_u0 == Zu0']; 459 | cons = [cons, Uc'* Lamda_u0 + Lamda2_u0== 0]; 460 | cons = [cons, hc'* Lamda_u0 >= 0]; 461 | cons = [cons, Lamda2_u0 >= 0]; 462 | %u<1 463 | Lamda_u1 = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 464 | Lamda2_u1 = sdpvar((t*W)*vN + 3*t,1); 465 | Zu1 = -Zbin(Xu,t,T,W,index,1,bpN,bN); 466 | cons = [cons, Wc'* Lamda_u1 == Zu1']; 467 | cons = [cons, Uc'* Lamda_u1 + Lamda2_u1== 0]; 468 | cons = [cons, hc'* Lamda_u1 >= 0]; 469 | cons = [cons, Lamda2_u1 >= 0]; 470 | %s>0 constaints 471 | Lamda_s0 = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 472 | Lamda2_s0 = sdpvar((t*W)*vN + 3*t,1); 473 | Zs0 = Zbin(Xs,t,T,W,index,0,bpN,bN); 474 | cons = [cons, Wc'* Lamda_s0 == Zs0']; 475 | cons = [cons, Uc'* Lamda_s0 + Lamda2_s0== 0]; 476 | cons = [cons, hc'* Lamda_s0 >= 0]; 477 | cons = [cons, Lamda2_s0 >= 0]; 478 | %s<1 479 | Lamda_s1 = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 480 | Lamda2_s1 = sdpvar((t*W)*vN + 3*t,1); 481 | Zs1 = -Zbin(Xs,t,T,W,index,1,bpN,bN); 482 | cons = [cons, Wc'* Lamda_s1 == Zs1']; 483 | cons = [cons, Uc'* Lamda_s1 + Lamda2_s1== 0]; 484 | cons = [cons, hc'* Lamda_s1 >= 0]; 485 | cons = [cons, Lamda2_s1 >= 0]; 486 | %d>0 constraints 487 | Lamda_d0 = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 488 | Lamda2_d0 = sdpvar((t*W)*vN + 3*t,1); 489 | Zd0 = Zbin(Xd,t,T,W,index,0,bpN,bN); 490 | cons = [cons, Wc'* Lamda_d0 == Zd0']; 491 | cons = [cons, Uc'* Lamda_d0 + Lamda2_d0== 0]; 492 | cons = [cons, hc'* Lamda_d0 >= 0]; 493 | cons = [cons, Lamda2_d0 >= 0]; 494 | %d<1 495 | Lamda_d1 = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 496 | Lamda2_d1 = sdpvar((t*W)*vN + 3*t,1); 497 | Zd1 = -Zbin(Xd,t,T,W,index,1,bpN,bN); 498 | cons = [cons, Wc'* Lamda_d1 == Zd1']; 499 | cons = [cons, Uc'* Lamda_d1 + Lamda2_d1== 0]; 500 | cons = [cons, hc'* Lamda_d1 >= 0]; 501 | cons = [cons, Lamda2_d1 >= 0]; 502 | omiga = max(0,t-Ton(index))+1; 503 | if (omiga<=t) 504 | Lamda_on = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 505 | Lamda2_on = sdpvar((t*W)*vN + 3*t,1); 506 | Bon_s = zeros(1,1+t*W*bpN); 507 | for o = omiga:t 508 | Bon_s = Bon_s + [Xs(index,o),Xs(index,T+1+Sumt(o-1)*W*bpN:T+Sumt(o)*W*bpN), zeros(1,(t-o)*W*bpN)]; 509 | end 510 | Bon_u = [Xu(index,t),Xu(index,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN)]; 511 | Zmid = Bon_u - Bon_s; 512 | Zon = []; 513 | for tt = 1:t 514 | if tt == t 515 | Zon = [Zon,0,0,Zmid(1,1)]; 516 | else 517 | Zon = [Zon,0,0,0]; 518 | end 519 | end 520 | for tt = 1:t 521 | for w = 1:W 522 | Zon = [Zon,0,zeros(1,bN),Zmid(1,2+(tt-1)*W*bpN+(w-1)*bpN:1+(tt-1)*W*bpN+w*bpN)]; 523 | end 524 | end 525 | cons = [cons, Wc'* Lamda_on == Zon']; 526 | cons = [cons, Uc'* Lamda_on + Lamda2_on== 0]; 527 | cons = [cons, hc'* Lamda_on >= 0]; 528 | cons = [cons, Lamda2_on >= 0]; 529 | end 530 | %shutdown constraints 531 | omiga = max(0,t-Toff(index))+1; 532 | if (t >= 1+L0(index)&&(omiga<=t)) 533 | Lamda_off = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 534 | Lamda2_off = sdpvar((t*W)*vN + 3*t,1); 535 | Boff_d = zeros(1,1+t*W*bpN); 536 | for o = omiga:t 537 | Boff_d = Boff_d - [Xd(index,o), Xd(index,T+1+Sumt(o-1)*W*bpN:T+Sumt(o)*W*bpN), zeros(1,(t-o)*W*bpN)]; 538 | end 539 | Boff_u = -[Xu(index,t),Xu(index,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN)]; 540 | Boff = Boff_u + Boff_d; 541 | Zoff = []; 542 | for tt = 1:t 543 | if tt == t 544 | Zoff = [Zoff,0,0,1+Boff(1,1)]; 545 | else 546 | Zoff = [Zoff,0,0,0]; 547 | end 548 | end 549 | for tt = 1:t 550 | for w = 1:W 551 | Zoff = [Zoff,0,zeros(1,bN),Boff(1,2+(tt-1)*W*bpN+(w-1)*bpN:1+(tt-1)*W*bpN+w*bpN)]; 552 | end 553 | end 554 | cons = [cons, Wc'* Lamda_off == Zoff']; 555 | cons = [cons, Uc'* Lamda_off + Lamda2_off== 0]; 556 | cons = [cons, hc'* Lamda_off >= 0]; 557 | cons = [cons, Lamda2_off >= 0]; 558 | end 559 | %end of only binary 560 | end 561 | % % transmission limitation 562 | for i = 1:size(all_branch.I,1) 563 | left = all_branch.I(i); 564 | right = all_branch.J(i); 565 | abs_x4branch = abs(1/B(left,right)); % the absolute value of the impedance of the current branch |x_ij| 566 | % right side of the inequility 567 | Lamda_Fup = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 568 | Lamda2_Fup = sdpvar((t*W)*vN + 3*t,1); 569 | AFup = [Ytheta(right,t) - Ytheta(left,t) + abs_x4branch*all_branch.P(i),Ytheta(right,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN) - Ytheta(left,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN)]; % theta_j - theta_i + F 570 | ZFup = []; 571 | for tt = 1:t 572 | if tt == t 573 | ZFup = [ZFup,0,AFup(1,1),0]; 574 | else 575 | ZFup = [ZFup,0,0,0]; 576 | end 577 | end 578 | for tt = 1:t 579 | for w = 1:W 580 | ZFup = [ZFup,0,AFup(1,2+(tt-1)*W*bN+(w-1)*bN:1+(tt-1)*W*bN+w*bN),zeros(1,bpN)]; 581 | end 582 | end 583 | cons = [cons, Wc'* Lamda_Fup == ZFup']; 584 | cons = [cons, Uc'* Lamda_Fup + Lamda2_Fup == 0]; 585 | cons = [cons, hc'* Lamda_Fup >= 0]; 586 | cons = [cons, Lamda2_Fup >= 0]; 587 | % left side 588 | Lamda_Flow = [sdpvar(t*W*kl + 3*t,1); sdpvar(t*W + 3*t,1)]; 589 | Lamda2_Flow = sdpvar((t*W)*vN + 3*t,1); 590 | AFlow = [Ytheta(left,t) - Ytheta(right,t) + abs_x4branch*all_branch.P(i),Ytheta(left,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN) - Ytheta(right,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN)]; % theta_i - theta_j + F 591 | ZFlow = []; 592 | for tt = 1:t 593 | if tt == t 594 | ZFlow = [ZFlow,0,AFlow(1,1),0]; 595 | else 596 | ZFlow = [ZFlow,0,0,0]; 597 | end 598 | end 599 | for tt = 1:t 600 | for w = 1:W 601 | ZFlow = [ZFlow,0,AFlow(1,2+(tt-1)*W*bN+(w-1)*bN:1+(tt-1)*W*bN+w*bN),zeros(1,bpN)]; 602 | end 603 | end 604 | cons = [cons, Wc'* Lamda_Flow == ZFlow']; 605 | cons = [cons, Uc'* Lamda_Flow + Lamda2_Flow == 0]; 606 | cons = [cons, hc'* Lamda_Flow >= 0]; 607 | cons = [cons, Lamda2_Flow >= 0]; 608 | end 609 | end 610 | end 611 | % end of construct inequality constraints 612 | 613 | % construct equality constraints 614 | % on/off unit state 615 | for g = 1:G 616 | for t = 1:T 617 | if t == 1 618 | Zmot_0 = [0,0,Xs(g,t)] - [0,0,Xd(g,t)] - [0,0,Xu(g,t)]; 619 | Zmot = [0,zeros(1,bN),Xs(g,T+1:T+W*bpN)] - [0,zeros(1,bN),Xd(g,T+1:T+W*bpN)] - [0,zeros(1,bN),Xu(g,T+1:T+W*bpN)]; 620 | else 621 | Zmot_0 = [0,0,Xs(g,t)-Xd(g,t)-Xu(g,t)+Xu(g,t-1)]; 622 | Bmot = Xs(g,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN) - Xd(g,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN) - Xu(g,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN) + [Xu(g,T+1+Sumt(t-2)*W*bpN:T+Sumt(t-1)*W*bpN),zeros(1,W*bpN)]; 623 | Zmot = []; 624 | for tt = 1:t 625 | for w = 1:W 626 | Zmot = [Zmot,0,zeros(1,bN),Bmot(1,1+(tt-1)*W*bpN+(w-1)*bpN:(tt-1)*W*bpN+w*bpN)]; 627 | end 628 | end 629 | end 630 | cons = [cons, Zmot_0*ones(3,1) == 0]; 631 | cons = [cons, Zmot == 0]; 632 | end 633 | end 634 | 635 | % DC network constraints 636 | for n = 1:N 637 | for t = 1:T 638 | Zac = zeros(1,1+t*W*bN); %continuous decision variable 639 | dac = 0; %constant term 640 | Zac = Zac + [Yl(n,t),Yl(n,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN)]; 641 | if ismember(n,Gbus) %if thermal units 642 | index = find(Gbus==n); 643 | Zac = Zac + [YG(index,t),YG(index,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN)]; 644 | end 645 | if ismember(n,Wbus) %if wind units 646 | index = find(Wbus==n); 647 | Zac = Zac + [YPw(index,t),YPw(index,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN)]; 648 | end 649 | for j = 1:N 650 | if B(n,j) ~=0 651 | Zac = Zac - B(n,j) * [Ytheta(j,t),Ytheta(j,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN)]; 652 | end 653 | end 654 | if ismember(n,Dbus) %if load bus 655 | index = find(Dbus==n); 656 | dac = dac + SCUC_data.busLoad.node_P(t,index); 657 | end 658 | cons = [cons, Zac(1,1) == dac]; 659 | cons = [cons, Zac(2:t*W*bN)' == 0]; 660 | end 661 | end 662 | % end of DC network constraints 663 | % end of construct equality constraints 664 | 665 | % construct object 666 | Cobj = zeros(1,T*W); %ksi coefficient matrix 667 | Aobj = zeros(1,T*W*bN); %ksi_hat coefficient matrix 668 | Bobj = zeros(1,T*W*bpN); %ksi_tine coefficient matrix 669 | Cobj0 = zeros(1,T); %ksi0 coefficient matrix 670 | Aobj0 = zeros(1,T); %ksi_hat0 coefficient matrix 671 | Bobj0 = zeros(1,T); %ksi_tine0 coefficient matrix 672 | Uobj_l = []; %convex hull's verts matrix of objective 673 | Uobj_c = []; 674 | for t = 1:T 675 | for n = 1:N 676 | Aobj0 = Aobj0+ 100*[zeros(1,t-1),Yl(n,t),zeros(1,T-t)]; 677 | Aobj = Aobj + 100*[Yl(n,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN),zeros(1,(T-t)*W*bN)]; 678 | if ismember(n,Gbus) 679 | index = find(Gbus==n); 680 | Aobj0 = Aobj0+ [zeros(1,t-1),Yz(index,t),zeros(1,T-t)] + [zeros(1,t-1),YS(index,t),zeros(1,T-t)]; 681 | Bobj0 = Bobj0 + [zeros(1,t-1),Xs(index,t),zeros(1,T-t)]; 682 | Aobj = Aobj + [Yz(index,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN) + YS(index,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN), zeros(1,(T-t)*W*bN)]; 683 | Bobj = Bobj + [Chot(index) * Xs(index,1+Sumt(t-1)*W*bpN:Sumt(t)*W*bpN), zeros(1,(T-t)*W*bpN)]; 684 | end 685 | end 686 | Ulamda = blkdiag(verts(:,1+(t-1)*2*vN:vN+(t-1)*2*vN),verts(:,1+vN+(t-1)*2*vN:2*vN*t)); 687 | Uconstant = []; 688 | for w = 1:W 689 | Uconstant = blkdiag(Uconstant,ones(1,vN)); 690 | end 691 | Uobj_l = blkdiag(Ulamda_0,Uobj_l); 692 | Uobj_l = blkdiag(Uobj_l,-Ulamda); 693 | Uobj_c = blkdiag(Uconstant_0,Uobj_c); 694 | Uobj_c = blkdiag(Uobj_c,Uconstant); 695 | end 696 | 697 | U = [Uobj_l;Uobj_c]; 698 | W_l = diag(ones(T*W*kl+3*T,1)); 699 | W_c = zeros(T*W+3*T,T*W*kl+3*T); 700 | W_obj = [W_l;W_c]; 701 | Zobj = []; 702 | Zobj_0 = []; 703 | for t = 1:T 704 | Zobj_0 = [Zobj_0,0,Aobj0(1,t),Bobj0(1,t)]; 705 | for w = 1:W 706 | Zobj = [Zobj,0,Aobj(1,1+(t-1)*2*bN+(w-1)*bN:(t-1)*2*bN+w*bN),Bobj(1,1+(t-1)*2*bpN+(w-1)*bpN:(t-1)*2*bpN+w*bpN)]; 707 | end 708 | end 709 | Zobj = [Zobj_0,Zobj]; %ksi0,ksi_hat0,ksi_tine0,ksi,ksi_hat,ksi_tine 710 | hobj = [zeros(1,T*W*kl+3*T),ones(1,T*W+3*T)]'; 711 | v = sdpvar(1,M); %first lagrangian multipliers v 712 | beta = sdpvar(1); %second lagrangian multipliers beta 713 | y1 = sdpvar((T*W*(kl+1))+2*3*T,M); 714 | constraints = []; 715 | constraints = [constraints, beta >= 0]; 716 | for m = 1:M 717 | y_j = y1(:,m); 718 | mid_obj = Zobj' - W_obj'*y_j; 719 | constraints = [constraints, (mid_obj' * ksi_wan{m} + hobj' * y_j) <= M*v(1,m)]; 720 | constraints = [constraints, abs(mid_obj) <= beta]; 721 | constraints = [constraints, U' * y_j >= 0]; 722 | end 723 | % end of construct object 724 | 725 | constraints = [constraints, cons]; 726 | 727 | objective = sum(v) + eps*beta; %setting objective 728 | 729 | % options = sdpsettings('verbose',2,'debug',1,'savesolveroutput',1,'savesolverinput',1); 730 | % options = sdpsettings('verbose',2,'solver','mosek','debug',1,'savesolveroutput',1,'savesolverinput',1); 731 | % options.mosek.MSK_DPAR_OPTIMIZER_MAX_TIME = 1000; 732 | options = sdpsettings('verbose',2,'solver','cplex','debug',1,'savesolveroutput',1,'savesolverinput',1); 733 | % options.cplex.timelimit = 1000; 734 | sol = optimize(constraints,objective,options); 735 | 736 | % Analyze error flags 737 | if sol.problem == 0 738 | % Extract and display value 739 | Obj = value(objective); 740 | disp(Obj); 741 | 742 | real_PG = zeros(G,T); %thermal generation 743 | real_z = zeros(G,T); %generation cost of thermal units 744 | real_S = zeros(G,T); %startpu cost of thermal units 745 | real_l = zeros(N,T); %load loss 746 | real_PW = zeros(W,T); %wind generation 747 | real_theta = zeros(N,T); %phase angle 748 | real_u = zeros(G,T); %units state 749 | real_s = zeros(G,T); %turn on 750 | real_d = zeros(G,T); %turn off 751 | 752 | ksi_tine = ksi_wan2{18}(1+T*W*bN:T*W*bN+T*W*bpN); 753 | ksi_hat = ksi_wan2{18}(1:T*W*bN); 754 | for g = 1:G 755 | for t = 1:T 756 | real_PG(g,t) = YG(g,t) + sum(value(YG(g,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN))' .* ksi_hat(1:t*W*bN)); 757 | real_z(g,t) = Yz(g,t) + sum(value(Yz(g,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN))' .* ksi_hat(1:t*W*bN)); 758 | real_S(g,t) = YS(g,t) + sum(value(YS(g,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN))' .* ksi_hat(1:t*W*bN)); 759 | real_u(g,t) = Xu(g,t) + sum(value(Xu(g,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN))' .* ksi_tine(1:t*W*bpN)); 760 | real_s(g,t) = Xs(g,t) + sum(value(Xs(g,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN))' .* ksi_tine(1:t*W*bpN)); 761 | real_d(g,t) = Xd(g,t) + sum(value(Xd(g,T+1+Sumt(t-1)*W*bpN:T+Sumt(t)*W*bpN))' .* ksi_tine(1:t*W*bpN)); 762 | end 763 | end 764 | 765 | for w = 1:W 766 | for t = 1:T 767 | real_PW(w,t) = YPw(w,t) + sum(value(YPw(w,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN))' .* ksi_hat(1:t*W*bN)); 768 | end 769 | end 770 | 771 | for n = 1:N 772 | for t = 1:T 773 | real_theta(n,t) = Ytheta(n,t) + sum(value(Ytheta(n,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN))' .* ksi_hat(1:t*W*bN)); 774 | real_l(n,t) = Yl(n,t) + sum(value(Yl(n,T+1+Sumt(t-1)*W*bN:T+Sumt(t)*W*bN))' .* ksi_hat(1:t*W*bN)); 775 | end 776 | end 777 | 778 | real_yyy = zeros(N,T); 779 | for n = 1:N 780 | for t = 1:T 781 | real_yyy(n,t) = real_yyy(n,t) + real_l(n,t); 782 | if ismember(n,Gbus) 783 | index = find(Gbus==n); 784 | real_yyy(n,t) = real_yyy(n,t) + real_PG(index,t); 785 | end 786 | if ismember(n,Wbus) 787 | index = find(Wbus==n); 788 | real_yyy(n,t) = real_yyy(n,t) + real_PW(index,t); 789 | end 790 | for j = 1:N 791 | if B(n,j) ~=0 792 | real_yyy(n,t) = real_yyy(n,t) - B(n,j)*real_theta(j,t); 793 | end 794 | end 795 | if ismember(n,Dbus) 796 | index = find(Dbus==n); 797 | real_yyy(n,t) = real_yyy(n,t) - SCUC_data.busLoad.node_P(t,index); 798 | end 799 | end 800 | end 801 | disp(sol.solvertime); 802 | else 803 | disp('Oh shit!, something was wrong!'); 804 | sol.info 805 | yalmiperror(sol.problem) 806 | end 807 | --------------------------------------------------------------------------------