├── .gitignore ├── Comparison_bar_mean_time_1500iters.png ├── Comparison_boxplot_error_1500iters.png ├── Comparison_boxplot_max_energy_1500iters.png ├── Comparison_boxplot_mean_energy_1500iters.png ├── Comparison_boxplot_qoe_1500iters.png ├── README.md ├── brute_sfc_energy.py ├── brute_sfc_qoe.py ├── ckpt ├── checkpoint ├── dqn.ckpt.data-00000-of-00001 ├── dqn.ckpt.index └── dqn.ckpt.meta ├── ckpt_QQ ├── checkpoint ├── dqn.ckpt.data-00000-of-00001 ├── dqn.ckpt.index └── dqn.ckpt.meta ├── config.py ├── dqn.py ├── dqn_QQ.py ├── energy.py ├── env.py ├── env_QQ.py ├── main.py ├── main_QQ.py ├── output.txt ├── output_QQ.txt ├── plot_error.py ├── plot_error_boxplot.py ├── plot_max_energy.py ├── plot_max_energy_boxplot.py ├── plot_mean_energy.py ├── plot_mean_energy_boxplot.py ├── plot_qoe.py ├── plot_qoe_boxplot.py ├── plot_time.py ├── plot_time_barplot.py ├── random_sfc.py └── run.bat /.gitignore: -------------------------------------------------------------------------------- 1 | *.rbc 2 | capybara-*.html 3 | .rspec 4 | /db/*.sqlite3 5 | /db/*.sqlite3-journal 6 | /db/*.sqlite3-[0-9]* 7 | /public/system 8 | /coverage/ 9 | /spec/tmp 10 | *.orig 11 | rerun.txt 12 | pickle-email-*.html 13 | 14 | # Ignore all logfiles and tempfiles. 15 | /log/* 16 | /tmp/* 17 | !/log/.keep 18 | !/tmp/.keep 19 | 20 | # TODO Comment out this rule if you are OK with secrets being uploaded to the repo 21 | config/initializers/secret_token.rb 22 | config/master.key 23 | 24 | # Only include if you have production secrets in this file, which is no longer a Rails default 25 | # config/secrets.yml 26 | 27 | # dotenv 28 | # TODO Comment out this rule if environment variables can be committed 29 | .env 30 | 31 | ## Environment normalization: 32 | /.bundle 33 | /vendor/bundle 34 | 35 | # these should all be checked in to normalize the environment: 36 | # Gemfile.lock, .ruby-version, .ruby-gemset 37 | 38 | # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: 39 | .rvmrc 40 | 41 | # if using bower-rails ignore default bower_components path bower.json files 42 | /vendor/assets/bower_components 43 | *.bowerrc 44 | bower.json 45 | 46 | # Ignore pow environment settings 47 | .powenv 48 | 49 | # Ignore Byebug command history file. 50 | .byebug_history 51 | 52 | # Ignore node_modules 53 | node_modules/ 54 | 55 | # Ignore precompiled javascript packs 56 | /public/packs 57 | /public/packs-test 58 | /public/assets 59 | 60 | # Ignore yarn files 61 | /yarn-error.log 62 | yarn-debug.log* 63 | .yarn-integrity 64 | 65 | # Ignore uploaded files in development 66 | /storage/* 67 | !/storage/.keep 68 | -------------------------------------------------------------------------------- /Comparison_bar_mean_time_1500iters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirtox/An-efficient-VNF-deployment-scheme-for-service-function-chain-using-deep-Q-network/37cbc4dfbbf6cd1d1c8c2447ce3801859853e170/Comparison_bar_mean_time_1500iters.png -------------------------------------------------------------------------------- /Comparison_boxplot_error_1500iters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirtox/An-efficient-VNF-deployment-scheme-for-service-function-chain-using-deep-Q-network/37cbc4dfbbf6cd1d1c8c2447ce3801859853e170/Comparison_boxplot_error_1500iters.png -------------------------------------------------------------------------------- /Comparison_boxplot_max_energy_1500iters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirtox/An-efficient-VNF-deployment-scheme-for-service-function-chain-using-deep-Q-network/37cbc4dfbbf6cd1d1c8c2447ce3801859853e170/Comparison_boxplot_max_energy_1500iters.png -------------------------------------------------------------------------------- /Comparison_boxplot_mean_energy_1500iters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirtox/An-efficient-VNF-deployment-scheme-for-service-function-chain-using-deep-Q-network/37cbc4dfbbf6cd1d1c8c2447ce3801859853e170/Comparison_boxplot_mean_energy_1500iters.png -------------------------------------------------------------------------------- /Comparison_boxplot_qoe_1500iters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirtox/An-efficient-VNF-deployment-scheme-for-service-function-chain-using-deep-Q-network/37cbc4dfbbf6cd1d1c8c2447ce3801859853e170/Comparison_boxplot_qoe_1500iters.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # An efficient virtualized network function deployment scheme for service function chain using deep Q-network 2 | 3 | *** 4 | 5 | # File Descriptions 6 | 7 | ## DQN-QQE 8 | - main.py 9 | - It is the main function that executes DQN-QQE. 10 | - Moreover, random and brute force are also executed in main.py. 11 | 12 | - env.py 13 | - This file sets the environment of DQN-QQE. 14 | 15 | - dqn.py 16 | - There are the neural network structure and lots of DQN functions. 17 | - energy.py 18 | - It contains the energy process. 19 | 20 | - config.py 21 | - It sets lots of parameters. 22 | - DQN-QQE and DQN-Q2-SFC use the same file. 23 | 24 | 25 | ## DQN-Q2-SFC 26 | - main_QQ.py 27 | - It is the main function that executes DQN-QQE. 28 | - Moreover, random and brute force are also executed in main.py. 29 | 30 | - env_QQ.py 31 | - This file sets the environment of DQN-QQE. 32 | 33 | - dqn_QQ.py 34 | - There are the neural network structure and lots of DQN functions. 35 | 36 | - config.py 37 | - It sets lots of parameters. 38 | - DQN-QQE and DQN-Q2-SFC use the same file. 39 | 40 | 41 | ## Random 42 | - random_sfc.py 43 | - Random scheme. 44 | 45 | ## Brute Force 46 | - brute_sfc_energy.py 47 | - Brute force approach on energy aspect. 48 | 49 | - brute_sfc_qoe.py 50 | - Brute force approach on qoe aspect. 51 | 52 | *** 53 | 54 | # Execute 55 | ## Run run.bat 56 | - It is a batch file. 57 | - Line 1: 58 | - `call C:\Users\SNMLAB\Anaconda3\Scripts\activate.bat C:\Users\SNMLAB\Anaconda3` 59 | - It need to know where the activate.bat of Anaconda3 is. 60 | - Line 2: 61 | - `python main.py` 62 | - Run DQN-QQE, random, and brute force. 63 | - Line 3: 64 | - `python main_QQ.py` 65 | - Run DQN-Q2-SFC 66 | - Line 4: 67 | - `pause` 68 | - Stop batch file. 69 | 70 | *** 71 | 72 | # Plots 73 | 74 | ## Quality of Experience (QoE) 75 | ![image](https://github.com/kirtox/An-Efficient-VNF-Deployment-Mechanism-for-SFC-in-5G-using-Deep-Q-Network/blob/master/Comparison_boxplot_qoe_1500iters.png?raw=true) 76 | 77 | - plot_qoe.py 78 | - Line chart 79 | 80 | - plot_qoe_boxplot.py 81 | - Boxplot chart 82 | 83 | ## Error rate 84 | ![image](https://github.com/kirtox/An-Efficient-VNF-Deployment-Mechanism-for-SFC-in-5G-using-Deep-Q-Network/blob/master/Comparison_boxplot_error_1500iters.png?raw=true) 85 | 86 | - plot_error.py 87 | - Line chart 88 | 89 | - plot_error_boxplot.py 90 | - Boxplot chart 91 | 92 | ## Maximum energy consumption 93 | ![image](https://github.com/kirtox/An-Efficient-VNF-Deployment-Mechanism-for-SFC-in-5G-using-Deep-Q-Network/blob/master/Comparison_boxplot_max_energy_1500iters.png?raw=true) 94 | 95 | - plot_max_energy.py 96 | - Line chart 97 | 98 | - plot_max_energy_boxplot.py 99 | - Boxplot chart 100 | 101 | ## Average energy consumption 102 | ![image](https://github.com/kirtox/An-Efficient-VNF-Deployment-Mechanism-for-SFC-in-5G-using-Deep-Q-Network/blob/master/Comparison_boxplot_mean_energy_1500iters.png?raw=true) 103 | 104 | - plot_mean_energy.py 105 | - Line chart 106 | 107 | - plot_mean_energy_boxplot.py 108 | - Boxplot chart 109 | 110 | ## Average processing time 111 | ![image](https://github.com/kirtox/An-Efficient-VNF-Deployment-Mechanism-for-SFC-in-5G-using-Deep-Q-Network/blob/master/Comparison_bar_mean_time_1500iters.png?raw=true) 112 | 113 | - plot_time.py 114 | - Line chart 115 | 116 | - plot_time_barplot.py 117 | - Bar chart 118 | 119 | # Using Ant Colony Optimization algorithm (ACO) to iris dataset 120 | - To get the clusters 121 | - ACO.ipynb 122 | 123 | 124 | *** 125 | -------------------------------------------------------------------------------- /brute_sfc_energy.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from config import VNFGroupConfig 3 | from energy import Energy 4 | from env import VNFGroup 5 | import numpy as np 6 | import time 7 | 8 | group_config = VNFGroupConfig() 9 | energy = Energy() 10 | env = VNFGroup() 11 | 12 | P = 10.0 13 | 14 | 15 | class BruteSFC_Energy: 16 | def __init__(self): 17 | self.B = group_config.get_initialized_bandwidth() 18 | self.D = group_config.get_initialized_delay() 19 | self.sfc_requests = group_config.get_test_sfc() 20 | self.running_sfc = np.ndarray([0, 6], dtype=np.int32) 21 | self.total_qoe = 0.0 22 | self.error_counter = 0 23 | 24 | # ============================================================================================ 25 | self.time = 0 26 | 27 | self.vnf_id_collection = [0, 1, 2, 3, 4] 28 | 29 | # Energy of each type of VNFs 30 | self.E_vnf = group_config.get_initialized_vnf() 31 | 32 | # IDLE Energy of each type of VNFs 33 | self.E_IDLEvnf = group_config.get_initialized_IDLEvnf(energy.idle_energy) 34 | 35 | # 0:OFF, 1:IDLE, 2:ACTIVE 36 | self.state = group_config.get_initialized_state() 37 | 38 | # Number of each type of VNFs on each node 39 | self.capaVNFs = group_config.get_initialized_capaVNFs() 40 | 41 | # IDLE time of each node 42 | self.idletime = group_config.get_initialized_idletime() 43 | 44 | self.energy_OIA = 0 45 | self.lowest_energy = 9999999 46 | 47 | self.total_OIA = [] 48 | # ============================================================================================ 49 | 50 | def reset(self): 51 | energy.reset() 52 | self.__init__() 53 | 54 | def set_sfc_requests(self, sfc_requests): 55 | self.sfc_requests = sfc_requests 56 | 57 | def random_release_sfc(self, thresh=0.2): 58 | prob = np.array([np.random.random() for _ in range(self.running_sfc.shape[0])]) 59 | released_sfc = self.running_sfc[prob <= thresh] 60 | self.running_sfc = self.running_sfc[prob > thresh] 61 | for c in released_sfc: 62 | for i in range(0, 4): 63 | self.B[c[i+2], c[i+1], i] += c[0] 64 | 65 | def check_B(self, c, B_): 66 | for vnf_id in range(1, 5): 67 | if self.B[c[vnf_id], c[vnf_id-1], vnf_id-1] < B_: 68 | return False 69 | return True 70 | 71 | def check_D(self, c, D_): 72 | d_sum = 0.0 73 | for vnf_id in range(1, 5): 74 | d_sum += self.D[c[vnf_id], c[vnf_id-1], vnf_id-1] 75 | if d_sum > D_: 76 | return 0, False 77 | return d_sum, True 78 | 79 | def allocate_B(self, c, B_): 80 | for vnf_id in range(1, 5): 81 | self.B[c[vnf_id], c[vnf_id-1], vnf_id-1] -= B_ 82 | 83 | def select(self): 84 | start = time.time() 85 | [B_, D_] = self.sfc_requests.pop(0) 86 | 87 | while True: 88 | self.random_release_sfc() 89 | 90 | self.lowest_energy = 9999999 91 | best_c = None 92 | best_qoe = 0.0 93 | for node1 in range(5): 94 | for node2 in range(5): 95 | for node3 in range(5): 96 | for node4 in range(5): 97 | for node5 in range(5): 98 | c = [node1, node2, node3, node4, node5] 99 | 100 | if self.check_B(c, B_): 101 | d_sum, flag = self.check_D(c, D_) 102 | if flag: 103 | qoe = np.log(B_) - P*np.exp(-(D_-d_sum)/10.0) 104 | 105 | # backup 106 | # =================================================================================================== 107 | global tmp_state, tmp_capaVNFs, tmp_idletime 108 | tmp_state = np.copy(self.state) 109 | tmp_capaVNFs = np.copy(self.capaVNFs) 110 | tmp_idletime = np.copy(self.idletime) 111 | # =================================================================================================== 112 | 113 | # Energy 114 | # =================================================================================================== 115 | #print("===========================================") 116 | #print("VNF No.: ", self.vnf_id_collection) 117 | #print("Placement of VNFs: ", c) 118 | energy.update(c, self.state, self.idletime, self.vnf_id_collection, self.capaVNFs) 119 | #print("State: ", self.state) 120 | #print("Energy of each VNF: ", self.E_vnf) 121 | #print("IDLE Energy of each VNF: ", self.E_IDLEvnf) 122 | #print("\nAllocate_of_eachVNF:") 123 | #print("VNF:") 124 | #print(" 0 1 2 3 4") 125 | #print(self.capaVNFs) 126 | #print("IDLE time countdown: ", self.idletime) 127 | self.energy_OIA = energy.energy_OIA_mode(c, self.E_vnf, self.E_IDLEvnf, 128 | self.state, self.vnf_id_collection, self.capaVNFs) 129 | #print("Energy of OIA: ", round(self.energy_OIA, 0)) 130 | #print("===========================================\n") 131 | # =================================================================================================== 132 | 133 | if self.energy_OIA < self.lowest_energy: 134 | #print(self.energy_OIA, "&&", self.lowest_energy) 135 | self.lowest_energy = self.energy_OIA 136 | best_qoe = qoe 137 | best_c = c 138 | 139 | else: 140 | # recovery 141 | energy.OIA_energy -= self.energy_OIA 142 | self.state = tmp_state 143 | self.capaVNFs = tmp_capaVNFs 144 | self.idletime = tmp_idletime 145 | 146 | #print('Period: {:g}'.format(round((end-start), 0))) 147 | if best_c: 148 | self.total_qoe += best_qoe 149 | self.allocate_B(best_c, B_) 150 | sfc = [B_] 151 | sfc += best_c 152 | self.running_sfc = np.concatenate([self.running_sfc, np.array([sfc])], axis=0) 153 | 154 | # lowest energy add 155 | self.total_OIA.append(self.lowest_energy) 156 | 157 | 158 | else: 159 | self.total_qoe -= P 160 | self.error_counter += 1 161 | try: 162 | [B_, D_] = self.sfc_requests.pop(0) 163 | except IndexError: 164 | break 165 | end = time.time() 166 | self.time = round((end-start), 2) 167 | 168 | def get_mean_qoe(self): 169 | return self.total_qoe / env.num_requests 170 | 171 | def get_error_rate(self): 172 | return self.error_counter / env.num_requests 173 | 174 | def get_mean_energy_OIA(self): 175 | return sum(self.total_OIA) / env.num_requests 176 | 177 | def get_max_energy_OIA(self): 178 | return max(self.total_OIA) 179 | 180 | 181 | if __name__ == '__main__': 182 | sfc = BruteSFC_energy() 183 | sfc.select() 184 | 185 | print('Period: {:g}s '.format(sfc.time)) 186 | 187 | print('Mean QoE:', sfc.get_mean_qoe()) 188 | print('Error Rate:', sfc.get_error_rate()) 189 | print("Mean Energy of OIA: ", round(sfc.get_mean_energy_OIA(), 0)) 190 | print("Max Energy of OIA: ", round(sfc.get_max_energy_OIA(), 0)) 191 | tt = sfc.total_OIA 192 | 193 | -------------------------------------------------------------------------------- /brute_sfc_qoe.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from config import VNFGroupConfig 3 | from energy import Energy 4 | from env import VNFGroup 5 | import numpy as np 6 | import time 7 | 8 | group_config = VNFGroupConfig() 9 | energy = Energy() 10 | env = VNFGroup() 11 | 12 | P = 10.0 13 | 14 | 15 | class BruteSFC_QoE: 16 | def __init__(self): 17 | self.B = group_config.get_initialized_bandwidth() 18 | self.D = group_config.get_initialized_delay() 19 | self.sfc_requests = group_config.get_test_sfc() 20 | self.running_sfc = np.ndarray([0, 6], dtype=np.int32) 21 | self.total_qoe = 0.0 22 | self.error_counter = 0 23 | 24 | # ============================================================================================ 25 | self.time = 0 26 | 27 | self.vnf_id_collection = [0, 1, 2, 3, 4] 28 | 29 | # Energy of each type of VNFs 30 | self.E_vnf = group_config.get_initialized_vnf() 31 | 32 | # IDLE Energy of each type of VNFs 33 | self.E_IDLEvnf = group_config.get_initialized_IDLEvnf(energy.idle_energy) 34 | 35 | # ACTIVE IDLE OFF 36 | self.state = group_config.get_initialized_state() 37 | 38 | # Number of each type of VNFs on each node 39 | self.capaVNFs = group_config.get_initialized_capaVNFs() 40 | 41 | # IDLE time of each node 42 | self.idletime = group_config.get_initialized_idletime() 43 | 44 | self.energy_OIA = 0 45 | 46 | self.total_OIA = [] 47 | # ============================================================================================ 48 | 49 | def reset(self): 50 | energy.reset() 51 | self.__init__() 52 | 53 | def set_sfc_requests(self, sfc_requests): 54 | self.sfc_requests = sfc_requests 55 | 56 | def random_release_sfc(self, thresh=0.2): 57 | prob = np.array([np.random.random() for _ in range(self.running_sfc.shape[0])]) 58 | released_sfc = self.running_sfc[prob <= thresh] 59 | self.running_sfc = self.running_sfc[prob > thresh] 60 | for c in released_sfc: 61 | for i in range(0, 4): 62 | self.B[c[i+2], c[i+1], i] += c[0] 63 | 64 | def check_B(self, c, B_): 65 | for vnf_id in range(1, 5): 66 | if self.B[c[vnf_id], c[vnf_id-1], vnf_id-1] < B_: 67 | return False 68 | return True 69 | 70 | def check_D(self, c, D_): 71 | d_sum = 0.0 72 | for vnf_id in range(1, 5): 73 | d_sum += self.D[c[vnf_id], c[vnf_id-1], vnf_id-1] 74 | if d_sum > D_: 75 | return 0, False 76 | return d_sum, True 77 | 78 | def allocate_B(self, c, B_): 79 | for vnf_id in range(1, 5): 80 | self.B[c[vnf_id], c[vnf_id-1], vnf_id-1] -= B_ 81 | 82 | def select(self): 83 | start = time.time() 84 | [B_, D_] = self.sfc_requests.pop(0) 85 | while True: 86 | self.random_release_sfc() 87 | 88 | best_c = None 89 | best_qoe = 0.0 90 | for node1 in range(5): 91 | for node2 in range(5): 92 | for node3 in range(5): 93 | for node4 in range(5): 94 | for node5 in range(5): 95 | c = [node1, node2, node3, node4, node5] 96 | 97 | if self.check_B(c, B_): 98 | d_sum, flag = self.check_D(c, D_) 99 | if flag: 100 | qoe = np.log(B_) - P*np.exp(-(D_-d_sum)/10.0) 101 | if qoe > best_qoe: 102 | best_qoe = qoe 103 | best_c = c 104 | #print('Period: {:g}'.format(round((end-start), 0))) 105 | if best_c: 106 | self.total_qoe += best_qoe 107 | self.allocate_B(best_c, B_) 108 | sfc = [B_] 109 | sfc += best_c 110 | self.running_sfc = np.concatenate([self.running_sfc, np.array([sfc])], axis=0) 111 | 112 | # Energy 113 | # =================================================================================================== 114 | #print("===========================================") 115 | #print("VNF No.: ", self.vnf_id_collection) 116 | #print("Placement of VNFs: ", best_c) 117 | energy.update(best_c, self.state, self.idletime, self.vnf_id_collection, self.capaVNFs) 118 | #print("State: ", self.state) 119 | #print("Energy of each VNF: ", self.E_vnf) 120 | #print("IDLE Energy of each VNF: ", self.E_IDLEvnf) 121 | #print("\nAllocate_of_eachVNF:") 122 | #print("VNF:") 123 | #print(" 0 1 2 3 4") 124 | #print(self.capaVNFs) 125 | #print("IDLE time countdown: ", self.idletime) 126 | self.energy_OIA = energy.energy_OIA_mode(best_c, self.E_vnf, self.E_IDLEvnf, 127 | self.state, self.vnf_id_collection, self.capaVNFs) 128 | #print("Energy of OIA: ", round(self.energy_OIA, 0)) 129 | self.total_OIA.append(self.energy_OIA) 130 | #print("===========================================\n") 131 | # =================================================================================================== 132 | 133 | 134 | else: 135 | self.total_qoe -= P 136 | self.error_counter += 1 137 | try: 138 | [B_, D_] = self.sfc_requests.pop(0) 139 | except IndexError: 140 | break 141 | end = time.time() 142 | self.time = round((end-start), 2) 143 | 144 | def get_mean_qoe(self): 145 | return self.total_qoe / env.num_requests 146 | 147 | def get_error_rate(self): 148 | return self.error_counter / env.num_requests 149 | 150 | def get_mean_energy_OIA(self): 151 | return sum(self.total_OIA) / env.num_requests 152 | 153 | def get_max_energy_OIA(self): 154 | return max(self.total_OIA) 155 | 156 | 157 | if __name__ == '__main__': 158 | sfc = BruteSFC() 159 | sfc.select() 160 | 161 | print('Period: {:g}s '.format(sfc.time)) 162 | 163 | print('Mean QoE:', sfc.get_mean_qoe()) 164 | print('Error Rate:', sfc.get_error_rate()) 165 | print("Mean Energy of OIA: ", round(sfc.get_mean_energy_OIA(), 0)) 166 | print("Max Energy of OIA: ", round(sfc.get_max_energy_OIA(), 0)) 167 | -------------------------------------------------------------------------------- /ckpt/checkpoint: -------------------------------------------------------------------------------- 1 | model_checkpoint_path: "dqn.ckpt" 2 | all_model_checkpoint_paths: "dqn.ckpt" 3 | -------------------------------------------------------------------------------- /ckpt/dqn.ckpt.data-00000-of-00001: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirtox/An-efficient-VNF-deployment-scheme-for-service-function-chain-using-deep-Q-network/37cbc4dfbbf6cd1d1c8c2447ce3801859853e170/ckpt/dqn.ckpt.data-00000-of-00001 -------------------------------------------------------------------------------- /ckpt/dqn.ckpt.index: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirtox/An-efficient-VNF-deployment-scheme-for-service-function-chain-using-deep-Q-network/37cbc4dfbbf6cd1d1c8c2447ce3801859853e170/ckpt/dqn.ckpt.index -------------------------------------------------------------------------------- /ckpt/dqn.ckpt.meta: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirtox/An-efficient-VNF-deployment-scheme-for-service-function-chain-using-deep-Q-network/37cbc4dfbbf6cd1d1c8c2447ce3801859853e170/ckpt/dqn.ckpt.meta -------------------------------------------------------------------------------- /ckpt_QQ/checkpoint: -------------------------------------------------------------------------------- 1 | model_checkpoint_path: "dqn.ckpt" 2 | all_model_checkpoint_paths: "dqn.ckpt" 3 | -------------------------------------------------------------------------------- /ckpt_QQ/dqn.ckpt.data-00000-of-00001: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirtox/An-efficient-VNF-deployment-scheme-for-service-function-chain-using-deep-Q-network/37cbc4dfbbf6cd1d1c8c2447ce3801859853e170/ckpt_QQ/dqn.ckpt.data-00000-of-00001 -------------------------------------------------------------------------------- /ckpt_QQ/dqn.ckpt.index: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirtox/An-efficient-VNF-deployment-scheme-for-service-function-chain-using-deep-Q-network/37cbc4dfbbf6cd1d1c8c2447ce3801859853e170/ckpt_QQ/dqn.ckpt.index -------------------------------------------------------------------------------- /ckpt_QQ/dqn.ckpt.meta: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirtox/An-efficient-VNF-deployment-scheme-for-service-function-chain-using-deep-Q-network/37cbc4dfbbf6cd1d1c8c2447ce3801859853e170/ckpt_QQ/dqn.ckpt.meta -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | class VNFGroupConfig: 5 | def get_initialized_bandwidth(self): 6 | return np.array( 7 | [[[1261, 1035, 1074, 1243], 8 | [1243, 1246, 832, 1223], 9 | [1041, 1011, 1181, 891], 10 | [1272, 1074, 1119, 1044], 11 | [1105, 1069, 908, 1181]], 12 | 13 | [[1114, 925, 958, 1013], 14 | [1099, 824, 895, 1135], 15 | [1076, 1256, 768, 801], 16 | [1280, 910, 1140, 856], 17 | [1187, 1054, 774, 1222]], 18 | 19 | [[1090, 1136, 1208, 889], 20 | [823, 1130, 1187, 1254], 21 | [1182, 1257, 1183, 964], 22 | [1164, 904, 1090, 1179], 23 | [866, 982, 976, 1219]], 24 | 25 | [[1078, 1178, 1104, 789], 26 | [1188, 1039, 867, 970], 27 | [907, 1065, 1142, 870], 28 | [1071, 841, 972, 1052], 29 | [931, 1176, 986, 863]], 30 | 31 | [[890, 920, 858, 836], 32 | [799, 867, 1278, 910], 33 | [948, 842, 1037, 1146], 34 | [827, 833, 1126, 843], 35 | [1102, 1041, 1069, 814]]]) 36 | 37 | def get_initialized_delay(self): 38 | return np.array( 39 | [[[18, 10, 18, 16], 40 | [10, 14, 15, 17], 41 | [11, 10, 14, 15], 42 | [16, 17, 14, 14], 43 | [14, 14, 12, 10]], 44 | 45 | [[20, 10, 15, 14], 46 | [20, 11, 14, 19], 47 | [13, 18, 12, 19], 48 | [18, 14, 10, 14], 49 | [17, 11, 16, 18]], 50 | 51 | [[19, 17, 10, 19], 52 | [18, 10, 14, 13], 53 | [20, 10, 12, 19], 54 | [17, 12, 15, 20], 55 | [11, 11, 16, 11]], 56 | 57 | [[15, 13, 18, 16], 58 | [13, 11, 20, 12], 59 | [12, 13, 11, 17], 60 | [13, 11, 11, 12], 61 | [18, 16, 16, 13]], 62 | 63 | [[15, 15, 17, 16], 64 | [15, 13, 19, 17], 65 | [17, 10, 10, 13], 66 | [17, 15, 18, 13], 67 | [19, 19, 12, 10]]]) 68 | 69 | 70 | # energy consumption of each VNF 71 | """ 72 | def get_initialized_vnf(self): 73 | return np.array( 74 | np.random.randint(15,21,size=5)) 75 | """ 76 | def get_initialized_vnf(self): 77 | return np.array( 78 | [16, 20, 17, 15, 17]) 79 | 80 | 81 | # IDLE energy consumption of each VNF 82 | #ex: vnf0: ACTIVE->16, so IDLE = (16/340)*(340*60%) = 4.8(J) 83 | """ 84 | def get_initialized_IDLEvnf(self, vnf, idle_energy): 85 | return np.array( 86 | vnf*idle_energy) 87 | """ 88 | def get_initialized_IDLEvnf(self, idle_energy): 89 | return np.array( 90 | [16*idle_energy, 20*idle_energy, 17*idle_energy, 15*idle_energy, 17*idle_energy]) 91 | 92 | 93 | # flag of each node (ACTIVE: 2, IDLE: 1, OFF: 0) 94 | def get_initialized_state(self): 95 | return np.array( 96 | ['OFF', 'OFF', 'OFF', 'OFF', 'OFF'], dtype=' -2 => -1, then turn OFF 20 | self.max_idle_time = -3 21 | 22 | # 60% of utilization 100% 23 | self.idle_energy = 0.6 24 | 25 | # sum of energy 26 | self.OIA_energy = 0 27 | 28 | 29 | def reset(self): 30 | self.OIA_energy = 0 31 | 32 | 33 | def update(self, used_nodes, state, idletime, vnf_collection, capaVNFs): 34 | # OIA 35 | 36 | # State change 37 | for i in range(self.number_of_nodes): 38 | # at IDLE state at present 39 | if state[i] == 'IDLE': 40 | # after 3 rounds, IDLE -> OFF 41 | if idletime[i] == 0: 42 | state[i] = 'OFF' 43 | capaVNFs[i] = [0, 0, 0, 0, 0] 44 | else: 45 | idletime[i] += 1 46 | if idletime[i] == 0: 47 | state[i] = 'OFF' 48 | capaVNFs[i] = [0, 0, 0, 0, 0] 49 | 50 | # at ACTIVE state 51 | # node is not used and is ACTIVE at present 52 | if i not in used_nodes and state[i] == 'ACTIVE': 53 | state[i] = 'IDLE' 54 | idletime[i] = self.max_idle_time 55 | 56 | 57 | # OFF -> ACTIVE or IDLE -> ACTIVE => These nodes is using. 58 | for node, vnf in zip(used_nodes, vnf_collection): 59 | state[node] = 'ACTIVE' 60 | idletime[node] = 1 61 | 62 | # release VNFs 63 | #if capaVNFs[node][vnf] > 4: 64 | # print("Capacity out of maximum capacity") 65 | 66 | if capaVNFs[node][vnf] == 4: 67 | #print(":::Warning: CapaVNF[{},{}] is full:::".format(str(node), str(vnf))) 68 | capaVNFs[node][vnf] = 0 69 | #print(":::Clean: CapaVNF[{},{}] is empty:::".format(str(node), str(vnf))) 70 | 71 | # VNF add 72 | capaVNFs[node][vnf] += 1 73 | 74 | #print("=============== Updated ===============") 75 | 76 | 77 | # evaluation of OIA energy 78 | def energy_OIA_mode(self, used_nodes, E_vnf, E_IDLEvnf, state, vnf_collection, capaVNFs): 79 | for node in range(self.number_of_nodes): 80 | if state[node] == 'OFF': 81 | continue 82 | elif state[node] == 'IDLE': 83 | # 4*(16+20+17+15+17) = 340 (Maximum energy consumption of each nodes) 84 | #self.OIA_energy_withType += self.idle_energy*self.max_energy_of_each_node_withType 85 | self.OIA_energy += np.dot(capaVNFs[node], E_IDLEvnf) 86 | #for vnf in range(self.number_of_vnfs): 87 | # self.OIA_energy += capaVNFs[node][vnf]*E_IDLEvnf[vnf] 88 | elif state[node] == 'ACTIVE': 89 | self.OIA_energy += np.dot(capaVNFs[node], E_vnf) 90 | #for vnf in range(self.number_of_vnfs): 91 | # self.OIA_energy += capaVNFs[node][vnf]*E_vnf[vnf] 92 | return self.OIA_energy 93 | 94 | 95 | if __name__ == '__main__': 96 | energy = Energy() 97 | # Energy consumption of each type of VNFs 98 | E_vnf = group_config.get_initialized_vnf() 99 | 100 | # IDLE Energy consumption of each type of VNFs 101 | E_IDLEvnf = group_config.get_initialized_IDLEvnf(energy.idle_energy) 102 | #E_IDLEvnf = group_config.get_initialized_IDLEvnf(E_vnf, energy.idle_energy) 103 | 104 | # state: ACTIVE, IDLE, OFF 105 | state = group_config.get_initialized_state() 106 | 107 | # There are five nodes. Each node have 5 type of VNFs and the number of each type is 4. 108 | capaVNFs = group_config.get_initialized_capaVNFs() 109 | 110 | # IDLE time of each node 111 | idletime = group_config.get_initialized_idletime() 112 | 113 | 114 | 115 | vnf_collection = [0,1,2,3,4] 116 | """ 117 | used_nodes = [[4,2,3,1,2], [3,3,3,3,3], [2,3,1,1,3], [0,3,3,2,3], [1,4,3,1,3], 118 | [4,3,3,1,2], [1,3,3,1,3], [4,1,3,1,3], [3,3,3,1,2], [3,1,3,1,3], 119 | [1,3,3,1,3], [1,3,3,1,1], [1,3,0,1,3], [0,4,2,0,1], [4,4,3,3,2], 120 | [4,4,3,3,1], [0,2,4,1,2], [4,3,2,3,1], [1,1,4,1,1], [1,1,1,1,1]] 121 | """ 122 | used_nodes = [[4,2,3,1,2], [3,3,3,3,3], [3,3,3,3,3], [3,3,3,3,3], [3,3,3,3,3]] 123 | #used_nodes = [[4,4,3,3,1], [0,2,4,1,2], [4,3,2,3,1]] 124 | #print("Input: ", used_nodes) 125 | for i in range(5): 126 | print("===============Round", i, "start===============") 127 | print("VNF No.: 0 1 2 3 4") 128 | print("Used nodes: ", used_nodes[i]) 129 | energy.update(used_nodes[i], state, idletime, vnf_collection, capaVNFs) 130 | print("State: ", state) 131 | print("Energy of each VNF: ", E_vnf) 132 | print("IDLE Energy of each VNF: ", E_IDLEvnf) 133 | print("\nAllocate_of_eachVNF:") 134 | print("VNF:") 135 | print(" 0 1 2 3 4") 136 | print(capaVNFs) 137 | print("IDLE time countdown: ", idletime) 138 | #if i != 0 and i % 10 == 0: 139 | # energy3.release_capacity(capacity) 140 | # print("=====Release success=====") 141 | print("\nEnergy consumption:") 142 | print(" OIA: {:>12g}".format(round(energy.energy_OIA_mode(used_nodes, E_vnf, E_IDLEvnf, state, vnf_collection, capaVNFs), 0))) 143 | 144 | print("===============Round ", i, "end===============") 145 | print("\n") 146 | 147 | #print("State: ", energy3.state) 148 | #print("Allocate: ", energy3.capacity) 149 | #print("IDLE time countdown: ", energy3.idletime) 150 | ##print("OIA: ", energy3.energy_OIA_mode(E, state, idletime, capacity)) 151 | 152 | -------------------------------------------------------------------------------- /env.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import numpy as np 3 | from config import VNFGroupConfig 4 | from energy import Energy 5 | 6 | group_config = VNFGroupConfig() 7 | energy = Energy() 8 | 9 | P = 10.0 10 | 11 | 12 | class VNFGroup: 13 | def __init__(self): 14 | self.B = None # B: 可用頻寬,10-20G 15 | self.D = None # D: link延遲,10-20ms 16 | self.S = None # B, B_, D, D_, Dc, action_index 17 | self.E = None # E: energy consumption of each node 18 | self.E_vnf = None # E_vnf: energy consumption of each type of VNFs 19 | self.E_IDLEvnf = None # E_IDLEvnf: IDLE energy consumption of each type of VNFs 20 | self.state = None 21 | self.capacity = None 22 | self.idletime = None 23 | 24 | self.num_requests = 100 # 一次episode訓練接受的sfc請求數 25 | self.B_min = 16 # 所需頻寬範圍最小值,單位MB 26 | self.B_max = 256 # 所需頻寬範圍最大值,單位MB 27 | self.D_min = 50 # 最大延遲約束最小值,單位ms,>40ms 28 | self.D_max = 90 # 最大延遲約束最大值,單位ms 29 | self.E_min = 300 30 | self.E_max = 400 31 | 32 | 33 | self.sfc_requests = None 34 | self.sfc_requests_energy = None 35 | self.running_sfc = np.ndarray([0, 6], dtype=np.int32) # [[B_,1,4,3,2,0]] 36 | self.c = [] 37 | self.d_sum = 0.0 38 | 39 | self.counter = 0.0 40 | 41 | self.vnf_id_collection = [] 42 | 43 | # energy 44 | self.energy_OIA = 0 45 | self.norm_energy = 0 46 | 47 | self.total_qoe = 0.0 48 | 49 | def reset(self, use_sfc_requests=None): 50 | energy.reset() 51 | self.__init__() 52 | self.B = group_config.get_initialized_bandwidth() 53 | self.D = group_config.get_initialized_delay() 54 | 55 | # Energy of each type of VNFs 56 | self.E_vnf = group_config.get_initialized_vnf() 57 | 58 | # IDLE Energy of each type of VNFs 59 | self.E_IDLEvnf = group_config.get_initialized_IDLEvnf(energy.idle_energy) 60 | 61 | # ACTIVE, IDLE, OFF 62 | self.state = group_config.get_initialized_state() 63 | 64 | # Number of each type of VNFs on each node 65 | self.capaVNFs = group_config.get_initialized_capaVNFs() 66 | 67 | # IDLE time of each node 68 | self.idletime = group_config.get_initialized_idletime() 69 | 70 | self.vnf_id_collection = [] 71 | 72 | self.energy_OIA = 0 73 | 74 | self.S = None 75 | if use_sfc_requests: 76 | self.sfc_requests = use_sfc_requests 77 | else: 78 | self.sfc_requests = [[np.random.randint(self.B_min, self.B_max+1), 79 | np.random.randint(self.D_min, self.D_max+1)] for _ in range(self.num_requests)] 80 | #self.sfc_requests_energy = [np.random.randint(self.E_min, self.E_max+1) for _ in range(self.num_requests)] 81 | 82 | def start(self, B_, D_): 83 | self.B_ = B_ 84 | self.D_ = D_ 85 | self.c = [] 86 | self.d_sum = 0.0 87 | self.random_release_sfc() 88 | self.S = np.concatenate([self.B, # 0-3 89 | np.ones([5, 5, 1])*self.B_, # 4 90 | self.D, # 5-8 91 | np.ones([5, 5, 1])*self.D_, # 9 92 | np.ones([5, 5, 1])*self.d_sum, # 10 93 | np.ones((5, 5, 1)), # 11 94 | np.zeros([5, 5, 1]), # 12 95 | np.zeros([5, 5, 1]), # 13 96 | np.zeros([5, 5, 1]), # 14 97 | np.zeros([5, 5, 1])], axis=2) # 15 98 | return self.S 99 | 100 | def random_release_sfc(self, thresh=0.2): 101 | prob = np.array([np.random.random() for _ in range(self.running_sfc.shape[0])]) 102 | released_sfc = self.running_sfc[prob <= thresh] 103 | self.running_sfc = self.running_sfc[prob > thresh] 104 | for c in released_sfc: 105 | for i in range(4): 106 | self.B[c[i+2], c[i+1], i] += c[0] 107 | 108 | 109 | def allocate_bandwidth(self, c, B_): 110 | for i in range(4): 111 | self.B[c[i+1], c[i], i] -= B_ 112 | 113 | def step(self, action): 114 | vnf_id = np.argmax([self.S[..., 11][0, 0], 115 | self.S[..., 12][0, 0], 116 | self.S[..., 13][0, 0], 117 | self.S[..., 14][0, 0], 118 | self.S[..., 15][0, 0]]) 119 | #print("vnf_id: ", vnf_id) 120 | if vnf_id == 0: 121 | self.vnf_id_collection = [] 122 | self.c.append(action) 123 | print("Placement: ", self.c) 124 | self.S = np.concatenate([self.B, # 0-3 125 | np.ones([5, 5, 1])*self.B_, # 4 126 | self.D, # 5-8 127 | np.ones([5, 5, 1])*self.D_, # 9 128 | np.ones([5, 5, 1])*self.d_sum, # 10 129 | np.zeros((5, 5, 1)), # 11 130 | np.ones([5, 5, 1]), # 12 131 | np.zeros([5, 5, 1]), # 13 132 | np.zeros([5, 5, 1]), # 14 133 | np.zeros([5, 5, 1])], axis=2) # 15 134 | reward = 0 135 | done = False 136 | self.vnf_id_collection.append(vnf_id) 137 | info = {'id': 0, 'msg': 'SUCCESS: Choose node {} from VNF{}.'.format(action, vnf_id)} 138 | print("INFO: ", info) 139 | return self.S, reward, done, info 140 | elif vnf_id in (1, 2, 3): 141 | if self.B[action, self.c[-1], vnf_id-1] < self.B_: 142 | self.S = np.concatenate([self.B, # 0-3 143 | np.ones([5, 5, 1])*self.B_, # 4 144 | self.D, # 5-8 145 | np.ones([5, 5, 1])*self.D_, # 9 146 | np.ones([5, 5, 1])*self.d_sum, # 10 147 | np.zeros((5, 5, 1)), # 11 148 | np.zeros([5, 5, 1]), # 12 149 | np.zeros([5, 5, 1]), # 13 150 | np.zeros([5, 5, 1]), # 14 151 | np.zeros([5, 5, 1])], axis=2) # 15 152 | reward = -P 153 | done = True 154 | self.vnf_id_collection = [] 155 | info = {'id': 1, 'msg': 'FAIL: Bandwidth not enough.'} 156 | print("INFO: ", info, "\n") 157 | self.total_qoe += reward 158 | return self.S, reward, done, info 159 | 160 | self.d_sum += self.D[action, self.c[-1], vnf_id-1] 161 | if self.d_sum > self.D_: 162 | self.S = np.concatenate([self.B, # 0-3 163 | np.ones([5, 5, 1])*self.B_, # 4 164 | self.D, # 5-8 165 | np.ones([5, 5, 1])*self.D_, # 9 166 | np.ones([5, 5, 1])*self.d_sum, # 10 167 | np.zeros((5, 5, 1)), # 11 168 | np.zeros([5, 5, 1]), # 12 169 | np.zeros([5, 5, 1]), # 13 170 | np.zeros([5, 5, 1]), # 14 171 | np.zeros([5, 5, 1])], axis=2) # 15 172 | reward = -P 173 | done = True 174 | self.vnf_id_collection = [] 175 | info = {'id': 2, 'msg': 'FAIL: Delay over constraint'} 176 | print("INFO: ", info, "\n") 177 | self.total_qoe += reward 178 | return self.S, reward, done, info 179 | 180 | self.c.append(action) 181 | print("Placement: ", self.c) 182 | self.S = np.concatenate([self.B, # 0-3 183 | np.ones([5, 5, 1])*self.B_, # 4 184 | self.D, # 5-8 185 | np.ones([5, 5, 1])*self.D_, # 9 186 | np.ones([5, 5, 1])*self.d_sum, # 10 187 | np.zeros((5, 5, 1)), # 11 188 | np.zeros([5, 5, 1]), # 12 189 | np.zeros([5, 5, 1]), # 13 190 | np.zeros([5, 5, 1]), # 14 191 | np.zeros([5, 5, 1])], axis=2) # 15 192 | self.S[..., 12+vnf_id] = np.ones([5, 5]) 193 | reward = 0 194 | done = False 195 | self.vnf_id_collection.append(vnf_id) 196 | info = {'id': 0, 'msg': 'SUCCESS: Choose node {} from VNF{}.'.format(action, vnf_id)} 197 | print("INFO: ", info) 198 | return self.S, reward, done, info 199 | else: 200 | if self.B[action, self.c[-1], vnf_id-1] < self.B_: 201 | self.S = np.concatenate([self.B, # 0-3 202 | np.ones([5, 5, 1])*self.B_, # 4 203 | self.D, # 5-8 204 | np.ones([5, 5, 1])*self.D_, # 9 205 | np.ones([5, 5, 1])*self.d_sum, # 10 206 | np.zeros((5, 5, 1)), # 11 207 | np.zeros([5, 5, 1]), # 12 208 | np.zeros([5, 5, 1]), # 13 209 | np.zeros([5, 5, 1]), # 14 210 | np.zeros([5, 5, 1])], axis=2) # 15 211 | reward = -P 212 | done = True 213 | self.vnf_id_collection = [] 214 | info = {'id': 1, 'msg': 'FAIL: Bandwidth not enough.'} 215 | print("INFO: ", info, "\n") 216 | self.total_qoe += reward 217 | return self.S, reward, done, info 218 | 219 | self.d_sum += self.D[action, self.c[-1], vnf_id-1] 220 | if self.d_sum > self.D_: 221 | self.S = np.concatenate([self.B, # 0-3 222 | np.ones([5, 5, 1])*self.B_, # 4 223 | self.D, # 5-8 224 | np.ones([5, 5, 1])*self.D_, # 9 225 | np.ones([5, 5, 1])*self.d_sum, # 10 226 | np.zeros((5, 5, 1)), # 11 227 | np.zeros([5, 5, 1]), # 12 228 | np.zeros([5, 5, 1]), # 13 229 | np.zeros([5, 5, 1]), # 14 230 | np.zeros([5, 5, 1])], axis=2) # 15 231 | reward = -P 232 | done = True 233 | self.vnf_id_collection = [] 234 | info = {'id': 2, 'msg': 'FAIL: Delay over constraint'} 235 | print("INFO: ", info, "\n") 236 | self.total_qoe += reward 237 | return self.S, reward, done, info 238 | 239 | self.c.append(action) 240 | print("Placement: ", self.c) 241 | 242 | # 添加到待釋放SFC列表 243 | sfc = [self.B_] 244 | sfc += self.c 245 | self.running_sfc = np.concatenate([self.running_sfc, np.array([sfc])], axis=0) 246 | # 分配頻寬資源 247 | self.allocate_bandwidth(self.c, self.B_) 248 | 249 | 250 | self.S = np.concatenate([self.B, # 0-3 251 | np.ones([5, 5, 1])*self.B_, # 4 252 | self.D, # 5-8 253 | np.ones([5, 5, 1])*self.D_, # 9 254 | np.ones([5, 5, 1])*self.d_sum, # 10 255 | np.zeros((5, 5, 1)), # 11 256 | np.zeros([5, 5, 1]), # 12 257 | np.zeros([5, 5, 1]), # 13 258 | np.zeros([5, 5, 1]), # 14 259 | np.zeros([5, 5, 1])], axis=2) # 15 260 | 261 | self.vnf_id_collection.append(vnf_id) 262 | info = {'id': 0, 'msg': 'SUCCESS: Choose node {} from VNF{}. Complete a SFC request.'.format(action, vnf_id)} 263 | print("INFO: ", info) 264 | 265 | # Energy 266 | # =================================================================================================== 267 | print("===========================================") 268 | # Energy evaluation 269 | print("VNF No.: ", self.vnf_id_collection) 270 | print("Placement of VNFs: ", self.c) 271 | energy.update(self.c, self.state, self.idletime, self.vnf_id_collection, self.capaVNFs) 272 | print("State: ", self.state) 273 | #print("Energy of each VNF: ", self.E_vnf) 274 | #print("IDLE Energy of each VNF: ", self.E_IDLEvnf) 275 | print("\nAllocate_of_eachVNF:") 276 | print("VNF:") 277 | print(" 0 1 2 3 4") 278 | print(self.capaVNFs) 279 | print("IDLE time countdown: ", self.idletime) 280 | self.energy_OIA = energy.energy_OIA_mode(self.c, self.E_vnf, self.E_IDLEvnf, 281 | self.state, self.vnf_id_collection, self.capaVNFs) 282 | print("Energy of OIA: ", round(self.energy_OIA, 0)) 283 | print("===========================================\n") 284 | 285 | self.norm_energy = (self.energy_OIA-self.E_min)/(self.E_max-self.E_min) 286 | # =================================================================================================== 287 | 288 | # Test 289 | #with open('log_exp.txt', 'a') as f: 290 | # f.write('{0}, {1}, {2}, {3}, {4}, {5}, {6}\n'.format( 291 | # self.B_, self.D_, self.d_sum, self.norm_energy, 292 | # np.log(self.B_), np.exp(-(self.D_-self.d_sum)), np.exp(-self.norm_energy)) 293 | # ) 294 | 295 | reward = np.log(self.B_) - P*(np.exp(-(self.D_-self.d_sum)/10.0)+ np.exp(-self.energy_OIA)) 296 | 297 | qoe = np.log(self.B_) - P*np.exp(-(self.D_-self.d_sum)/10.0) 298 | done = True 299 | self.total_qoe += qoe 300 | 301 | return self.S, reward, done, info 302 | 303 | def get_mean_qoe(self): 304 | return self.total_qoe / self.num_requests 305 | 306 | if __name__ == '__main__': 307 | env = VNFGroup() 308 | env.reset() 309 | print(env.sfc_requests) 310 | #print(env.B[2,4,:]) 311 | 312 | #tt = [4,3,2,1,0] 313 | #for item in tt: 314 | # env.flag[item] = 2 315 | # env.capacity[item] -= 1 316 | #print(env.flag) 317 | #print(env.capacity) 318 | -------------------------------------------------------------------------------- /env_QQ.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import numpy as np 3 | from config import VNFGroupConfig 4 | from energy import Energy 5 | 6 | group_config = VNFGroupConfig() 7 | energy = Energy() 8 | 9 | P = 10.0 10 | 11 | 12 | class VNFGroup_QQ: 13 | def __init__(self): 14 | self.B = None # B: 可用頻寬,10-20G 15 | self.D = None # D: link延遲,10-20ms 16 | self.S = None # B, B_, D, D_, Dc, action_index 17 | self.E = None # E: energy consumption of each node 18 | self.E_vnf = None # E_vnf: energy consumption of each type of VNFs 19 | self.E_IDLEvnf = None # E_IDLEvnf: IDLE energy consumption of each type of VNFs 20 | self.state = None 21 | self.capacity = None 22 | self.idletime = None 23 | 24 | self.num_requests = 100 # 一次episode訓練接受的sfc請求數 25 | self.B_min = 16 # 所需頻寬範圍最小值,單位MB 26 | self.B_max = 256 # 所需頻寬範圍最大值,單位MB 27 | self.D_min = 50 # 最大延遲約束最小值,單位ms,>40ms 28 | self.D_max = 90 # 最大延遲約束最大值,單位ms 29 | #self.E_min = 300 30 | #self.E_max = 400 31 | 32 | 33 | self.sfc_requests = None 34 | self.sfc_requests_energy = None 35 | self.running_sfc = np.ndarray([0, 6], dtype=np.int32) # [[B_,1,4,3,2,0]] 36 | self.c = [] 37 | self.d_sum = 0.0 38 | 39 | self.counter = 0.0 40 | 41 | self.vnf_id_collection = [] 42 | 43 | # energy 44 | self.energy_OIA = 0 45 | 46 | self.total_qoe = 0.0 47 | 48 | def reset(self, use_sfc_requests=None): 49 | energy.reset() 50 | self.__init__() 51 | self.B = group_config.get_initialized_bandwidth() 52 | self.D = group_config.get_initialized_delay() 53 | 54 | # Energy of each type of VNFs 55 | self.E_vnf = group_config.get_initialized_vnf() 56 | 57 | # IDLE Energy of each type of VNFs 58 | self.E_IDLEvnf = group_config.get_initialized_IDLEvnf(energy.idle_energy) 59 | 60 | # ACTIVE, IDLE, OFF 61 | self.state = group_config.get_initialized_state() 62 | 63 | # Number of each type of VNFs on each node 64 | self.capaVNFs = group_config.get_initialized_capaVNFs() 65 | 66 | # IDLE time of each node 67 | self.idletime = group_config.get_initialized_idletime() 68 | 69 | self.vnf_id_collection = [] 70 | 71 | self.energy_OIA = 0 72 | 73 | self.S = None 74 | if use_sfc_requests: 75 | self.sfc_requests = use_sfc_requests 76 | else: 77 | self.sfc_requests = [[np.random.randint(self.B_min, self.B_max+1), 78 | np.random.randint(self.D_min, self.D_max+1)] for _ in range(self.num_requests)] 79 | #self.sfc_requests_energy = [np.random.randint(self.E_min, self.E_max+1) for _ in range(self.num_requests)] 80 | 81 | def start(self, B_, D_): 82 | self.B_ = B_ 83 | self.D_ = D_ 84 | self.c = [] 85 | self.d_sum = 0.0 86 | self.random_release_sfc() 87 | self.S = np.concatenate([self.B, # 0-3 88 | np.ones([5, 5, 1])*self.B_, # 4 89 | self.D, # 5-8 90 | np.ones([5, 5, 1])*self.D_, # 9 91 | np.ones([5, 5, 1])*self.d_sum, # 10 92 | np.ones((5, 5, 1)), # 11 93 | np.zeros([5, 5, 1]), # 12 94 | np.zeros([5, 5, 1]), # 13 95 | np.zeros([5, 5, 1]), # 14 96 | np.zeros([5, 5, 1])], axis=2) # 15 97 | return self.S 98 | 99 | def random_release_sfc(self, thresh=0.2): 100 | prob = np.array([np.random.random() for _ in range(self.running_sfc.shape[0])]) 101 | released_sfc = self.running_sfc[prob <= thresh] 102 | self.running_sfc = self.running_sfc[prob > thresh] 103 | for c in released_sfc: 104 | for i in range(4): 105 | self.B[c[i+2], c[i+1], i] += c[0] 106 | 107 | 108 | def allocate_bandwidth(self, c, B_): 109 | for i in range(4): 110 | self.B[c[i+1], c[i], i] -= B_ 111 | 112 | def step(self, action): 113 | vnf_id = np.argmax([self.S[..., 11][0, 0], 114 | self.S[..., 12][0, 0], 115 | self.S[..., 13][0, 0], 116 | self.S[..., 14][0, 0], 117 | self.S[..., 15][0, 0]]) 118 | #print("vnf_id: ", vnf_id) 119 | if vnf_id == 0: 120 | self.vnf_id_collection = [] 121 | self.c.append(action) 122 | print("CCCCC1: ", self.c) 123 | self.S = np.concatenate([self.B, # 0-3 124 | np.ones([5, 5, 1])*self.B_, # 4 125 | self.D, # 5-8 126 | np.ones([5, 5, 1])*self.D_, # 9 127 | np.ones([5, 5, 1])*self.d_sum, # 10 128 | np.zeros((5, 5, 1)), # 11 129 | np.ones([5, 5, 1]), # 12 130 | np.zeros([5, 5, 1]), # 13 131 | np.zeros([5, 5, 1]), # 14 132 | np.zeros([5, 5, 1])], axis=2) # 15 133 | reward = 0 134 | done = False 135 | self.vnf_id_collection.append(vnf_id) 136 | info = {'id': 0, 'msg': 'SUCCESS: Choose node {} from VNF{}.'.format(action, vnf_id)} 137 | print("INFO: ", info) 138 | return self.S, reward, done, info 139 | elif vnf_id in (1, 2, 3): 140 | if self.B[action, self.c[-1], vnf_id-1] < self.B_: 141 | self.S = np.concatenate([self.B, # 0-3 142 | np.ones([5, 5, 1])*self.B_, # 4 143 | self.D, # 5-8 144 | np.ones([5, 5, 1])*self.D_, # 9 145 | np.ones([5, 5, 1])*self.d_sum, # 10 146 | np.zeros((5, 5, 1)), # 11 147 | np.zeros([5, 5, 1]), # 12 148 | np.zeros([5, 5, 1]), # 13 149 | np.zeros([5, 5, 1]), # 14 150 | np.zeros([5, 5, 1])], axis=2) # 15 151 | reward = -P 152 | done = True 153 | self.vnf_id_collection = [] 154 | info = {'id': 1, 'msg': 'FAIL: Bandwidth not enough.'} 155 | print("INFO: ", info, "\n") 156 | self.total_qoe += reward 157 | return self.S, reward, done, info 158 | 159 | self.d_sum += self.D[action, self.c[-1], vnf_id-1] 160 | if self.d_sum > self.D_: 161 | self.S = np.concatenate([self.B, # 0-3 162 | np.ones([5, 5, 1])*self.B_, # 4 163 | self.D, # 5-8 164 | np.ones([5, 5, 1])*self.D_, # 9 165 | np.ones([5, 5, 1])*self.d_sum, # 10 166 | np.zeros((5, 5, 1)), # 11 167 | np.zeros([5, 5, 1]), # 12 168 | np.zeros([5, 5, 1]), # 13 169 | np.zeros([5, 5, 1]), # 14 170 | np.zeros([5, 5, 1])], axis=2) # 15 171 | reward = -P 172 | done = True 173 | self.vnf_id_collection = [] 174 | info = {'id': 2, 'msg': 'FAIL: Delay over constraint'} 175 | print("INFO: ", info, "\n") 176 | self.total_qoe += reward 177 | return self.S, reward, done, info 178 | 179 | self.c.append(action) 180 | print("CCCCC123: ", self.c) 181 | self.S = np.concatenate([self.B, # 0-3 182 | np.ones([5, 5, 1])*self.B_, # 4 183 | self.D, # 5-8 184 | np.ones([5, 5, 1])*self.D_, # 9 185 | np.ones([5, 5, 1])*self.d_sum, # 10 186 | np.zeros((5, 5, 1)), # 11 187 | np.zeros([5, 5, 1]), # 12 188 | np.zeros([5, 5, 1]), # 13 189 | np.zeros([5, 5, 1]), # 14 190 | np.zeros([5, 5, 1])], axis=2) # 15 191 | self.S[..., 12+vnf_id] = np.ones([5, 5]) 192 | reward = 0 193 | done = False 194 | self.vnf_id_collection.append(vnf_id) 195 | info = {'id': 0, 'msg': 'SUCCESS: Choose node {} from VNF{}.'.format(action, vnf_id)} 196 | print("INFO: ", info) 197 | return self.S, reward, done, info 198 | else: 199 | if self.B[action, self.c[-1], vnf_id-1] < self.B_: 200 | self.S = np.concatenate([self.B, # 0-3 201 | np.ones([5, 5, 1])*self.B_, # 4 202 | self.D, # 5-8 203 | np.ones([5, 5, 1])*self.D_, # 9 204 | np.ones([5, 5, 1])*self.d_sum, # 10 205 | np.zeros((5, 5, 1)), # 11 206 | np.zeros([5, 5, 1]), # 12 207 | np.zeros([5, 5, 1]), # 13 208 | np.zeros([5, 5, 1]), # 14 209 | np.zeros([5, 5, 1])], axis=2) # 15 210 | reward = -P 211 | done = True 212 | self.vnf_id_collection = [] 213 | info = {'id': 1, 'msg': 'FAIL: Bandwidth not enough.'} 214 | print("INFO: ", info, "\n") 215 | self.total_qoe += reward 216 | return self.S, reward, done, info 217 | 218 | self.d_sum += self.D[action, self.c[-1], vnf_id-1] 219 | if self.d_sum > self.D_: 220 | self.S = np.concatenate([self.B, # 0-3 221 | np.ones([5, 5, 1])*self.B_, # 4 222 | self.D, # 5-8 223 | np.ones([5, 5, 1])*self.D_, # 9 224 | np.ones([5, 5, 1])*self.d_sum, # 10 225 | np.zeros((5, 5, 1)), # 11 226 | np.zeros([5, 5, 1]), # 12 227 | np.zeros([5, 5, 1]), # 13 228 | np.zeros([5, 5, 1]), # 14 229 | np.zeros([5, 5, 1])], axis=2) # 15 230 | reward = -P 231 | done = True 232 | self.vnf_id_collection = [] 233 | info = {'id': 2, 'msg': 'FAIL: Delay over constraint'} 234 | print("INFO: ", info, "\n") 235 | self.total_qoe += reward 236 | return self.S, reward, done, info 237 | 238 | self.c.append(action) 239 | print("CCCCC4: ", self.c) 240 | 241 | # 添加到待釋放SFC列表 242 | sfc = [self.B_] 243 | sfc += self.c 244 | self.running_sfc = np.concatenate([self.running_sfc, np.array([sfc])], axis=0) 245 | # 分配頻寬資源 246 | self.allocate_bandwidth(self.c, self.B_) 247 | 248 | 249 | self.S = np.concatenate([self.B, # 0-3 250 | np.ones([5, 5, 1])*self.B_, # 4 251 | self.D, # 5-8 252 | np.ones([5, 5, 1])*self.D_, # 9 253 | np.ones([5, 5, 1])*self.d_sum, # 10 254 | np.zeros((5, 5, 1)), # 11 255 | np.zeros([5, 5, 1]), # 12 256 | np.zeros([5, 5, 1]), # 13 257 | np.zeros([5, 5, 1]), # 14 258 | np.zeros([5, 5, 1])], axis=2) # 15 259 | reward = np.log(self.B_) - P*np.exp(-(self.D_-self.d_sum)/10.0) 260 | done = True 261 | self.vnf_id_collection.append(vnf_id) 262 | info = {'id': 0, 'msg': 'SUCCESS: Choose node {} from VNF{}. Complete a SFC request.'.format(action, vnf_id)} 263 | print("INFO: ", info) 264 | 265 | self.total_qoe += reward 266 | 267 | # Energy 268 | # =================================================================================================== 269 | print("===========================================") 270 | # Energy evaluation 271 | print("VNF No.: ", self.vnf_id_collection) 272 | print("Placement of VNFs: ", self.c) 273 | energy.update(self.c, self.state, self.idletime, self.vnf_id_collection, self.capaVNFs) 274 | print("State: ", self.state) 275 | #print("Energy of each VNF: ", self.E_vnf) 276 | #print("IDLE Energy of each VNF: ", self.E_IDLEvnf) 277 | print("\nAllocate_of_eachVNF:") 278 | print("VNF:") 279 | print(" 0 1 2 3 4") 280 | print(self.capaVNFs) 281 | print("IDLE time countdown: ", self.idletime) 282 | self.energy_OIA = energy.energy_OIA_mode(self.c, self.E_vnf, self.E_IDLEvnf, 283 | self.state, self.vnf_id_collection, self.capaVNFs) 284 | print("Energy of OIA: ", round(self.energy_OIA, 0)) 285 | print("===========================================\n") 286 | # =================================================================================================== 287 | 288 | return self.S, reward, done, info 289 | 290 | def get_mean_qoe(self): 291 | return self.total_qoe / self.num_requests 292 | 293 | if __name__ == '__main__': 294 | env = VNFGroup_QQ() 295 | env.reset() 296 | print(env.sfc_requests) 297 | #print(env.B[2,4,:]) 298 | 299 | #tt = [4,3,2,1,0] 300 | #for item in tt: 301 | # env.flag[item] = 2 302 | # env.capacity[item] -= 1 303 | #print(env.flag) 304 | #print(env.capacity) 305 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | tf.compat.v1.reset_default_graph() 3 | 4 | import os 5 | os.environ["CUDA_VISIBLE_DEVICES"] = '1' 6 | os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' 7 | 8 | import time 9 | from env import VNFGroup 10 | from dqn import DQN 11 | from random_sfc import RandomSFC 12 | from brute_sfc_qoe import BruteSFC_QoE 13 | from brute_sfc_energy import BruteSFC_Energy 14 | 15 | import warnings 16 | warnings.filterwarnings("ignore") 17 | 18 | if __name__ == '__main__': 19 | env = VNFGroup() 20 | agent = DQN() 21 | agent.load() 22 | random_sfc = RandomSFC() 23 | brute_sfc_qoe = BruteSFC_QoE() 24 | brute_sfc_energy = BruteSFC_Energy() 25 | 26 | # 12/19 如果1000 iters還是不好 試試看把agent.load()放在33行 27 | times = 1000 28 | 29 | #while True: 30 | for iteration in range(times): 31 | #agent.load() 32 | print("========================== QQE Iteration {} ==========================".format(iteration)) 33 | 34 | env.reset() 35 | random_sfc.reset() 36 | brute_sfc_qoe.reset() 37 | brute_sfc_energy.reset() 38 | 39 | # Random 40 | # =================================================================================================== 41 | print("=============== Random Start ===============") 42 | random_sfc.set_sfc_requests(env.sfc_requests[:]) 43 | random_sfc.select() 44 | print("=============== Random End ===============") 45 | # =================================================================================================== 46 | 47 | # BruteForce for qoe 48 | # =================================================================================================== 49 | print("=============== BruteForce_QoE Start ===============") 50 | brute_sfc_qoe.set_sfc_requests(env.sfc_requests[:]) 51 | brute_sfc_qoe.select() 52 | print("=============== BruteForce_QoE End ===============") 53 | # =================================================================================================== 54 | 55 | # BruteForce for energy 56 | # =================================================================================================== 57 | print("=============== BruteForce_Energy Start ===============") 58 | brute_sfc_energy.set_sfc_requests(env.sfc_requests[:]) 59 | brute_sfc_energy.select() 60 | print("=============== BruteForce_Energy End ===============") 61 | # =================================================================================================== 62 | 63 | 64 | # DQN eval 65 | #sfc_requests_energy = env.sfc_requests_energy 66 | 67 | #print("\n\nsfc_requests_energy: \n", sfc_requests_energy) 68 | start = time.time() 69 | sfc_requests = env.sfc_requests[:] 70 | print("\n\nsfc_requests: \n", sfc_requests) 71 | tmp_src_sfc = sfc_requests.copy() 72 | 73 | #print("SFC: ", sfc_requests) 74 | 75 | dqn_error = 0.0 76 | [B_, D_] = sfc_requests.pop(0) 77 | #E_ = sfc_requests_energy.pop(0) 78 | 79 | print("B_, D_: ", [B_, D_]) 80 | #print("E_: ", E_) 81 | 82 | total_OIA = [] 83 | 84 | 85 | while True: 86 | txt = [] 87 | 88 | observation = env.start(B_, D_) 89 | #state_S = env.S.copy() 90 | for n in range(5): 91 | #print("n_id: ", n) 92 | action = agent.choose_action(observation, larger_greedy=1.0) 93 | observation_, reward, done, info = env.step(action) 94 | 95 | #print("INFO: ", info) 96 | 97 | if info['id']: dqn_error += 1 98 | if done: break 99 | observation = observation_ 100 | 101 | total_OIA.append(round(env.energy_OIA, 0)) 102 | 103 | try: 104 | [B_, D_] = sfc_requests.pop(0) 105 | #E_ = sfc_requests_energy.pop(0) 106 | 107 | print("B_, D_: ", [B_, D_]) 108 | #print("E_: ", E_) 109 | #print("TRY") 110 | #print("B_, D_: ", [B_, D_]) 111 | except IndexError: 112 | break 113 | end = time.time() 114 | 115 | print("Period: {:g}s".format(round((end-start), 2))) 116 | 117 | #sum_all_ACTIVE = total_all_ACTIVE[-1] 118 | #sum_OIA = total_OIA[-1] 119 | mean_OIA = sum(total_OIA)/env.num_requests 120 | max_OIA = max(total_OIA) 121 | 122 | # output format 123 | # =================================================================================================== 124 | # qoe : random=>0 , brute_qoe=>5 , brute_energy=>10 ,QQE=>15 125 | # error : random=>1 , brute_qoe=>6 , brute_energy=>11 ,QQE=>16 126 | # mean energy: random=>2 , brute_qoe=>7 , brute_energy=>12 ,QQE=>17 127 | # max energy : random=>3 , brute_qoe=>8 , brute_energy=>13 ,QQE=>18 128 | # time : random=>4 , brute_qoe=>9 , brute_energy=>14 ,QQE=>19 129 | # =================================================================================================== 130 | 131 | with open('output.txt', 'a') as f: 132 | f.write('{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}\n'.format( 133 | random_sfc.get_mean_qoe(), random_sfc.get_error_rate(), 134 | random_sfc.get_mean_energy_OIA(), random_sfc.get_max_energy_OIA(), 135 | random_sfc.time, 136 | brute_sfc_qoe.get_mean_qoe(), brute_sfc_qoe.get_error_rate(), 137 | brute_sfc_qoe.get_mean_energy_OIA(), brute_sfc_qoe.get_max_energy_OIA(), 138 | brute_sfc_qoe.time, 139 | brute_sfc_energy.get_mean_qoe(), brute_sfc_energy.get_error_rate(), 140 | brute_sfc_energy.get_mean_energy_OIA(), brute_sfc_energy.get_max_energy_OIA(), 141 | brute_sfc_energy.time, 142 | env.get_mean_qoe(), dqn_error/env.num_requests, 143 | mean_OIA, max_OIA, 144 | round((end-start), 2)) 145 | ) 146 | 147 | #print(env.B) 148 | 149 | # DQN train 150 | print("=======================DQN train=======================") 151 | sfc_requests = env.sfc_requests[:] 152 | env.reset(use_sfc_requests=sfc_requests) 153 | [B_, D_] = sfc_requests.pop(0) 154 | #print("Train B_, D_: ", [B_, D_]) 155 | while True: 156 | observation = env.start(B_, D_) 157 | for n in range(5): 158 | #print("Train_n: ", n) 159 | action = agent.choose_action(observation) 160 | observation_, reward, done, info = env.step(action) 161 | agent.store_transition(observation, action, reward, observation_) 162 | #print("INFO: ", info) 163 | if info['id']: dqn_error += 1 164 | if done: break 165 | observation = observation_ 166 | agent.learn() 167 | try: 168 | [B_, D_] = sfc_requests.pop(0) 169 | #print("Train B_, D_: ", [B_, D_]) 170 | except IndexError: 171 | break 172 | 173 | agent.save() 174 | 175 | -------------------------------------------------------------------------------- /main_QQ.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | tf.compat.v1.reset_default_graph() 3 | 4 | #import os 5 | #os.environ["CUDA_VISIBLE_DEVICES"] = '1' 6 | #os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' 7 | 8 | import time 9 | from env_QQ import VNFGroup_QQ 10 | from dqn_QQ import DQN_QQ 11 | 12 | import warnings 13 | warnings.filterwarnings("ignore") 14 | 15 | if __name__ == '__main__': 16 | env_QQ = VNFGroup_QQ() 17 | agent_QQ = DQN_QQ() 18 | agent_QQ.load() 19 | 20 | times = 1000 21 | 22 | for iteration in range(times): 23 | #print("========================== QQ Iteration {} ==========================".format(iteration)) 24 | 25 | env_QQ.reset() 26 | 27 | # DQN eval 28 | #sfc_requests_energy = env_QQ.sfc_requests_energy 29 | 30 | #print("\n\nsfc_requests_energy: \n", sfc_requests_energy) 31 | 32 | start = time.time() 33 | sfc_requests = env_QQ.sfc_requests[:] 34 | print("\n\nsfc_requests: \n", sfc_requests) 35 | 36 | #print("SFC: ", sfc_requests) 37 | 38 | dqn_error = 0.0 39 | [B_, D_] = sfc_requests.pop(0) 40 | #E_ = sfc_requests_energy.pop(0) 41 | 42 | print("B_, D_: ", [B_, D_]) 43 | #print("E_: ", E_) 44 | 45 | total_OIA = [] 46 | 47 | while True: 48 | 49 | observation = env_QQ.start(B_, D_) 50 | #state_S = env_QQ.S.copy() 51 | for n in range(5): 52 | #print("n_id: ", n) 53 | action = agent_QQ.choose_action(observation, larger_greedy=1.0) 54 | observation_, reward, done, info = env_QQ.step(action) 55 | 56 | #print("INFO: ", info) 57 | 58 | if info['id']: dqn_error += 1 59 | if done: break 60 | observation = observation_ 61 | #energy_all_ACTIVE = env_QQ.energy_all_ACTIVE 62 | #energy_OIA = env_QQ.energy_OIA 63 | total_OIA.append(round(env_QQ.energy_OIA, 2)) 64 | 65 | try: 66 | [B_, D_] = sfc_requests.pop(0) 67 | #E_ = sfc_requests_energy.pop(0) 68 | 69 | print("B_, D_: ", [B_, D_]) 70 | except IndexError: 71 | break 72 | 73 | end = time.time() 74 | processing_time = round((end-start), 2) 75 | 76 | # Processing time 77 | print("Period: {:g}s".format(processing_time)) 78 | 79 | # Energy assign 80 | mean_energy_OIA = sum(total_OIA)/env_QQ.num_requests 81 | max_energy_OIA = max(total_OIA) 82 | 83 | # QoE & Error rate 84 | total_qoe = env_QQ.get_mean_qoe() 85 | error_rate = dqn_error/env_QQ.num_requests 86 | 87 | # output_QQ format 88 | # =================================================================================================== 89 | # qoe : dqn=>0 90 | # error : dqn=>1 91 | # mean energy: dqn=>2 92 | # max energy : dqn=>3 93 | # time : dqn=>4 94 | # =================================================================================================== 95 | 96 | with open('output_QQ.txt', 'a') as f: 97 | f.write('{0}, {1}, {2}, {3}, {4}\n'.format( 98 | total_qoe, error_rate, 99 | mean_energy_OIA, max_energy_OIA, processing_time) 100 | ) 101 | 102 | #print(env_QQ.B) 103 | 104 | # DQN train 105 | print("=======================DQN train=======================") 106 | sfc_requests = env_QQ.sfc_requests[:] 107 | env_QQ.reset(use_sfc_requests=sfc_requests) 108 | [B_, D_] = sfc_requests.pop(0) 109 | #print("Train B_, D_: ", [B_, D_]) 110 | while True: 111 | observation = env_QQ.start(B_, D_) 112 | for n in range(5): 113 | #print("Train_n: ", n) 114 | action = agent_QQ.choose_action(observation) 115 | observation_, reward, done, info = env_QQ.step(action) 116 | agent_QQ.store_transition(observation, action, reward, observation_) 117 | #print("INFO: ", info) 118 | if info['id']: dqn_error += 1 119 | if done: break 120 | observation = observation_ 121 | agent_QQ.learn() 122 | try: 123 | [B_, D_] = sfc_requests.pop(0) 124 | #print("Train B_, D_: ", [B_, D_]) 125 | except IndexError: 126 | break 127 | 128 | agent_QQ.save() 129 | 130 | -------------------------------------------------------------------------------- /output_QQ.txt: -------------------------------------------------------------------------------- 1 | -2.2484932194367127, 0.32, 7004.0, 14450, 3.1 2 | 1.8304710944986962, 0.07, 9749.5, 19635, 0.55 3 | -2.3552175976233793, 0.27, 7992.005999999997, 15789.6, 0.53 4 | -1.757447224952898, 0.26, 9034.024, 18631.0, 0.53 5 | -1.7675740146760532, 0.26, 10053.657999999998, 20951.0, 0.53 6 | -0.23936301749999106, 0.13, 11447.121999999996, 23110.4, 0.54 7 | -2.324205338085694, 0.33, 12406.990000000002, 25710.6, 0.52 8 | 0.5158654965070298, 0.13, 17166.339999999993, 36480.4, 0.54 9 | 1.1917291664086387, 0.08, 16606.764000000003, 33143.0, 0.55 10 | 0.7904270639282523, 0.1, 16935.064000000002, 33274.0, 0.56 11 | 1.0871879324967226, 0.09, 15195.009999999995, 31517.4, 0.55 12 | 1.8739119207457586, 0.01, 14780.820000000002, 30395.0, 0.55 13 | -1.647368700351309, 0.29, 13795.80000000001, 27837.8, 0.52 14 | -0.07086342672554904, 0.22, 9274.52, 19329, 0.53 15 | 0.3551912931926822, 0.19, 8993.85, 17085, 0.5 16 | 1.0096077513515598, 0.14, 10212.84, 20592.0, 0.51 17 | 0.6608521983121284, 0.17, 9659.4, 17510, 0.5 18 | 1.9681686459523708, 0.06, 9852.35, 19805, 0.53 19 | 1.5590202189124147, 0.09, 9304.95, 19210, 0.53 20 | 0.9996822703425421, 0.14, 9642.82399999999, 20183.6, 0.52 21 | 1.8831758999865746, 0.1, 9911.009999999993, 19287.6, 0.53 22 | 1.2742670449613436, 0.15, 11638.52, 21263, 0.5 23 | 1.524633193307511, 0.11, 11287.96, 22625, 0.52 24 | 1.8181708609604814, 0.08, 10405.948, 20612.4, 0.54 25 | 1.0956397583702624, 0.12, 9066.95, 18700, 0.52 26 | 1.1254854693424754, 0.1, 11631.06, 22423, 0.54 27 | 2.021006705171216, 0.07, 9941.6, 19635, 0.53 28 | 0.39213824177746076, 0.19, 8973.45, 17085, 0.52 29 | -0.6416388803892016, 0.23, 14399.386, 29357.4, 0.53 30 | 2.475139469655465, 0.06, 9752.9, 19805, 0.53 31 | 1.9611386302311564, 0.09, 11942.12, 22922, 0.53 32 | 1.7230694979512027, 0.08, 11390.33, 23326, 0.53 33 | 1.0342800083251797, 0.13, 9539.55, 18360, 0.52 34 | 0.7756247885296311, 0.17, 9534.45, 17510, 0.5 35 | 1.727571974042971, 0.09, 11991.11, 24218.0, 0.54 36 | 1.666595898133288, 0.12, 10071.94, 21452, 0.53 37 | 1.8808140584915696, 0.09, 9920.35, 19210, 0.52 38 | 1.8524806044581306, 0.08, 10308.594, 20698.8, 0.52 39 | 1.073844281573039, 0.14, 10972.86, 21625, 0.52 40 | 1.339469962798691, 0.09, 10558.74, 20378.0, 0.53 41 | 0.43124045716594417, 0.19, 9198.32799999999, 17846.6, 0.5 42 | 0.9834197871664364, 0.11, 9582.9, 18785, 0.51 43 | 1.9850440484033345, 0.06, 11781.43, 23709, 0.53 44 | 1.324668642261638, 0.13, 9492.17, 19950.0, 0.52 45 | -0.15468329278349097, 0.17, 8758.4, 17510, 0.5 46 | 1.721016002286185, 0.11, 13522.14, 26945, 0.51 47 | 2.017153775102057, 0.08, 10344.37, 20618.0, 0.53 48 | 1.9433736992083184, 0.11, 9202.95, 18785, 0.52 49 | 1.3416535514158427, 0.12, 9332.15, 18700, 0.52 50 | 1.2482826122579203, 0.13, 8974.3, 18360, 0.51 51 | 1.964018518506958, 0.07, 10166.73, 21555, 0.53 52 | 1.955166493923114, 0.09, 9472.4, 19210, 0.53 53 | 0.990658205249234, 0.15, 8990.45, 17935, 0.52 54 | 1.0929943390109265, 0.11, 9512.35, 18785, 0.52 55 | 0.8979883806144804, 0.1, 9760.55, 18955, 0.52 56 | 1.9783848166973472, 0.08, 9637.3, 19550, 0.53 57 | 1.4583415349410738, 0.12, 9519.15, 18700, 0.51 58 | 2.3619120661801243, 0.04, 10248.45, 20400, 0.54 59 | 1.6530020054015042, 0.11, 9265.0, 18785, 0.52 60 | 2.1305389549981886, 0.04, 9943.3, 20400, 0.54 61 | 1.3534143111517534, 0.1, 11725.93, 22491.0, 0.54 62 | -1.0573563174985285, 0.22, 11089.854, 21797.4, 0.53 63 | -0.44061434393866067, 0.21, 9646.22, 19833.0, 0.52 64 | -1.8998944505823758, 0.28, 7727.2139999999945, 15296.6, 0.53 65 | 1.4180287247329024, 0.08, 11171.38, 23018, 0.53 66 | 2.359802774863958, 0.05, 10156.65, 20060, 0.54 67 | -0.08798289535750697, 0.16, 11380.48, 21114, 0.52 68 | 0.5311917785510929, 0.15, 9121.35, 17935, 0.51 69 | 0.35409416260452176, 0.16, 9626.912, 19802.0, 0.52 70 | 1.6314084646084688, 0.1, 11222.26, 21475.0, 0.52 71 | 1.546043657740651, 0.1, 10466.77, 20509.0, 0.52 72 | 2.23500879600625, 0.06, 10214.154000000004, 19833.8, 0.53 73 | 0.5648784970013353, 0.17, 9536.1, 18982, 0.5 74 | 2.6662257469079207, 0.03, 11436.04, 23509.0, 0.55 75 | 2.1947405381531, 0.05, 10523.59, 21014.0, 0.54 76 | 2.430322241252758, 0.06, 10039.35, 19805, 0.53 77 | 2.5181302387793125, 0.06, 11302.59, 22529.0, 0.54 78 | 2.052919937660449, 0.1, 9732.794, 20094.2, 0.52 79 | 1.597462282117802, 0.1, 9848.1, 18955, 0.53 80 | 1.0729543615474617, 0.12, 9953.29, 21052.0, 0.51 81 | 1.835299995458721, 0.09, 11358.72, 22882, 0.52 82 | 1.798183694136521, 0.09, 12279.024, 24702.4, 0.53 83 | 1.5776506386078535, 0.12, 9842.15, 18700, 0.52 84 | 0.6485489690263236, 0.19, 9353.4, 17085, 0.5 85 | 0.6902581831640023, 0.13, 14320.576000000003, 28979.2, 0.55 86 | 1.2781475667552404, 0.1, 9964.72, 19839, 0.52 87 | 1.8997605849831163, 0.08, 11174.649999999992, 23574.4, 0.54 88 | 1.357651370634117, 0.12, 11903.111999999988, 23576.4, 0.53 89 | 1.5429087398956347, 0.12, 11535.172000000002, 22973.6, 0.52 90 | 1.9025670314233167, 0.09, 10742.475999999997, 21377.2, 0.53 91 | 1.2606221201837842, 0.13, 10998.65, 21624, 0.52 92 | 1.712589826043116, 0.1, 11582.037999999995, 24962.2, 0.52 93 | 1.1729136823489972, 0.13, 10954.12400000001, 22664.8, 0.51 94 | 1.209729395346536, 0.13, 10424.86, 20689.6, 0.52 95 | 1.677007163884017, 0.1, 10860.919999999991, 22038.6, 0.53 96 | 1.255900877753128, 0.13, 11037.419999999993, 22291.2, 0.52 97 | 0.4806147577707083, 0.08, 11524.648000000003, 23538.8, 0.53 98 | 0.3378519212763831, 0.16, 9591.4, 17850, 0.51 99 | 1.1578210044107804, 0.14, 9124.75, 18105, 0.56 100 | 1.0187823612325173, 0.16, 10997.244000000004, 22396.0, 0.58 101 | 2.173092250032928, 0.06, 12949.393999999998, 25543.4, 0.53 102 | 0.9231862244854109, 0.14, 11257.018000000004, 23308.0, 0.52 103 | 1.9597943147188053, 0.1, 10187.872, 21050.2, 0.52 104 | 0.9837626710196158, 0.13, 10559.851999999997, 21679.2, 0.52 105 | 0.500384074193934, 0.18, 10296.336, 22160.2, 0.51 106 | 1.0266836069554908, 0.1, 13571.43799999999, 26939.2, 0.54 107 | 1.5586694156203458, 0.07, 9952.44, 19803.0, 0.53 108 | 1.7630086309844508, 0.07, 13429.757999999987, 28075.4, 0.54 109 | 1.434587613942945, 0.15, 11286.376000000004, 22243.0, 0.52 110 | 1.9154022084341298, 0.1, 11575.913999999995, 24190.2, 0.52 111 | 0.860846613433006, 0.18, 10605.108000000002, 21621.4, 0.5 112 | 0.9198637101814768, 0.18, 10242.093999999997, 21272.8, 0.5 113 | 0.6535539885926113, 0.15, 9942.508000000002, 21556.6, 0.51 114 | 2.126963167136042, 0.09, 12068.941999999997, 24946.4, 0.54 115 | 2.418482316616092, 0.05, 11213.833999999997, 23156.4, 0.55 116 | 1.9729815081829658, 0.06, 13179.94, 26693.4, 0.53 117 | -0.3645872061283529, 0.25, 9975.438000000002, 20137.6, 0.49 118 | 1.6542196679732353, 0.1, 10854.3, 23784.0, 0.53 119 | 0.6402248161397871, 0.16, 8504.25, 17850, 0.52 120 | 2.4003467904359526, 0.07, 12010.42, 25947, 0.54 121 | 1.0351535758780273, 0.15, 10979.439999999995, 21941.4, 0.52 122 | 1.5493763798427431, 0.06, 12040.35, 23733.0, 0.54 123 | -2.1103523661257326, 0.34, 9127.498000000007, 17470.8, 0.51 124 | -3.5170152674697306, 0.4, 6242.4, 12750, 0.52 125 | 0.4989820357455641, 0.09, 10947.35, 23258.4, 0.55 126 | -1.6952287851017016, 0.28, 10306.161999999995, 20716.4, 0.53 127 | 1.1718816207865659, 0.13, 9416.3, 18360, 0.52 128 | 1.6855956454703942, 0.09, 10055.14, 20224.0, 0.53 129 | 1.8637647208074675, 0.08, 11131.913999999999, 23295.6, 0.54 130 | 1.4653768339804583, 0.15, 10148.940000000002, 20419.0, 0.51 131 | 1.4218824691428333, 0.11, 10011.02, 21188.0, 0.53 132 | 1.0306256014690802, 0.12, 12584.244000000006, 25237.6, 0.52 133 | 2.3413128835612738, 0.02, 11437.634000000002, 23493.0, 0.56 134 | 1.0141872163872956, 0.12, 10534.233999999991, 21654.8, 0.52 135 | 0.9325318975384999, 0.13, 12247.722000000002, 23545.0, 0.51 136 | 1.745514580330826, 0.12, 13190.845999999994, 27217.2, 0.52 137 | -0.08271094465292343, 0.24, 9222.625999999997, 19681.4, 0.48 138 | 2.4424119380679943, 0.01, 13398.152000000004, 27837.2, 0.55 139 | 1.0947307454037167, 0.06, 12275.124000000002, 24255.4, 0.54 140 | 1.357565072939715, 0.06, 12873.539999999988, 26051.8, 0.55 141 | 1.96022062677542, 0.11, 11703.241999999997, 23437.4, 0.52 142 | 1.5950167701744165, 0.07, 12431.152, 23830.0, 0.53 143 | -0.4572341335283926, 0.21, 9466.96, 19244, 0.53 144 | 0.9407568393043113, 0.17, 11767.705999999995, 24807.2, 0.51 145 | 2.1077092761232366, 0.08, 12066.794000000002, 24352.0, 0.54 146 | 2.225100454694011, 0.08, 11552.642000000002, 25028.0, 0.53 147 | 1.3300682038626508, 0.06, 11204.417999999987, 23686.2, 0.54 148 | 1.403375119468488, 0.07, 11382.46, 25095.0, 0.55 149 | 1.304579807966465, 0.13, 10035.987999999994, 22106.4, 0.52 150 | 1.6630726157520928, 0.08, 12064.658000000005, 23598.8, 0.54 151 | 1.153621152303406, 0.1, 11138.746, 23600.0, 0.53 152 | 2.2223900016516867, 0.08, 12433.848000000004, 24253.8, 0.53 153 | 0.985354518457617, 0.13, 10905.407999999996, 21946.8, 0.52 154 | 2.2601591339658818, 0.07, 11552.576000000001, 25615.0, 0.54 155 | 2.0582094767449464, 0.05, 12541.812000000002, 24704.0, 0.54 156 | 1.247454272837885, 0.11, 10771.366000000002, 21171.0, 0.54 157 | 0.8540284816412012, 0.13, 11791.114000000003, 23519.6, 0.53 158 | 1.6951575338495888, 0.07, 11840.30400000001, 23628.6, 0.53 159 | 1.1399095087681879, 0.1, 15257.019999999997, 31440.6, 0.54 160 | 2.209064797134464, 0.0, 16043.175999999996, 33762.0, 0.56 161 | 1.4883247730270721, 0.12, 11228.506000000001, 21701.2, 0.52 162 | 2.4110035458118597, 0.01, 15875.891999999994, 31717.0, 0.55 163 | 2.1506151786565857, 0.07, 12897.817999999996, 25108.6, 0.54 164 | 1.5525000096677746, 0.03, 18238.474, 37760.8, 0.55 165 | -0.14871686079627178, 0.23, 10673.3, 23384.8, 0.52 166 | 2.608555600672472, 0.01, 16062.199999999995, 32782.8, 0.57 167 | -0.11664876808411946, 0.15, 11522.570000000005, 24786.8, 0.54 168 | -0.1428513202968056, 0.19, 9761.032000000003, 20464.4, 0.52 169 | 0.6140588189745767, 0.16, 10722.45199999999, 23229.2, 0.52 170 | 1.428041360664941, 0.1, 13449.106000000007, 27953.4, 0.54 171 | -0.05058314221037934, 0.16, 12421.359999999991, 26971.2, 0.53 172 | -0.5349762999833818, 0.2, 10782.202, 21488.2, 0.52 173 | -0.48389876907543167, 0.2, 8941.694000000005, 18849.6, 0.53 174 | -0.391283485784739, 0.2, 10901.379999999997, 21449.6, 0.53 175 | 1.784483477729721, 0.06, 10346.2, 19805, 0.54 176 | -0.5690204983014386, 0.14, 13923.972000000009, 29599.8, 0.54 177 | 1.046894031056638, 0.13, 14416.274, 30758.2, 0.52 178 | -0.01529837402069111, 0.14, 9932.374000000003, 20852.4, 0.54 179 | -0.4567412734280868, 0.22, 13344.010000000007, 23815.4, 0.51 180 | 0.8633177990809693, 0.14, 9312.702000000012, 18165.8, 0.52 181 | 1.530402149985455, 0.09, 15027.024000000007, 28984.8, 0.52 182 | -0.07149802312025645, 0.16, 10641.004, 23004.8, 0.53 183 | 2.46398253004736, 0.04, 13447.690000000002, 26814.6, 0.54 184 | 0.07087753051362915, 0.16, 14621.450000000017, 30478.8, 0.53 185 | 2.239570134430319, 0.03, 13899.914, 28363.0, 0.55 186 | 0.8806122117432383, 0.08, 11418.237999999998, 23554.0, 0.54 187 | 0.3288199723801133, 0.09, 11145.52, 21587.6, 0.54 188 | 0.9493074323204964, 0.09, 12342.248, 25105.0, 0.53 189 | 1.6997396424786573, 0.08, 13894.807999999997, 28744.8, 0.54 190 | 1.604583121613967, 0.11, 9756.3, 18785, 0.52 191 | 1.162374590451927, 0.1, 12216.161999999993, 24647.4, 0.52 192 | 1.1575125916162132, 0.08, 13594.460000000005, 29739.6, 0.53 193 | 2.993819227715181, 0.0, 17326.507999999994, 35230.8, 0.56 194 | 1.1721572506875841, 0.07, 11479.13, 23155, 0.55 195 | 1.423569376911687, 0.08, 13298.668000000005, 25704.8, 0.53 196 | 1.7803272678618802, 0.05, 15378.666000000001, 32313.0, 0.56 197 | 1.560431091636261, 0.06, 11502.420000000006, 22819.4, 0.54 198 | -0.7601995697087532, 0.18, 11205.035999999998, 23321.2, 0.53 199 | -0.43396078362600066, 0.18, 10698.592000000006, 22481.4, 0.52 200 | -0.20910513091187596, 0.17, 10241.933999999987, 20298.2, 0.53 201 | -0.794212261203502, 0.23, 10011.962000000007, 21395.0, 0.51 202 | 0.41899144525895304, 0.12, 13332.057999999992, 27818.4, 0.53 203 | 0.07667029127167309, 0.17, 12562.287999999991, 26332.4, 0.54 204 | 2.1900625966782004, 0.07, 11231.645999999992, 22458.6, 0.53 205 | 1.592340166764145, 0.11, 12342.774000000003, 24673.0, 0.53 206 | -0.9850942051261768, 0.22, 16306.070000000002, 30923.8, 0.54 207 | 1.2791621662168295, 0.12, 12606.034000000003, 26468.6, 0.52 208 | 1.1675939697773134, 0.14, 10489.362000000006, 18799.4, 0.51 209 | 0.19800855613941448, 0.16, 12558.114, 25714.4, 0.54 210 | 2.0369600045807235, 0.04, 19864.584, 41036.4, 0.55 211 | 0.0027492960467872594, 0.15, 16636.22599999999, 33844.4, 0.55 212 | 0.49622944931473784, 0.11, 13854.120000000003, 26882.6, 0.54 213 | -1.046090975056648, 0.26, 12160.798, 24545.4, 0.53 214 | 1.7356680119608248, 0.08, 11501.524, 23620.2, 0.53 215 | 1.3786196920292506, 0.14, 11040.462000000005, 21900.6, 0.51 216 | -2.594500585203314, 0.32, 7709.48, 15956.0, 0.52 217 | -0.36964798324839654, 0.15, 11922.207999999999, 23704.8, 0.53 218 | 1.4065984991792901, 0.09, 14970.085999999994, 30258.0, 0.54 219 | -1.0341871729283676, 0.25, 10796.351999999988, 21602.0, 0.52 220 | 2.025482145585047, 0.07, 10852.784000000003, 21843.0, 0.53 221 | -3.2350526357657934, 0.4, 7857.256000000007, 17068.4, 0.52 222 | 0.5708857478259894, 0.12, 15072.133999999998, 29701.8, 0.53 223 | -1.4073954137838351, 0.25, 10453.216, 21459.6, 0.53 224 | -1.2878505663784676, 0.24, 10320.15, 21030.0, 0.53 225 | -0.3768927462156342, 0.2, 17312.809999999998, 34582.4, 0.54 226 | -0.7296178883303703, 0.22, 13153.226000000006, 26337.8, 0.53 227 | 0.31617797647625884, 0.19, 12703.428000000004, 23630.8, 0.52 228 | 1.2282328974612355, 0.13, 9077.798000000006, 18718.4, 0.52 229 | -0.9353802396944542, 0.25, 11313.383999999998, 21939.6, 0.53 230 | 1.789740197686685, 0.09, 11482.381999999989, 22229.4, 0.53 231 | -1.9315323499866834, 0.26, 10502.130000000003, 21113.6, 0.53 232 | -2.367231407306695, 0.33, 6907.6440000000075, 14713.4, 0.53 233 | 0.7473001128442875, 0.13, 14546.931999999999, 26732.6, 0.53 234 | -1.2127924460840154, 0.28, 11224.874, 22808.4, 0.51 235 | -0.2599617484345908, 0.12, 15927.704000000003, 32898.2, 0.55 236 | -0.3872501984873309, 0.17, 12547.374, 24863.8, 0.52 237 | 1.5631601204869074, 0.1, 9709.55, 18955, 0.53 238 | -3.559744968057922, 0.41, 8402.488000000005, 16224.8, 0.51 239 | -0.010782822142172233, 0.2, 9366.072000000006, 19724.8, 0.53 240 | -0.8983083614670682, 0.17, 14693.259999999998, 31001.2, 0.54 241 | -1.87815482450837, 0.25, 9434.17, 17722.0, 0.53 242 | -2.129266669497138, 0.31, 9378.29, 19837.6, 0.52 243 | 1.3009229598438787, 0.11, 9636.928000000009, 18845.8, 0.52 244 | -3.7207797910679568, 0.43, 6692.866000000002, 12236.6, 0.51 245 | -0.4969337040974187, 0.22, 13761.968000000003, 27643.0, 0.52 246 | -2.2579296944014358, 0.33, 7970.072000000002, 15954.4, 0.52 247 | -0.026963779169708508, 0.15, 13352.979999999998, 29112.8, 0.54 248 | -1.6138345797196851, 0.24, 15676.24, 30400.8, 0.53 249 | -2.0613856834432864, 0.28, 10186.87, 22039.0, 0.52 250 | 0.769095854713755, 0.1, 14112.445999999996, 29274.2, 0.56 251 | -0.352108017963743, 0.2, 15089.793999999994, 28176.4, 0.51 252 | -0.42659522203267813, 0.19, 13400.382, 27002.0, 0.53 253 | -0.08038055191371475, 0.18, 10693.264000000001, 22339.8, 0.54 254 | -1.8505868891036195, 0.31, 11242.608000000002, 22445.4, 0.53 255 | -1.8295957401909169, 0.19, 13363.584000000006, 25769.2, 0.54 256 | -1.6378184797105877, 0.26, 9823.731999999998, 20759.0, 0.53 257 | -5.505703995867517, 0.5, 5590.9580000000005, 10634.2, 0.51 258 | -4.09967397862967, 0.44, 6567.48, 13052, 0.5 259 | -3.0079261846738445, 0.35, 8014.72, 18101.0, 0.52 260 | -4.831821996465339, 0.52, 7051.662000000002, 14324.0, 0.5 261 | -3.3788253745538683, 0.39, 9421.428, 19050.2, 0.51 262 | -3.5104896407984443, 0.39, 6904.622000000003, 13799.8, 0.51 263 | -4.148125128168291, 0.43, 7227.84, 15121, 0.5 264 | -4.418628100747051, 0.48, 5999.990000000002, 12679.0, 0.51 265 | -0.9070580090278678, 0.24, 10700.126000000004, 21314.0, 0.52 266 | -5.955869405621339, 0.57, 6572.598000000002, 12722.0, 0.49 267 | -4.381480093779498, 0.47, 5480.8, 11135, 0.51 268 | -4.133434286515104, 0.42, 7248.83, 13819, 0.51 269 | -4.728151380000294, 0.46, 7068.890000000001, 13698.6, 0.51 270 | -5.32506209916834, 0.51, 5449.79, 11437, 0.5 271 | -4.619293289928097, 0.47, 5813.15, 11135, 0.51 272 | -2.4108376257605437, 0.36, 8041.995999999997, 18303.2, 0.53 273 | -4.027644844919658, 0.48, 5262.35, 11050, 0.51 274 | -3.7634150176440717, 0.42, 6764.191999999997, 15300.6, 0.52 275 | -4.887738329449905, 0.53, 5886.1060000000025, 12621.6, 0.5 276 | -5.1742147409272805, 0.49, 5426.382000000003, 11529.2, 0.49 277 | -5.391886778818361, 0.56, 5115.690000000002, 9836.4, 0.5 278 | -4.331528161740858, 0.46, 5415.58, 11417.0, 0.51 279 | -4.084938062794758, 0.41, 7220.07, 15354, 0.51 280 | -5.149769443965766, 0.52, 5221.8, 10920, 0.5 281 | -4.918922492588532, 0.47, 5604.05, 11135, 0.5 282 | -4.185537676023294, 0.44, 6759.6640000000025, 13935.2, 0.51 283 | -4.446622223656599, 0.45, 6748.8, 13224, 0.5 284 | -4.148506926730264, 0.45, 5958.5, 11560, 0.5 285 | -4.8068155844781515, 0.52, 4993.988000000001, 11336.0, 0.51 286 | -4.245487849577073, 0.41, 7347.6239999999925, 15060.6, 0.52 287 | -2.320562124661421, 0.33, 9947.244, 20339.2, 0.52 288 | -6.885172528498538, 0.7, 3672.5120000000024, 8153.2, 0.47 289 | -4.881079641820897, 0.5, 5324.847999999995, 10528.6, 0.5 290 | -4.990472461726145, 0.57, 4964.78, 10258.0, 0.48 291 | -4.065654445451022, 0.45, 6823.37, 13800, 0.52 292 | -3.6090266805710773, 0.43, 7210.01, 14225, 0.51 293 | -3.0824445935044076, 0.38, 7593.43, 15437, 0.51 294 | -5.590538582970851, 0.57, 3965.25, 9010, 0.49 295 | -3.889207571880554, 0.45, 6075.8, 11560, 0.51 296 | -6.665923006979296, 0.69, 3086.65, 7580, 0.46 297 | -6.757150552826747, 0.66, 3764.412000000002, 8041.0, 0.47 298 | -5.883359000154563, 0.59, 5393.323999999999, 10508.2, 0.48 299 | -3.9200237612844484, 0.45, 5974.65, 11560, 0.51 300 | -2.3261123547844886, 0.3, 7362.7, 14705, 0.5 301 | -5.407655918021426, 0.53, 4820.35, 9860, 0.5 302 | -3.6397183484135662, 0.43, 6188.21, 13157.0, 0.51 303 | -7.929778566255017, 0.77, 2268.65, 4760, 0.46 304 | -4.7673107070634675, 0.49, 5804.65, 10710, 0.49 305 | -5.304786089931011, 0.57, 4788.9, 9010, 0.5 306 | -4.86225618941452, 0.51, 4967.4, 10285, 0.51 307 | -4.3913429499991254, 0.44, 6264.37, 12848.0, 0.51 308 | -2.1846292454698566, 0.35, 8442.02, 16349.0, 0.51 309 | -3.8797789776536615, 0.44, 6874.55, 14540, 0.5 310 | -5.156451746410767, 0.53, 5703.01, 10688.0, 0.5 311 | -5.060177377423868, 0.52, 6822.836000000001, 14194.0, 0.5 312 | -4.276681800046988, 0.46, 5603.4, 11361.0, 0.52 313 | -3.7340578268514166, 0.43, 6253.45, 11985, 0.5 314 | -4.725003584200934, 0.49, 8393.25, 16139.0, 0.5 315 | -3.749320799454419, 0.41, 7407.29, 14714, 0.51 316 | -3.7065072134867108, 0.42, 5830.96, 12227.0, 0.52 317 | -3.8697336315447393, 0.41, 6246.65, 12410, 0.52 318 | -4.750884183985323, 0.47, 6415.201999999998, 12443.8, 0.5 319 | -3.771266247788045, 0.43, 8165.010000000009, 16617.8, 0.51 320 | -2.4282546423559834, 0.3, 8507.09, 17601.0, 0.52 321 | -4.645543014895649, 0.49, 5168.85, 10710, 0.5 322 | -5.307878045831826, 0.55, 4776.15, 9435, 0.48 323 | -5.2562682941992795, 0.5, 5460.4, 10455, 0.5 324 | -5.173985523903277, 0.53, 6577.616, 12708.0, 0.5 325 | -5.5700753451864475, 0.56, 5514.736, 12233.2, 0.49 326 | -4.892011044845429, 0.51, 5246.2, 10285, 0.5 327 | -5.476996617158289, 0.55, 4719.2, 9435, 0.5 328 | -4.600782632693422, 0.47, 5652.5, 11135, 0.51 329 | -3.5201977289222968, 0.39, 7575.478, 16344.2, 0.51 330 | -2.857566981759849, 0.33, 8028.217999999994, 17303.6, 0.52 331 | -4.635735294590374, 0.51, 6590.690000000005, 12793.8, 0.51 332 | -5.658540611264198, 0.59, 4708.056000000002, 9688.2, 0.5 333 | -5.326728933630052, 0.55, 4945.3, 9435, 0.5 334 | -3.021437617090788, 0.38, 6548.95, 15117, 0.52 335 | -4.066853288983768, 0.45, 8974.320000000007, 18388.8, 0.51 336 | -2.5035387759541394, 0.35, 8562.114000000001, 20515.4, 0.52 337 | -5.590122130570643, 0.56, 6750.157999999996, 14065.6, 0.49 338 | -4.720718018697598, 0.49, 6379.262, 13654.0, 0.51 339 | -6.495242286919909, 0.66, 3850.77, 8207, 0.48 340 | -4.479116031122482, 0.44, 6174.002000000003, 12008.8, 0.52 341 | -3.2262781935751885, 0.36, 9416.945999999994, 19451.2, 0.52 342 | -5.532905175954321, 0.54, 6188.65, 14245.0, 0.5 343 | -4.0707399735838745, 0.45, 6340.659999999992, 13387.6, 0.51 344 | -4.985337168079783, 0.51, 6484.064000000004, 14235.8, 0.5 345 | -5.413032096219302, 0.55, 4635.05, 9435, 0.5 346 | -4.512527888808034, 0.49, 7483.362000000003, 15946.6, 0.5 347 | -5.705941869978366, 0.56, 4798.85, 10382.0, 0.49 348 | -4.783667397902646, 0.47, 5953.753999999998, 12799.0, 0.52 349 | -3.950105779921534, 0.45, 7232.9580000000005, 16153.6, 0.51 350 | -3.811510080800815, 0.44, 8830.152000000004, 16941.2, 0.51 351 | -4.743760622790521, 0.48, 5247.671999999999, 11859.6, 0.5 352 | -4.661249775456229, 0.49, 5170.63, 12118, 0.5 353 | -5.1094110079370765, 0.52, 5230.9, 10200, 0.5 354 | -5.139522114603519, 0.51, 5422.89, 10733, 0.51 355 | -3.6086079011715295, 0.39, 8224.765999999996, 17046.2, 0.51 356 | -5.708769782735632, 0.56, 4477.8, 9350, 0.49 357 | -5.273055567827519, 0.51, 6125.315999999996, 14136.2, 0.51 358 | -4.826185641115565, 0.47, 8431.720000000003, 17361.6, 0.51 359 | -4.910907123198105, 0.48, 6650.992000000004, 14176.4, 0.51 360 | -5.053924829087709, 0.51, 7123.166, 13561.8, 0.5 361 | -3.8071077691243937, 0.42, 7278.438000000006, 14841.4, 0.52 362 | -4.799357349995207, 0.52, 5412.2119999999995, 12154.8, 0.51 363 | -3.8466709613555863, 0.42, 6567.95, 12155, 0.51 364 | -5.2299453719742415, 0.54, 5285.51, 11161.0, 0.51 365 | -4.826332840557604, 0.52, 7510.56, 13864, 0.5 366 | -2.646856455226054, 0.36, 9575.416, 20186.0, 0.52 367 | -5.336870932939428, 0.54, 6022.596000000002, 15311.0, 0.5 368 | -4.99551572459879, 0.53, 6517.209999999997, 14256.8, 0.51 369 | -2.1455073214883438, 0.26, 12551.248000000003, 24560.8, 0.53 370 | -3.844104132491133, 0.39, 9471.992000000006, 20947.8, 0.51 371 | -3.3521116931673665, 0.43, 7768.07, 15364.0, 0.5 372 | -3.1362275665701786, 0.41, 8464.71, 16570, 0.5 373 | -3.177160466919815, 0.38, 8821.344000000006, 20485.4, 0.51 374 | -2.7585558314189247, 0.43, 8142.981999999998, 17239.2, 0.51 375 | -4.199824704340873, 0.46, 7150.071999999995, 15630.6, 0.51 376 | -6.814015399059142, 0.63, 4285.83, 9335, 0.48 377 | -4.689714097621271, 0.5, 8318.686000000002, 18172.8, 0.51 378 | -3.353278691023482, 0.37, 8883.868, 17893.6, 0.53 379 | -1.334635983984302, 0.25, 9723.61, 20377.0, 0.53 380 | -5.803014059046696, 0.61, 5301.095999999998, 11404.8, 0.5 381 | -5.643245373045735, 0.56, 7338.345999999999, 14983.2, 0.51 382 | -3.32602255564804, 0.42, 10562.672000000004, 22586.2, 0.51 383 | -3.1632236837669723, 0.36, 12061.408000000012, 24818.8, 0.52 384 | -1.922089070083338, 0.28, 8794.128000000008, 18256.8, 0.53 385 | -6.304249878262032, 0.61, 4097.85, 8160, 0.5 386 | -4.805171768300081, 0.47, 7152.458000000001, 14709.4, 0.51 387 | -3.544215220960707, 0.38, 9731.04, 19369, 0.52 388 | -5.004403401711354, 0.55, 5388.776, 11246.2, 0.49 389 | -3.6202804454088704, 0.46, 7672.706000000001, 16393.0, 0.55 390 | -3.830048787493397, 0.4, 7116.2340000000095, 13866.8, 0.51 391 | -3.115715583549282, 0.38, 7248.263999999999, 14791.0, 0.52 392 | -3.258950408518095, 0.34, 9489.895999999993, 20498.2, 0.52 393 | -4.95220352190241, 0.52, 7155.81, 13712.0, 0.51 394 | -3.9660135031258523, 0.45, 7523.9380000000065, 16439.8, 0.52 395 | -0.5493160306375348, 0.2, 12396.056, 26711.6, 0.54 396 | -2.3843341936110485, 0.27, 9929.17, 19083.0, 0.54 397 | -1.5933619213160322, 0.28, 11289.317999999994, 24631.2, 0.51 398 | 0.7062939932911663, 0.14, 11363.772000000006, 23212.0, 0.53 399 | -3.8541297944528448, 0.4, 8386.32800000001, 15430.8, 0.52 400 | -2.311871276860927, 0.29, 9631.351999999999, 20191.0, 0.53 401 | -4.714361142154109, 0.45, 7435.992000000003, 15648.8, 0.5 402 | -4.528473466989695, 0.47, 8436.978000000003, 17682.0, 0.52 403 | -3.7867766048358735, 0.42, 7634.623999999997, 16386.0, 0.52 404 | -3.8177619473247892, 0.43, 9003.447999999999, 20575.4, 0.52 405 | -4.95762439192295, 0.5, 6632.75, 14359, 0.5 406 | -3.069524608634003, 0.38, 8251.178, 16805.2, 0.51 407 | -3.755460460084978, 0.4, 7719.095999999999, 15794.4, 0.53 408 | -4.74478633221161, 0.46, 8391.546, 16849.8, 0.52 409 | -5.774904908853247, 0.57, 5770.398000000005, 11496.4, 0.51 410 | -4.493409825175303, 0.45, 6292.579999999999, 13860.8, 0.51 411 | -5.971394695369934, 0.6, 4421.74, 9012, 0.49 412 | -3.0457943731349313, 0.36, 9356.604, 18310.4, 0.52 413 | -4.143213089604049, 0.44, 8039.554, 16420.8, 0.52 414 | -4.924318701025737, 0.49, 7998.009999999996, 16058.2, 0.52 415 | 0.07115855900126833, 0.16, 13348.070000000002, 26469.8, 0.54 416 | -2.392652203802436, 0.31, 11697.685999999996, 22435.8, 0.53 417 | -4.292521096688378, 0.42, 7881.208000000006, 19075.4, 0.52 418 | -2.909256391713674, 0.35, 8967.426000000001, 17618.8, 0.53 419 | -6.384325322449079, 0.62, 5261.544, 10616.6, 0.5 420 | -4.356588955133169, 0.44, 7166.76, 14472, 0.51 421 | -3.69384299982394, 0.37, 8333.109999999999, 17333.2, 0.51 422 | -3.16227589635863, 0.4, 7162.629999999997, 15181.2, 0.51 423 | -2.14592279166236, 0.35, 9267.294, 20258.6, 0.52 424 | -1.9132928931160764, 0.33, 7531.397999999997, 14810.2, 0.51 425 | -5.401720782403327, 0.57, 5706.045999999999, 11349.2, 0.49 426 | -4.243556714194163, 0.44, 8121.603999999996, 15352.6, 0.51 427 | -5.24113166850879, 0.5, 5453.74, 12247, 0.5 428 | -3.521319895234649, 0.39, 7628.63, 15139, 0.51 429 | -5.10060989761264, 0.51, 5288.29, 11565, 0.5 430 | -3.969336211675791, 0.48, 5341.770000000006, 11498.0, 0.51 431 | -2.739601619836896, 0.36, 10988.888, 22418.8, 0.49 432 | -5.459654886646003, 0.57, 5147.022000000001, 9455.4, 0.5 433 | -3.1976922134879566, 0.37, 8097.937999999997, 15822.8, 0.52 434 | -4.103305674703592, 0.44, 6490.303999999999, 13548.0, 0.52 435 | -3.7919521819120297, 0.37, 6830.769999999997, 13637.4, 0.52 436 | -3.4356505277739107, 0.41, 8192.720000000005, 18727.6, 0.51 437 | -5.846817984517562, 0.6, 4830.96, 11060, 0.49 438 | -5.677935013209931, 0.57, 4860.030000000002, 10438.8, 0.51 439 | -4.449154601393829, 0.45, 7547.27, 13800, 0.52 440 | -4.893711468508021, 0.52, 4481.2, 10200, 0.52 441 | -2.9667991314079165, 0.37, 7027.63, 15244, 0.52 442 | -3.374623259881561, 0.4, 8063.46, 16818.0, 0.52 443 | -2.1197827964488143, 0.29, 8219.83, 16688, 0.52 444 | -3.28989466406229, 0.38, 8796.682, 18067.4, 0.52 445 | -4.977112190188857, 0.5, 6194.5, 13719, 0.51 446 | -4.013514542424083, 0.42, 7450.42, 14779, 0.51 447 | -2.60882113830313, 0.31, 8604.835999999996, 17450.2, 0.52 448 | -3.9367344652680516, 0.45, 7029.37, 14248, 0.51 449 | -5.5284007064006655, 0.57, 3961.85, 9010, 0.48 450 | -4.530289205461774, 0.42, 6699.997999999998, 15556.6, 0.51 451 | -5.751281635262987, 0.59, 6096.69, 13895.0, 0.5 452 | -5.775269058000773, 0.55, 4833.330000000001, 10201.6, 0.51 453 | -7.362741997128613, 0.71, 4032.4239999999963, 7023.8, 0.47 454 | -4.080558227211793, 0.5, 5665.08, 12563, 0.51 455 | -2.818008131958771, 0.34, 6783.85, 13855, 0.52 456 | -4.1976066852994505, 0.47, 6835.630000000001, 16395.4, 0.51 457 | -5.87686634556726, 0.58, 4692.0, 8755, 0.5 458 | -4.919193531653177, 0.5, 5481.2, 10711, 0.52 459 | -4.624622070351653, 0.45, 5920.25, 11560, 0.5 460 | -6.123696194979077, 0.64, 3893.85, 7650, 0.49 461 | -3.762087431400614, 0.45, 6742.682, 16251.2, 0.51 462 | -0.9787545961133388, 0.21, 9819.068000000005, 20739.4, 0.53 463 | -3.2370791124469367, 0.38, 9304.246000000001, 18592.2, 0.52 464 | -1.518124902414152, 0.22, 9759.31, 21355.0, 0.53 465 | -4.172431790664237, 0.42, 8911.978000000003, 18211.0, 0.52 466 | -2.6004182746303797, 0.39, 7897.28, 14883, 0.52 467 | -4.897282231691648, 0.49, 5882.962000000002, 12546.8, 0.51 468 | -4.757428269070632, 0.49, 6397.75, 12758, 0.51 469 | -4.713515035709903, 0.49, 6195.216000000003, 12137.2, 0.51 470 | -5.01395682992287, 0.52, 4898.55, 10200, 0.5 471 | -4.3143266137068625, 0.44, 6498.25, 11900, 0.51 472 | -5.023867756142512, 0.52, 6222.97, 11648.0, 0.5 473 | -1.8143132684047512, 0.3, 7971.979999999998, 15840.6, 0.52 474 | 0.8662183495238228, 0.07, 12903.611999999996, 26214.2, 0.54 475 | -5.416689532780359, 0.54, 4917.197999999996, 10302.6, 0.51 476 | -4.950781958215562, 0.52, 5343.95, 10200, 0.51 477 | -5.547745261745668, 0.58, 5693.588000000009, 11725.4, 0.51 478 | -5.7193715627103305, 0.54, 5098.27, 9989, 0.5 479 | -5.455788670032877, 0.54, 5207.86, 9925, 0.5 480 | -1.779147008358226, 0.26, 8356.282000000008, 17343.4, 0.52 481 | -2.8891794011721452, 0.3, 12460.656, 25501.0, 0.52 482 | -4.3262895451527426, 0.46, 6576.831999999995, 13826.2, 0.51 483 | -2.460116599401764, 0.31, 8301.894000000002, 18356.4, 0.51 484 | -3.7216186071532094, 0.37, 10427.53999999999, 21477.2, 0.52 485 | -4.929594218393228, 0.43, 8566.993999999993, 17216.2, 0.51 486 | -0.8475551654895968, 0.14, 17540.370000000006, 35871.8, 0.54 487 | -3.009353609230428, 0.33, 10313.627999999999, 21263.6, 0.52 488 | -4.414711200354642, 0.42, 6462.118000000009, 14077.0, 0.5 489 | -2.269379282771209, 0.29, 11225.850000000002, 22116.6, 0.53 490 | -3.153333316669193, 0.32, 14577.824, 28319.0, 0.52 491 | -4.02871976166879, 0.4, 7902.047999999999, 16910.0, 0.49 492 | -1.7718168201219677, 0.2, 14493.713999999993, 31019.2, 0.54 493 | -1.0747200090500435, 0.31, 10914.64, 23765.0, 0.53 494 | -2.8633973560144894, 0.41, 9728.556, 19800.4, 0.51 495 | 0.6354581413999938, 0.16, 18269.049999999996, 37488.4, 0.54 496 | -4.317866594517711, 0.47, 8357.604, 17044.8, 0.5 497 | -2.3450054471962667, 0.42, 7713.630000000009, 17150.8, 0.51 498 | -0.6514122282253552, 0.22, 11467.378000000004, 22115.2, 0.53 499 | -1.5348269691077183, 0.29, 10820.066000000003, 22069.6, 0.53 500 | 1.1732134088944368, 0.13, 18285.024000000005, 38778.4, 0.54 501 | -0.019587364279870723, 0.15, 18127.202, 35997.4, 0.55 502 | 0.6779102410589383, 0.15, 19155.804000000004, 40659.0, 0.54 503 | 0.5239954593071104, 0.17, 19231.909999999996, 40830.6, 0.54 504 | -1.0065124887954082, 0.13, 25343.805999999997, 50324.8, 0.54 505 | -2.4705195273268776, 0.3, 12691.960000000003, 25351.6, 0.53 506 | 0.0025609183764204245, 0.2, 21079.09800000001, 41373.6, 0.53 507 | -1.0590707620937794, 0.24, 16041.616000000004, 35402.2, 0.53 508 | -0.3700888476531249, 0.18, 16514.318, 34414.0, 0.54 509 | -0.0868533799093672, 0.21, 17587.829999999994, 37359.2, 0.54 510 | 0.6821229139861245, 0.12, 18871.010000000002, 38096.6, 0.54 511 | -0.09027580419762067, 0.19, 18632.37399999999, 36270.8, 0.54 512 | -0.06005098654605973, 0.08, 24714.829999999994, 48565.0, 0.55 513 | -0.3423667824856899, 0.17, 15825.935999999992, 33381.4, 0.53 514 | 0.609889961319887, 0.12, 20740.294, 44394.6, 0.54 515 | 1.2626131685736077, 0.09, 22409.774000000005, 48016.2, 0.56 516 | 0.2204874574492703, 0.12, 16243.088000000003, 32857.6, 0.54 517 | -0.12874676211118563, 0.13, 22636.506, 46305.4, 0.54 518 | 0.20558179700217288, 0.13, 21728.751999999997, 46901.2, 0.55 519 | -0.3289899860323579, 0.2, 19840.578, 40745.8, 0.54 520 | -0.7712860681180382, 0.18, 19709.136000000002, 42819.6, 0.54 521 | 0.4937611394848428, 0.1, 27425.883999999995, 60986.8, 0.55 522 | -0.05440864953951138, 0.14, 22335.978000000014, 48791.6, 0.54 523 | 0.4438739239601114, 0.13, 15393.253999999999, 33053.8, 0.54 524 | -0.7052895629158645, 0.22, 10083.478, 21479.4, 0.55 525 | 0.7687335315553845, 0.08, 21354.780000000006, 45357.2, 0.54 526 | 1.4507983847714911, 0.04, 22989.833999999995, 46259.8, 0.55 527 | -0.07558442059964972, 0.15, 18996.18, 38753.4, 0.55 528 | -0.14347291615903973, 0.13, 22761.524000000005, 47025.0, 0.56 529 | 0.5944982175832623, 0.11, 19594.350000000002, 40128.8, 0.55 530 | 0.7643782678286455, 0.13, 20990.76, 41548.2, 0.54 531 | -0.00844794788519704, 0.1, 21956.298, 44393.8, 0.55 532 | 0.6557617475857672, 0.05, 19330.098, 40471.2, 0.55 533 | -0.6614047312417699, 0.21, 20024.537999999993, 39070.2, 0.53 534 | 0.1538187727867826, 0.11, 18959.371999999996, 38643.6, 0.54 535 | 1.1257927276681714, 0.02, 20379.878, 40077.4, 0.55 536 | 0.6147065870821049, 0.09, 17707.86, 36537.8, 0.54 537 | 0.5298754021687715, 0.09, 18485.998000000007, 38350.0, 0.55 538 | 0.8893047576749891, 0.12, 19317.76800000001, 38371.6, 0.54 539 | 0.37372998706606686, 0.11, 18453.05400000001, 40260.8, 0.54 540 | -0.3705067151659631, 0.2, 18343.644, 38326.0, 0.54 541 | 0.3411985363389078, 0.13, 11434.989999999996, 22419.4, 0.55 542 | -0.1765290507182606, 0.16, 22915.412, 52244.8, 0.54 543 | -1.3856031285272519, 0.27, 14271.582000000002, 29961.0, 0.53 544 | -0.7672381732266033, 0.14, 16334.575999999992, 34232.8, 0.54 545 | -1.1626965742835895, 0.23, 13613.467999999995, 30493.6, 0.53 546 | 0.5621888096385694, 0.08, 17003.246, 36851.6, 0.55 547 | 0.2401139763804781, 0.05, 21423.194, 44562.2, 0.54 548 | 0.7499916084231443, 0.08, 21514.856, 45535.0, 0.55 549 | -0.2574256405547577, 0.13, 18331.44, 38530.2, 0.55 550 | -0.059249667963495775, 0.09, 16364.25799999999, 33348.0, 0.55 551 | 0.702471976919369, 0.01, 25452.954000000005, 51942.2, 0.56 552 | 1.633373080927976, 0.05, 18792.872, 38126.2, 0.55 553 | 0.3345834008501335, 0.14, 12690.369999999995, 27100.2, 0.54 554 | 0.9017121267064109, 0.03, 15947.562, 33518.6, 0.55 555 | 1.9176452167201312, 0.01, 22197.811999999998, 46941.6, 0.55 556 | 1.3080287546960347, 0.05, 21744.974000000002, 44748.4, 0.55 557 | 1.74917255598094, 0.04, 19504.98399999999, 38098.8, 0.55 558 | 1.0042941515954538, 0.12, 19215.482000000004, 36957.8, 0.55 559 | 0.9977143427499767, 0.13, 9769.169999999991, 19255.2, 0.52 560 | 1.094410842625557, 0.07, 17202.757999999998, 35404.2, 0.54 561 | 1.8400846761894547, 0.0, 21799.164000000004, 45118.4, 0.55 562 | 2.3749588302205695, 0.01, 19582.652, 40641.4, 0.56 563 | -0.43505675354252327, 0.21, 14666.883999999996, 29360.6, 0.54 564 | 1.8571344708661712, 0.1, 12062.730000000005, 23778.2, 0.54 565 | -1.5590595293246605, 0.19, 9746.364000000003, 18974.4, 0.54 566 | -2.4079142482023523, 0.28, 11172.802000000003, 24983.2, 0.53 567 | 0.29412392343901267, 0.14, 19327.992, 37752.0, 0.53 568 | 0.10023935942074143, 0.2, 18949.255999999998, 37208.8, 0.54 569 | -0.6878916700475395, 0.26, 13805.569999999998, 28444.4, 0.53 570 | -1.6578160759553293, 0.36, 11064.921999999997, 24051.0, 0.52 571 | -0.8407559798959894, 0.2, 9620.946, 18907.2, 0.52 572 | -1.3321841926464548, 0.28, 11841.897999999997, 25562.8, 0.52 573 | 0.5970621284325375, 0.12, 15828.549999999988, 30804.6, 0.54 574 | 0.671220356662194, 0.19, 9007.79000000001, 17729.8, 0.51 575 | -2.4604431139014484, 0.32, 7069.45, 14450, 0.51 576 | 0.01609256077131498, 0.18, 13250.54, 28469.6, 0.53 577 | -2.019637540963396, 0.3, 12705.805999999999, 27816.6, 0.53 578 | -1.0947625277138158, 0.28, 13970.37, 28517.2, 0.53 579 | -2.6959894498688266, 0.34, 11319.692, 22407.0, 0.52 580 | 0.6570126811374039, 0.15, 9233.57, 17991.0, 0.51 581 | -2.438445494497155, 0.28, 13542.442000000006, 28844.0, 0.53 582 | -0.6349276091364695, 0.25, 11070.124, 22236.4, 0.52 583 | -2.337994513435004, 0.31, 7295.55, 14535, 0.52 584 | -4.253743018923888, 0.49, 10507.201999999996, 23917.0, 0.49 585 | -1.2394453490056168, 0.26, 13298.377999999993, 26623.4, 0.53 586 | 1.3501715533752614, 0.13, 9652.32199999999, 19202.6, 0.53 587 | -1.5288059811504262, 0.26, 7725.003999999999, 15711.4, 0.53 588 | -1.5039911044356113, 0.31, 11537.451999999997, 25189.2, 0.52 589 | -2.610866300822098, 0.35, 14012.589999999993, 26486.4, 0.53 590 | 2.0023385596951497, 0.04, 12768.084, 25583.0, 0.54 591 | 2.1882515431125604, 0.05, 10234.635999999997, 20893.2, 0.55 592 | -1.5953311555731196, 0.31, 11648.424000000005, 23645.0, 0.5 593 | -1.5710262323729882, 0.24, 13762.481999999995, 28776.2, 0.54 594 | -2.625667994305054, 0.34, 6896.9, 13855, 0.51 595 | -0.595483123586155, 0.19, 13340.683999999997, 28090.0, 0.54 596 | -1.6529470108397217, 0.3, 11961.217999999999, 24805.4, 0.52 597 | -3.9229543483060887, 0.44, 10938.875999999995, 21482.0, 0.51 598 | -5.313959690611914, 0.55, 5275.114000000001, 11269.4, 0.49 599 | -5.136570160193457, 0.55, 5440.280000000002, 11031.8, 0.51 600 | -5.405699202902153, 0.54, 6745.892000000005, 12745.8, 0.5 601 | -3.412379927992283, 0.46, 7954.267999999994, 14102.4, 0.51 602 | 0.11845896152594662, 0.16, 14171.61599999999, 30371.4, 0.55 603 | -2.6909483612665133, 0.29, 10854.61, 22082.0, 0.52 604 | -3.7779160498103135, 0.46, 9176.206000000002, 20277.4, 0.51 605 | -5.7414375396652675, 0.57, 6323.622000000004, 14078.0, 0.49 606 | -3.5503773889793866, 0.45, 8552.125999999998, 17717.0, 0.52 607 | -4.518195154193087, 0.52, 7570.479999999997, 17945.4, 0.49 608 | -1.2065445438402234, 0.32, 11850.986000000003, 24079.8, 0.52 609 | -2.046940011441128, 0.36, 9811.086000000005, 21329.8, 0.52 610 | -3.2869844343041414, 0.4, 9669.367999999993, 20750.0, 0.5 611 | -5.676551659807371, 0.61, 5850.950000000001, 11423.0, 0.49 612 | -6.036674725326251, 0.66, 4417.7379999999985, 9343.6, 0.48 613 | -5.118984366207373, 0.53, 6975.818, 15608.6, 0.49 614 | -5.400104240692965, 0.58, 6945.073999999998, 14185.2, 0.49 615 | -5.352709946012844, 0.58, 7060.723999999996, 14830.6, 0.49 616 | -5.9482433232158405, 0.65, 5717.072000000001, 12759.0, 0.49 617 | -5.513085243036894, 0.65, 6798.709999999997, 13103.2, 0.48 618 | -6.213562554722111, 0.63, 6018.073999999999, 13476.2, 0.48 619 | -5.407169947278058, 0.58, 6757.190000000002, 13183.6, 0.49 620 | -4.8787602986375616, 0.48, 7806.495999999997, 16091.6, 0.51 621 | -5.085511025057524, 0.51, 6913.422000000004, 13857.0, 0.5 622 | -3.575943903279968, 0.46, 8753.444000000003, 16981.2, 0.52 623 | -1.700637183560822, 0.28, 10884.758000000003, 25521.6, 0.54 624 | -3.262889179131376, 0.39, 9004.970000000001, 17063.4, 0.52 625 | -2.921994961155152, 0.34, 9726.710000000003, 18795.4, 0.53 626 | -0.9410353475080513, 0.16, 13149.875999999998, 28724.0, 0.55 627 | -2.775479448996594, 0.38, 10877.764000000001, 23069.2, 0.51 628 | -3.2179359290249447, 0.34, 11002.914, 21612.2, 0.52 629 | -5.140148751842118, 0.53, 6709.745999999998, 15220.2, 0.5 630 | -5.7437943878447255, 0.56, 4635.696000000002, 10480.8, 0.5 631 | -4.364577617457466, 0.52, 6957.824000000004, 13898.4, 0.51 632 | -1.7451648997641245, 0.33, 9496.764000000003, 19877.2, 0.53 633 | -2.67590293060925, 0.36, 6674.2, 13600, 0.53 634 | -4.790734361510432, 0.51, 7889.666000000002, 17011.6, 0.53 635 | -3.5895890690875008, 0.4, 10292.708000000004, 21013.6, 0.53 636 | -3.816666488155936, 0.49, 8158.788000000003, 17077.6, 0.5 637 | -4.051897375981986, 0.52, 9322.577999999994, 20620.2, 0.49 638 | -4.627318849183553, 0.48, 7931.16, 17096.4, 0.5 639 | -4.4084274366828815, 0.55, 6538.104, 12283.4, 0.5 640 | -1.837271826644606, 0.3, 9678.236000000003, 18555.4, 0.54 641 | -5.114937689056097, 0.54, 5959.0779999999995, 14235.8, 0.51 642 | -4.1366136489683845, 0.39, 8656.244, 18487.4, 0.52 643 | -4.370581343767248, 0.45, 8448.302000000003, 17838.4, 0.49 644 | -4.449508043030419, 0.47, 7668.738000000003, 17708.6, 0.5 645 | -4.188900952412694, 0.44, 7046.86, 14444, 0.5 646 | -1.3153257360632744, 0.3, 11955.736000000003, 24592.2, 0.52 647 | -4.752346638879249, 0.54, 5930.622000000003, 13087.6, 0.49 648 | -4.336902518384366, 0.5, 8329.914000000002, 18164.4, 0.49 649 | -5.065439069198758, 0.55, 7191.524000000008, 14467.8, 0.49 650 | -5.816907495438021, 0.61, 6111.800000000004, 12582.0, 0.49 651 | -4.003965122860037, 0.43, 9095.830000000004, 18627.0, 0.52 652 | -3.8288379380123962, 0.49, 7581.410000000004, 16779.6, 0.52 653 | -3.456377560092759, 0.4, 7589.699999999999, 15804.0, 0.49 654 | -5.75957757467925, 0.56, 5942.79, 12356.0, 0.51 655 | -4.804106897358698, 0.46, 7299.6420000000035, 15420.0, 0.51 656 | -4.081602614571893, 0.42, 7505.4220000000005, 15702.4, 0.51 657 | -4.126823592362853, 0.44, 9964.12, 18850.6, 0.52 658 | -2.0033530541731417, 0.26, 10401.399999999998, 21417.0, 0.52 659 | -4.965319059668352, 0.54, 6567.48, 13125, 0.48 660 | -5.47202690294297, 0.56, 6000.66, 13190, 0.49 661 | -5.060097029490181, 0.51, 6840.54, 14189, 0.5 662 | -4.487973853170697, 0.46, 7338.038000000003, 14420.8, 0.5 663 | -3.7453226026559436, 0.4, 7902.852000000005, 16208.0, 0.51 664 | -3.7098353822752923, 0.37, 9264.327999999998, 19179.4, 0.5 665 | -4.416221102175673, 0.44, 8032.140000000002, 16949.2, 0.51 666 | -4.263037936415657, 0.52, 7510.683999999995, 16736.2, 0.5 667 | -3.2556596301774023, 0.38, 6998.050000000002, 13630.6, 0.52 668 | -4.237115214666455, 0.43, 9084.542000000005, 18603.0, 0.51 669 | -3.457045294107547, 0.42, 5853.95, 12155, 0.51 670 | -3.2811140247915707, 0.39, 8113.610000000002, 17281.0, 0.5 671 | -5.209972581608936, 0.58, 5986.988, 12317.2, 0.48 672 | -1.2209186398024983, 0.25, 9837.596000000001, 19883.6, 0.54 673 | -3.666974986492172, 0.45, 6521.698000000005, 15218.8, 0.52 674 | -5.148555446895995, 0.51, 7025.501999999991, 15366.2, 0.51 675 | -4.156784436811963, 0.48, 7672.754, 16085.0, 0.51 676 | -2.715668954286368, 0.41, 9402.65, 18461.4, 0.51 677 | -5.3622649807151666, 0.53, 7226.236000000001, 14716.8, 0.5 678 | -3.9843838572243437, 0.41, 9425.238, 20066.6, 0.5 679 | -3.7883654472946624, 0.41, 6868.320000000003, 14272.4, 0.51 680 | -3.442239977150885, 0.46, 6612.35, 13614.0, 0.5 681 | -4.378986619008358, 0.45, 6617.589999999999, 15347.6, 0.52 682 | -4.997229470706899, 0.51, 5474.731999999998, 12537.8, 0.51 683 | -4.580872624846617, 0.46, 7321.1, 14446.0, 0.52 684 | -5.099121304697087, 0.49, 6312.815999999999, 13486.8, 0.52 685 | -3.9134080613637154, 0.43, 8747.612000000003, 17623.2, 0.52 686 | -4.96995049732216, 0.5, 6531.21, 13847, 0.51 687 | -6.392157264630787, 0.65, 3830.46, 9614, 0.5 688 | -5.042595175755245, 0.52, 6037.07, 12826.0, 0.5 689 | -5.979304708997651, 0.61, 4197.297999999999, 8461.8, 0.51 690 | -5.756446917908327, 0.58, 5133.17, 10937.0, 0.51 691 | -5.113816522527953, 0.52, 5559.032000000003, 11195.8, 0.5 692 | -5.205388709753923, 0.52, 5402.200000000007, 11139.8, 0.52 693 | -3.9578688656857746, 0.43, 9161.214, 19602.0, 0.52 694 | -3.0736893346726832, 0.34, 10005.08, 21291.0, 0.53 695 | -0.962651439329994, 0.15, 15775.365999999998, 32288.2, 0.54 696 | -4.112315274772079, 0.47, 6843.505999999999, 14943.0, 0.53 697 | -5.313321195823826, 0.56, 5412.864000000001, 12348.8, 0.51 698 | -3.7810622017911144, 0.43, 8459.202, 17836.4, 0.51 699 | -3.746450762566925, 0.41, 8606.387999999995, 18453.2, 0.52 700 | -4.498030294781185, 0.49, 6411.241999999999, 14268.6, 0.52 701 | -5.723570447503303, 0.57, 5670.395999999995, 13572.8, 0.51 702 | -3.7423233879697007, 0.42, 7722.247999999997, 17209.4, 0.51 703 | -6.211137928105912, 0.63, 4671.67, 9847, 0.49 704 | -6.160129608555301, 0.64, 5376.197999999995, 11715.6, 0.5 705 | -4.099610852415976, 0.41, 8302.328, 16188.6, 0.53 706 | -4.970717727647666, 0.52, 6482.084, 14194.0, 0.51 707 | -5.434968015025816, 0.54, 5741.11, 11981.0, 0.51 708 | -4.829850467186926, 0.47, 7970.881999999995, 15956.6, 0.51 709 | -5.443005574862562, 0.57, 7094.539999999997, 13957.2, 0.51 710 | -5.514566740650398, 0.54, 6000.081999999996, 12995.6, 0.51 711 | -4.415662827004607, 0.46, 6390.5860000000075, 12793.8, 0.53 712 | -2.4247430293492953, 0.43, 7619.81, 15382.0, 0.51 713 | -5.353593961278782, 0.55, 5334.531999999997, 10213.6, 0.51 714 | -5.143387666524543, 0.54, 7190.3019999999915, 13566.6, 0.51 715 | -4.859905740295039, 0.5, 5104.521999999998, 10733.8, 0.52 716 | -5.542009596172376, 0.57, 5952.965999999999, 13896.0, 0.5 717 | -4.727238290215334, 0.48, 6195.87, 12382.0, 0.51 718 | -5.50007940448022, 0.54, 6504.83, 12785.0, 0.51 719 | -5.132098072004892, 0.53, 4917.51, 11012, 0.52 720 | -4.404623253772855, 0.49, 6281.96, 12630, 0.51 721 | -3.472388062050253, 0.42, 5871.8, 12155, 0.52 722 | -3.78195736082537, 0.41, 9432.03, 19282.0, 0.53 723 | -5.650609707924206, 0.56, 5632.72, 12180.0, 0.5 724 | -4.241688168104423, 0.43, 6943.8060000000005, 14009.8, 0.52 725 | -5.464560415260048, 0.53, 6774.405999999997, 15355.2, 0.51 726 | -3.462568725051315, 0.44, 6666.021999999997, 14374.4, 0.52 727 | -6.314558455545288, 0.63, 4588.422, 9831.0, 0.5 728 | -6.081704401144913, 0.62, 5244.572000000001, 9955.6, 0.5 729 | -4.264278092519039, 0.42, 9713.063999999997, 21619.2, 0.52 730 | -4.5955170856052625, 0.49, 9047.52599999999, 17227.6, 0.52 731 | -4.784025273507388, 0.51, 5963.974000000001, 11906.8, 0.51 732 | -4.618703163451088, 0.48, 5511.86, 11122.0, 0.51 733 | -4.411531322004951, 0.47, 6891.5, 13379, 0.52 734 | -4.353356393371956, 0.48, 7842.522000000001, 17353.6, 0.51 735 | -3.1672721527581906, 0.32, 9681.094000000003, 18926.4, 0.55 736 | -2.778392768190463, 0.35, 9285.202000000001, 19701.0, 0.53 737 | -4.427381348857018, 0.45, 7916.371999999998, 16306.0, 0.51 738 | -5.605073613427091, 0.56, 5008.5759999999955, 11118.8, 0.51 739 | -3.850798749487504, 0.43, 7605.376000000005, 16065.8, 0.52 740 | -5.172148961060169, 0.53, 6277.528, 12938.4, 0.51 741 | -3.968867683130697, 0.43, 8593.85, 17681, 0.5 742 | -2.2885852822965145, 0.38, 9117.205999999998, 18858.2, 0.51 743 | -4.612661074759504, 0.48, 6251.984, 13326.4, 0.49 744 | -4.221873422009798, 0.45, 8390.083999999995, 18066.4, 0.5 745 | -5.7163313011850105, 0.58, 6523.479999999999, 13987.2, 0.49 746 | -3.6542609268833495, 0.38, 9100.42, 18532.0, 0.51 747 | -2.6068198940843943, 0.32, 9721.135999999997, 19159.2, 0.52 748 | -4.884363418581615, 0.46, 10672.794000000005, 20847.8, 0.5 749 | -5.54765123684559, 0.54, 6159.563999999999, 13527.0, 0.48 750 | -5.166344661171961, 0.49, 5959.11, 12900.0, 0.5 751 | -4.21978887099227, 0.41, 8544.473999999995, 17040.4, 0.51 752 | 0.46740794509344397, 0.08, 11743.44, 24590, 0.54 753 | -5.296236681586522, 0.52, 5653.203999999999, 11935.0, 0.5 754 | -4.736530272406302, 0.5, 5534.622, 12131.2, 0.51 755 | -3.547392141575799, 0.36, 7949.179999999997, 16484.8, 0.51 756 | -6.170340392742965, 0.61, 5762.7, 11520.0, 0.5 757 | -3.833985885515239, 0.46, 10286.416000000003, 20502.2, 0.51 758 | -2.5014695101537017, 0.43, 6775.502, 15328.2, 0.52 759 | -3.2954760978527147, 0.46, 7068.510000000005, 14938.8, 0.49 760 | -2.828727451681938, 0.47, 8311.686000000009, 17060.0, 0.5 761 | -3.8001226509422192, 0.48, 8200.464, 16689.0, 0.49 762 | -4.475688039103521, 0.55, 6370.511999999999, 14377.4, 0.5 763 | -3.7672481836435896, 0.5, 7271.644000000003, 16203.4, 0.51 764 | -4.119980865069996, 0.46, 9238.253999999997, 18696.6, 0.52 765 | -2.507975370844403, 0.35, 6641.9, 13685, 0.52 766 | -4.962024009248039, 0.47, 8281.807999999994, 16240.8, 0.51 767 | -4.79745911356104, 0.49, 6449.880000000001, 14304.4, 0.51 768 | -5.212708425682115, 0.55, 6771.348000000001, 14419.0, 0.51 769 | -4.165094694554074, 0.45, 7890.506000000008, 18699.6, 0.52 770 | -4.779917564069968, 0.51, 6810.451999999994, 15624.2, 0.51 771 | -4.96670829655906, 0.5, 9561.780000000017, 17075.8, 0.52 772 | -5.23447670650111, 0.51, 7765.908000000004, 17265.8, 0.51 773 | -4.5797893165083385, 0.45, 6803.855999999994, 16363.6, 0.53 774 | -5.303232354003818, 0.52, 6689.45, 13264.0, 0.51 775 | -4.361526476482282, 0.45, 10803.008, 22050.8, 0.53 776 | -5.061004704744697, 0.52, 5683.5399999999945, 11418.6, 0.5 777 | -0.987598728926779, 0.17, 14155.582, 27785.4, 0.54 778 | -3.0903204523536654, 0.37, 8065.106000000001, 16015.8, 0.53 779 | -3.3003786963487727, 0.38, 8611.974000000007, 17809.8, 0.51 780 | -4.759274034261132, 0.51, 8036.866000000008, 15325.0, 0.49 781 | -4.71125450578422, 0.49, 8055.009999999992, 17320.2, 0.5 782 | -0.2702672282807627, 0.16, 11602.898000000001, 24618.2, 0.53 783 | -3.8319323608289113, 0.36, 11563.137999999999, 22804.4, 0.53 784 | -6.002018641218569, 0.58, 5112.26, 10163, 0.51 785 | -5.334328057327786, 0.56, 5729.638000000001, 11894.0, 0.51 786 | -6.106846595092821, 0.61, 4387.85, 8907.0, 0.5 787 | -3.9537480577567603, 0.43, 9190.600000000004, 18034.2, 0.51 788 | -2.9067627452346794, 0.36, 9011.872000000008, 18830.4, 0.52 789 | -4.905906817741554, 0.48, 6367.18, 13738, 0.51 790 | -5.5244824108288, 0.58, 6491.368000000006, 12302.0, 0.5 791 | -3.747042030011674, 0.42, 9928.388, 20586.4, 0.51 792 | -3.983390123938638, 0.47, 7842.334000000003, 15457.8, 0.52 793 | -5.311549676127145, 0.49, 6570.186, 16491.4, 0.5 794 | -3.729831092782721, 0.44, 8550.318000000001, 19019.0, 0.52 795 | -2.1983881255576647, 0.34, 8260.062000000005, 15872.4, 0.53 796 | -3.4237633324596812, 0.33, 8628.544000000007, 17214.4, 0.52 797 | -4.251905318921308, 0.43, 6045.99, 12625.0, 0.52 798 | -4.737092530493474, 0.54, 6146.414000000003, 12505.4, 0.52 799 | -3.9466422971719832, 0.43, 7809.732, 17288.2, 0.5 800 | -2.7698000200577617, 0.38, 9248.624000000002, 20428.0, 0.51 801 | -4.143955634360139, 0.46, 10201.987999999996, 19769.6, 0.51 802 | -4.157250814707412, 0.44, 8056.684000000003, 16424.8, 0.52 803 | -4.24776424651223, 0.49, 8099.382, 16468.8, 0.5 804 | -4.904147549704008, 0.48, 9768.438000000002, 18485.4, 0.51 805 | -4.6043919553398265, 0.47, 10157.367999999982, 19429.2, 0.52 806 | -3.151417779510508, 0.42, 8368.259999999998, 18797.2, 0.51 807 | -5.4139647185426245, 0.57, 7442.844, 13446.4, 0.5 808 | -2.766365893403431, 0.37, 10237.034000000001, 19963.2, 0.51 809 | -2.049396508333046, 0.27, 10984.706000000004, 22783.2, 0.52 810 | -5.441537176233874, 0.55, 5793.353999999996, 12079.6, 0.5 811 | -5.495851496933012, 0.55, 5327.897999999999, 12205.8, 0.49 812 | -4.904144562699048, 0.51, 5523.658000000004, 12717.4, 0.5 813 | -5.34677042408148, 0.53, 5560.7, 9860, 0.5 814 | -5.036202511089081, 0.49, 7286.155999999999, 14682.0, 0.51 815 | -4.020622374856045, 0.43, 6081.002000000004, 12590.2, 0.52 816 | -3.927644351801826, 0.41, 8825.545999999993, 17570.0, 0.51 817 | -4.8764733776960405, 0.52, 7333.005999999997, 15508.2, 0.49 818 | -3.101165134905778, 0.4, 8628.691999999995, 18584.0, 0.51 819 | -4.07235085051424, 0.48, 8024.869999999995, 18314.4, 0.52 820 | -6.706048218404295, 0.66, 5029.8, 8815, 0.49 821 | -4.0207590596504525, 0.43, 9565.562000000007, 20157.0, 0.51 822 | -3.1155664460444648, 0.39, 7807.6, 16499, 0.53 823 | -4.4656223871304075, 0.5, 5213.93, 11863, 0.5 824 | -4.663420330792899, 0.45, 6868.71, 13224, 0.5 825 | -6.004117700865079, 0.58, 5139.05, 10419, 0.5 826 | -5.463240838931638, 0.54, 5986.51, 11013, 0.5 827 | -2.148717553846649, 0.27, 12182.16199999999, 23970.4, 0.54 828 | -3.87992474848878, 0.45, 7143.95, 15441.0, 0.52 829 | -5.568885935575359, 0.53, 4978.45, 9860, 0.51 830 | -3.4349494740552053, 0.38, 8948.084, 20659.0, 0.51 831 | -4.418149721970488, 0.39, 8353.672000000004, 18521.4, 0.52 832 | -4.639814719563562, 0.5, 6545.034000000006, 13262.6, 0.51 833 | -4.143386620912235, 0.46, 7366.131999999995, 15594.6, 0.51 834 | -4.878815826683128, 0.51, 7674.949999999998, 15694.0, 0.5 835 | -4.511968049662356, 0.46, 8258.32, 17216.0, 0.51 836 | -4.944285822796583, 0.58, 4545.8, 10059.0, 0.49 837 | -3.69588658535272, 0.43, 7181.576000000008, 14105.4, 0.52 838 | -4.278059331749321, 0.44, 6506.941999999999, 13369.2, 0.5 839 | -3.87912635695507, 0.43, 7112.440000000003, 14759.4, 0.51 840 | -3.6410820584355115, 0.46, 7750.455999999998, 15443.0, 0.51 841 | -4.74286516255775, 0.49, 6893.031999999998, 14887.2, 0.51 842 | -5.0459225113422495, 0.51, 5460.925999999998, 13161.8, 0.5 843 | -3.5678611557613378, 0.42, 7370.053999999993, 17143.4, 0.52 844 | -3.343468445747584, 0.39, 9006.471999999996, 19870.8, 0.53 845 | -4.474931162414989, 0.53, 6413.188000000002, 14402.8, 0.5 846 | -4.931465343821927, 0.52, 6559.577999999998, 14300.2, 0.49 847 | -3.6730564467238644, 0.37, 8256.379999999996, 17463.2, 0.52 848 | -4.44865641395132, 0.5, 6457.673999999999, 13311.4, 0.51 849 | -5.499656389606204, 0.56, 6003.288, 12281.6, 0.5 850 | -4.680968042941207, 0.46, 6766.09, 13161, 0.52 851 | -3.8962030031021078, 0.41, 8391.554000000006, 16031.2, 0.53 852 | -5.5357190241176655, 0.54, 6652.52, 14353.0, 0.51 853 | -4.771571897193408, 0.45, 7719.454000000007, 16708.4, 0.52 854 | -3.2339920991047553, 0.42, 8185.7, 16059.0, 0.51 855 | -5.549303249437119, 0.55, 6067.840000000001, 11988.2, 0.49 856 | -3.0607732542785953, 0.39, 9056.79, 20094.6, 0.51 857 | -3.761706024674648, 0.41, 7916.694000000001, 16325.2, 0.51 858 | -4.8094699872043645, 0.49, 6432.463999999999, 13838.2, 0.52 859 | -4.3505096821401645, 0.5, 5829.9119999999975, 10873.2, 0.5 860 | -5.100339956232328, 0.5, 6465.08, 13527, 0.51 861 | -2.9040888771140594, 0.36, 8516.252, 17744.8, 0.52 862 | -5.2097562488643465, 0.53, 5244.83, 10180, 0.5 863 | -3.6831504696695045, 0.4, 7689.282000000006, 16650.4, 0.52 864 | -5.170412848427993, 0.48, 6252.7, 13808.0, 0.51 865 | -4.468605559055098, 0.48, 8439.815999999999, 17888.2, 0.5 866 | -3.8235504503879554, 0.38, 7992.525999999999, 18703.0, 0.51 867 | -6.114099995649448, 0.6, 4916.187999999998, 10231.2, 0.5 868 | -4.453989298983326, 0.5, 6629.614000000001, 13376.6, 0.5 869 | -4.1439557561112705, 0.42, 7739.856, 16799.2, 0.51 870 | -4.174953481110376, 0.43, 7874.138000000001, 16592.6, 0.5 871 | -6.19233893488904, 0.61, 5063.396000000004, 12046.4, 0.49 872 | -4.878694374984544, 0.51, 7190.160000000007, 16131.8, 0.5 873 | -5.174377458486482, 0.54, 6033.518000000006, 12797.4, 0.51 874 | -5.556961566159492, 0.55, 7100.689999999995, 13550.6, 0.51 875 | -3.6853180336450992, 0.37, 7900.899999999997, 19179.6, 0.52 876 | -4.0240001581846325, 0.43, 7864.353999999995, 15641.0, 0.51 877 | -4.375721993916826, 0.48, 7359.5440000000035, 14380.0, 0.5 878 | -5.5040610873928815, 0.58, 5165.910000000005, 10737.2, 0.5 879 | -3.517348021562569, 0.41, 8347.731999999998, 17894.0, 0.54 880 | -2.9137768780667246, 0.37, 9177.468000000003, 19781.6, 0.53 881 | -4.971732374648496, 0.52, 6849.808000000001, 15637.0, 0.51 882 | -4.602001948058111, 0.53, 7403.499999999996, 16254.2, 0.51 883 | -2.8850728209025376, 0.38, 7383.087999999996, 14182.2, 0.52 884 | -4.628200126876145, 0.48, 7197.834000000002, 14087.4, 0.5 885 | -5.985459171728711, 0.58, 6335.237999999999, 11234.6, 0.5 886 | -4.516088414829548, 0.48, 5778.507999999993, 12535.2, 0.51 887 | -4.577455379522489, 0.53, 6080.945999999997, 12187.0, 0.5 888 | -4.758140232376698, 0.48, 6760.24, 13814.0, 0.51 889 | -3.9260724854239317, 0.39, 8193.197999999999, 16750.8, 0.53 890 | -4.7798429252954, 0.52, 7425.9519999999975, 16929.6, 0.51 891 | -4.082187573471413, 0.44, 7692.967999999999, 16851.8, 0.52 892 | -2.9711927947583923, 0.36, 8815.845999999996, 18215.0, 0.53 893 | -3.96902879996201, 0.45, 7183.427999999999, 14488.0, 0.51 894 | -2.575713327882831, 0.28, 9113.63400000001, 18740.8, 0.53 895 | -4.56956682111938, 0.53, 7452.1660000000065, 13510.0, 0.51 896 | -4.441250028950544, 0.53, 7565.931999999996, 15583.2, 0.51 897 | -5.261011243815177, 0.54, 6428.112000000005, 12387.8, 0.5 898 | -2.2680951794984234, 0.27, 11210.938000000006, 23651.8, 0.53 899 | -4.013195312072364, 0.37, 8201.962, 16469.6, 0.52 900 | -4.16206342101982, 0.44, 6963.914000000001, 12794.2, 0.53 901 | -1.4523055003676, 0.26, 8819.81600000001, 18858.6, 0.53 902 | -0.28506180937199393, 0.2, 10883.049999999997, 20341.8, 0.52 903 | -3.140481719419479, 0.34, 8213.838000000002, 17657.8, 0.53 904 | -4.833250491380445, 0.49, 6641.5340000000015, 14279.8, 0.51 905 | -3.848992013200097, 0.48, 7465.663999999995, 14063.6, 0.51 906 | -4.704280376062427, 0.54, 5037.958000000001, 13684.4, 0.49 907 | -4.354310822631312, 0.45, 9163.92, 18472.0, 0.52 908 | -3.9724380239639987, 0.48, 6370.651999999999, 14643.8, 0.51 909 | -3.4482722894041604, 0.39, 9666.601999999999, 19018.0, 0.54 910 | -0.8317332520678613, 0.31, 11643.876000000004, 23680.8, 0.52 911 | -1.1046230729794304, 0.25, 10517.655999999995, 20436.0, 0.54 912 | -3.542072036420358, 0.4, 8218.435999999992, 15495.6, 0.52 913 | -3.95425237345386, 0.48, 7621.509999999998, 16291.0, 0.52 914 | -2.5217962104761393, 0.39, 8334.708000000002, 17215.8, 0.53 915 | -3.467678584471819, 0.39, 7163.29, 14307, 0.52 916 | -4.570632228308895, 0.49, 6296.083999999997, 13635.6, 0.52 917 | -5.8372091609906045, 0.61, 4800.13, 12070.0, 0.5 918 | -4.230471187569806, 0.38, 10652.757999999996, 21314.2, 0.55 919 | -2.947473657239935, 0.34, 10139.532000000005, 19047.8, 0.52 920 | -3.9865714660083054, 0.46, 7456.795999999991, 15530.6, 0.51 921 | -3.4668184513814437, 0.42, 7766.736000000001, 15688.0, 0.5 922 | -4.199839606621605, 0.41, 7111.53, 14394, 0.52 923 | 0.0987803073603122, 0.21, 12673.27, 24799.0, 0.54 924 | -5.391981152808292, 0.55, 4884.1, 9435, 0.51 925 | -5.7360935682450735, 0.59, 4458.283999999996, 9244.6, 0.5 926 | -4.020107130277463, 0.42, 8409.06200000001, 17479.4, 0.52 927 | -2.529017788651358, 0.38, 8821.032000000008, 18459.8, 0.52 928 | -3.145383520881075, 0.35, 7732.994000000001, 17211.0, 0.52 929 | -1.4442414381766424, 0.18, 11323.08, 22979.0, 0.53 930 | -3.572269498213642, 0.37, 6979.996000000003, 13875.4, 0.52 931 | -2.464260118356831, 0.32, 8292.443999999996, 15831.2, 0.53 932 | -3.1516087031138573, 0.35, 8692.35, 18716.8, 0.53 933 | -3.5935745595033826, 0.41, 10426.562, 20974.8, 0.53 934 | -2.215635222195304, 0.31, 8994.623999999996, 17012.6, 0.53 935 | -4.924378777969479, 0.52, 6275.57, 13856.0, 0.51 936 | -2.6932292858772953, 0.3, 8407.74, 17342.0, 0.53 937 | -3.583068135879771, 0.41, 7296.05, 15581.8, 0.52 938 | -3.979452807250921, 0.42, 7618.3, 16011, 0.58 939 | -2.6244431972451707, 0.31, 9788.916000000005, 20940.4, 0.56 940 | -3.4564154101317848, 0.41, 7477.873999999993, 15517.0, 0.52 941 | -3.6040231649398793, 0.38, 9637.788000000002, 19254.2, 0.52 942 | -3.0678625422544945, 0.35, 8834.467999999999, 20896.6, 0.53 943 | -2.914809132659785, 0.37, 7699.44, 15298.0, 0.53 944 | -3.241994584422207, 0.36, 8774.167999999998, 19986.6, 0.53 945 | -5.292427418431447, 0.53, 7029.616000000005, 14614.4, 0.51 946 | -2.5202934277198077, 0.37, 9691.233999999995, 18971.6, 0.52 947 | -4.550242673807536, 0.55, 6659.85, 13207.0, 0.5 948 | -1.5854392227862155, 0.29, 10702.983999999999, 23044.8, 0.53 949 | -4.044599033544333, 0.44, 8615.554000000002, 18155.4, 0.52 950 | -3.0379613286724965, 0.37, 10020.707999999999, 19736.0, 0.53 951 | -5.74741705124196, 0.56, 7704.475999999995, 15207.6, 0.51 952 | -3.7497347814259996, 0.38, 10160.261999999999, 20475.8, 0.52 953 | -6.612395293818781, 0.63, 5902.997999999995, 12082.6, 0.5 954 | -4.418724536178878, 0.43, 7866.15400000001, 15813.8, 0.52 955 | -4.445112451777148, 0.48, 8323.386000000006, 17874.8, 0.51 956 | -4.445363331638429, 0.46, 9088.612000000005, 17815.2, 0.51 957 | -2.9519255030038702, 0.35, 10873.543999999996, 21091.4, 0.52 958 | -5.8835052165541075, 0.59, 6283.002, 12496.6, 0.5 959 | -5.456170653352455, 0.52, 5374.67, 11452.0, 0.52 960 | -4.047780918945999, 0.38, 8403.325999999995, 17716.2, 0.51 961 | -4.985291376859758, 0.45, 8451.61, 15294.0, 0.52 962 | -4.00354694992533, 0.38, 8651.919999999995, 17789.8, 0.52 963 | -3.134842083793767, 0.4, 9264.363999999996, 19756.6, 0.53 964 | -4.025691871704621, 0.44, 6603.2919999999995, 15215.6, 0.52 965 | -2.471466920595781, 0.25, 13711.140000000012, 27609.6, 0.54 966 | -2.050598786684451, 0.36, 9056.374000000005, 18530.4, 0.52 967 | -1.9102811287401469, 0.3, 12354.358000000013, 27047.8, 0.53 968 | -2.5823433118063224, 0.31, 12742.807999999995, 24265.2, 0.53 969 | -2.6295462038512984, 0.34, 9513.75, 19561.0, 0.52 970 | -4.176755695405591, 0.43, 8542.954000000005, 19201.8, 0.52 971 | -3.984069863766475, 0.43, 8988.586000000005, 20479.8, 0.51 972 | -3.6354682849525903, 0.44, 7485.0179999999955, 16647.6, 0.51 973 | -4.970683271199732, 0.53, 6122.77, 12180.0, 0.51 974 | -4.588332475090879, 0.47, 7072.881999999995, 13467.4, 0.51 975 | -4.506478035452692, 0.45, 9751.276000000002, 18968.0, 0.51 976 | -3.2405716429816676, 0.35, 9902.19, 20181.0, 0.53 977 | -4.268135934352147, 0.36, 8545.99, 18764.0, 0.53 978 | -5.552766254311937, 0.53, 7748.168, 13859.6, 0.49 979 | -2.403259281311092, 0.3, 10259.057999999999, 21859.0, 0.53 980 | -3.3696767802609555, 0.4, 10442.637999999999, 22642.6, 0.53 981 | -2.729870955681197, 0.32, 9536.42400000001, 20369.4, 0.53 982 | -3.090160938673611, 0.42, 8775.575999999997, 18424.6, 0.53 983 | -4.663332217039182, 0.51, 9122.349999999999, 19764.0, 0.5 984 | -4.96190339363056, 0.48, 7437.74, 16532.0, 0.52 985 | -2.586783292573324, 0.32, 11610.972, 24043.6, 0.54 986 | -3.467121243942768, 0.44, 9628.086, 20097.4, 0.52 987 | -3.2132695749957434, 0.39, 8675.673999999999, 17941.0, 0.52 988 | -4.266392221811341, 0.49, 6762.982, 13638.4, 0.51 989 | -3.1594850206132423, 0.41, 12934.034, 27507.4, 0.53 990 | -2.180124963983097, 0.32, 7145.95, 14450, 0.53 991 | -1.1622101724024727, 0.26, 10277.043999999985, 21260.2, 0.54 992 | -1.2247005210825523, 0.29, 12543.982000000002, 24505.6, 0.54 993 | -1.1328472946149335, 0.2, 15061.864000000001, 30619.6, 0.55 994 | -0.2657858203043188, 0.15, 14836.331999999997, 30844.4, 0.55 995 | -1.371358862379802, 0.21, 17254.650000000005, 34192.6, 0.54 996 | -1.0316128443978905, 0.21, 16437.352000000006, 34110.0, 0.56 997 | -1.3722269419631383, 0.25, 14103.823999999986, 27692.4, 0.54 998 | -2.438914249624182, 0.34, 11318.58, 21756.8, 0.53 999 | -1.1669030218945746, 0.22, 17443.54, 37347.2, 0.53 1000 | -3.024367137279404, 0.36, 12705.730000000003, 25393.4, 0.52 1001 | -3.5732665701190705, 0.4, 13827.386000000004, 26821.0, 0.52 1002 | -1.6668157878668781, 0.3, 8429.587999999996, 18264.6, 0.53 1003 | -1.9039613235737405, 0.25, 14647.636, 31494.4, 0.54 1004 | -2.4348507215664883, 0.28, 13597.970000000003, 30072.0, 0.54 1005 | -4.177983605862929, 0.49, 9577.791999999998, 20479.6, 0.51 1006 | -2.1833344339392813, 0.31, 11572.028000000002, 24672.8, 0.52 1007 | -1.2900325550936957, 0.23, 17032.682, 34517.4, 0.54 1008 | -3.431512313974453, 0.33, 10688.604000000003, 21027.6, 0.52 1009 | -2.0940437046565674, 0.27, 9700.648, 19319.4, 0.54 1010 | -2.197492320972743, 0.37, 12095.412000000002, 24349.8, 0.52 1011 | -2.8840441066057347, 0.35, 9240.88, 19327.4, 0.53 1012 | -1.9392758498341078, 0.27, 11914.817999999996, 25693.4, 0.54 1013 | -3.5674940128224, 0.38, 10506.278000000002, 23755.0, 0.53 1014 | -3.9469523689666226, 0.46, 7747.983999999997, 17194.0, 0.51 1015 | -2.482043466144738, 0.28, 12606.28999999999, 30583.4, 0.53 1016 | -2.5115025949347016, 0.34, 9000.350000000002, 20339.2, 0.52 1017 | -2.0608446449820432, 0.33, 13277.423999999999, 26505.2, 0.51 1018 | -1.849011516443291, 0.36, 11286.541999999994, 24949.2, 0.52 1019 | -2.9807340457471203, 0.38, 8590.978000000005, 18345.2, 0.52 1020 | -2.844011224463321, 0.42, 9790.805999999999, 19458.0, 0.51 1021 | -3.7098490951564655, 0.43, 10619.357999999998, 23114.6, 0.51 1022 | -3.8160725426075985, 0.42, 10591.805999999999, 23109.8, 0.52 1023 | -3.192912792163079, 0.42, 10611.998000000007, 21092.0, 0.53 1024 | -4.148398737775413, 0.46, 7764.450000000003, 16561.8, 0.51 1025 | -3.983771989354254, 0.47, 8683.478000000003, 17109.0, 0.51 1026 | -1.984534370694349, 0.35, 13980.567999999994, 28158.0, 0.52 1027 | -4.691901487705998, 0.52, 8197.564000000006, 16140.6, 0.51 1028 | -5.576579768530324, 0.59, 5388.4, 12298.6, 0.51 1029 | -4.757087317323203, 0.52, 6140.7100000000055, 12876.8, 0.51 1030 | -3.3450172373931455, 0.39, 10136.008000000005, 21004.0, 0.53 1031 | -2.4742834472704973, 0.29, 11901.354, 25021.2, 0.54 1032 | -3.984797692589424, 0.44, 11277.470000000007, 23385.6, 0.53 1033 | -2.4008864903102496, 0.22, 13176.69400000001, 27774.6, 0.54 1034 | -4.2450800785128635, 0.4, 11189.195999999998, 21728.6, 0.53 1035 | -4.908530111683465, 0.52, 7242.183999999996, 16183.2, 0.52 1036 | -4.3645426420473985, 0.44, 12031.65799999999, 26008.2, 0.52 1037 | -3.9070621335319196, 0.43, 12293.894000000008, 25958.6, 0.52 1038 | -2.5873119813663203, 0.34, 12178.706, 24623.4, 0.53 1039 | -4.030481194938293, 0.48, 10097.128000000004, 21954.8, 0.52 1040 | -2.50040285498222, 0.32, 12244.232000000007, 25972.4, 0.53 1041 | -0.6952092688554614, 0.24, 17504.066000000006, 33376.0, 0.54 1042 | -2.21551986190118, 0.34, 9677.734000000002, 22207.8, 0.53 1043 | -3.4614980494302716, 0.39, 11170.024000000001, 25002.4, 0.53 1044 | -3.7208570650170225, 0.41, 9547.222000000002, 21649.0, 0.52 1045 | -2.677472549922075, 0.31, 13094.710000000003, 26637.8, 0.53 1046 | -3.2215145029496237, 0.31, 13157.124000000005, 28682.6, 0.53 1047 | -2.744999853118845, 0.37, 11767.947999999999, 27325.4, 0.53 1048 | -4.035894125045421, 0.49, 11777.461999999998, 23312.6, 0.51 1049 | -1.9467883222628666, 0.26, 19270.460000000014, 41851.0, 0.54 1050 | -3.3225217696206433, 0.44, 11045.564000000006, 23828.8, 0.52 1051 | -3.436744536372571, 0.37, 12016.537999999995, 26584.8, 0.52 1052 | -1.3589269003320164, 0.21, 18696.562000000005, 39377.4, 0.54 1053 | 0.49934221486679337, 0.12, 19465.873999999993, 40796.2, 0.54 1054 | -0.08952715087081643, 0.15, 18031.728, 37827.4, 0.55 1055 | -1.5072975309130563, 0.2, 17868.27, 37583.8, 0.54 1056 | 0.5782540536619527, 0.13, 17958.304, 38014.6, 0.55 1057 | -1.3063495800391973, 0.31, 12829.884000000004, 29810.8, 0.53 1058 | -0.9956301545186705, 0.2, 17656.208, 39034.6, 0.53 1059 | 0.5377259062847428, 0.09, 17314.406000000003, 36781.4, 0.55 1060 | 0.2072151206679343, 0.14, 17101.89600000001, 35785.6, 0.54 1061 | 0.7106304876285751, 0.12, 17244.163999999993, 34808.8, 0.55 1062 | -1.5804711034376095, 0.28, 12949.343999999997, 27788.8, 0.54 1063 | 0.1903009645375343, 0.17, 20853.78599999999, 45529.8, 0.54 1064 | -0.8211672465145324, 0.24, 16415.514000000003, 33590.2, 0.54 1065 | 0.4412404428264687, 0.15, 16889.339999999997, 36519.2, 0.55 1066 | -0.26414949887376604, 0.13, 19067.133999999995, 40715.0, 0.55 1067 | 1.4675115738524307, 0.11, 13209.842000000002, 25506.6, 0.55 1068 | 1.0458075198404402, 0.09, 25983.861999999994, 49771.0, 0.55 1069 | -0.06534371774400884, 0.23, 9325.624000000005, 18758.4, 0.52 1070 | 1.7172618472094447, 0.06, 18640.178, 39672.0, 0.55 1071 | 0.6140247173964777, 0.13, 18520.528000000006, 38399.2, 0.55 1072 | 1.7648019859864759, 0.05, 17895.211999999996, 34619.8, 0.55 1073 | 0.8924754894949772, 0.02, 13790.680000000002, 28052.0, 0.55 1074 | 2.3592854166196786, 0.0, 23624.468000000008, 49376.0, 0.56 1075 | 1.7959321132582986, 0.0, 16527.162, 34468.0, 0.56 1076 | 2.0740285718522586, 0.03, 19818.516000000007, 43016.4, 0.55 1077 | 0.473599153479387, 0.12, 19625.339999999993, 46196.4, 0.56 1078 | 0.7843868431128933, 0.05, 17785.461999999996, 36171.8, 0.56 1079 | 2.195098264881231, 0.03, 21942.59800000001, 44398.2, 0.55 1080 | 1.8459773425989476, 0.02, 20254.276, 41757.6, 0.56 1081 | 0.43437704498034607, 0.12, 18671.924, 39312.8, 0.55 1082 | 0.6512083652210993, 0.08, 17193.138000000006, 35785.8, 0.55 1083 | 0.7066424707288221, 0.08, 20725.6, 44278.4, 0.54 1084 | 1.1739007820889622, 0.0, 20863.661999999997, 42066.0, 0.56 1085 | -2.2094251294722325, 0.33, 15239.040000000003, 29889.8, 0.53 1086 | 2.1649794239457982, 0.01, 19508.266000000003, 39206.2, 0.57 1087 | 2.4612105538531104, 0.03, 16393.311999999998, 33941.4, 0.56 1088 | 1.9720127022782612, 0.07, 11967.708000000006, 24423.8, 0.54 1089 | 1.7177712493276693, 0.1, 12244.389999999998, 26227.6, 0.52 1090 | 2.3264825868953904, 0.0, 20891.878, 44509.8, 0.56 1091 | 2.5242882232262223, 0.01, 20742.432, 44669.6, 0.57 1092 | 1.6230367584475112, 0.02, 18102.350000000002, 37008.6, 0.55 1093 | 1.2414037267120244, 0.02, 20453.857999999997, 41927.2, 0.56 1094 | 2.2195350968960703, 0.01, 21877.923999999995, 43661.6, 0.56 1095 | 1.6654029763395506, 0.03, 19246.656000000003, 41012.6, 0.56 1096 | 2.1763807041033556, 0.0, 23573.647999999997, 49364.2, 0.56 1097 | 1.8165886986736461, 0.02, 16468.694, 34019.0, 0.55 1098 | 1.4524125590557815, 0.03, 20997.638000000006, 45971.8, 0.56 1099 | 2.1255550421078326, 0.0, 26038.481999999993, 53615.6, 0.55 1100 | 2.149447247525459, 0.01, 21913.821999999996, 44585.6, 0.57 1101 | 2.2723351792443482, 0.0, 25377.76, 54056.4, 0.57 1102 | 2.045073630245083, 0.02, 23045.041999999998, 47103.8, 0.56 1103 | 2.278078088719155, 0.04, 13807.19, 28361.0, 0.55 1104 | 1.9192069250684423, 0.03, 18612.600000000002, 39830.6, 0.55 1105 | 1.8099161268848762, 0.04, 19152.05, 38767.6, 0.56 1106 | 1.0914453944634679, 0.14, 11810.138000000004, 24854.0, 0.52 1107 | 1.4023052192096943, 0.05, 19589.984, 38706.6, 0.56 1108 | 0.9522565462207586, 0.12, 15889.314000000002, 29849.6, 0.53 1109 | 2.2994518030856246, 0.04, 17689.44599999998, 39570.4, 0.55 1110 | 2.018021929875346, 0.06, 18602.426000000003, 37377.2, 0.55 1111 | 2.540069707406378, 0.04, 16286.862000000001, 32617.4, 0.56 1112 | 2.068353233510681, 0.02, 21711.695999999996, 42959.8, 0.56 1113 | 2.1479250413396627, 0.01, 19634.830000000005, 40794.8, 0.56 1114 | 1.4399396060923657, 0.02, 17325.441999999995, 36178.2, 0.56 1115 | 2.0996312015672745, 0.03, 15705.020000000002, 31591.0, 0.56 1116 | 2.3824949380912623, 0.03, 23934.874, 49382.0, 0.55 1117 | 1.9903217737611811, 0.1, 10508.030000000002, 22140.8, 0.53 1118 | 0.6404316815222479, 0.08, 26457.12399999999, 54288.0, 0.55 1119 | 1.2393641440300882, 0.09, 13896.040000000005, 28099.6, 0.54 1120 | -0.14594752056708338, 0.1, 20157.845999999998, 42656.4, 0.56 1121 | 1.6501099266752288, 0.03, 21586.866000000005, 44065.0, 0.56 1122 | 1.706044569417539, 0.09, 21400.42200000001, 43187.6, 0.56 1123 | 1.4216636851479225, 0.09, 17946.616, 41259.0, 0.56 1124 | 0.8713479994155677, 0.14, 14243.222, 31142.8, 0.54 1125 | 2.574969378366017, 0.01, 18745.692, 39393.8, 0.56 1126 | 1.5317014242122042, 0.05, 22518.972000000005, 46336.4, 0.55 1127 | 2.0285447814668056, 0.03, 18930.028000000006, 39140.8, 0.56 1128 | 0.3543610820667156, 0.17, 20013.918000000005, 43633.2, 0.54 1129 | 2.207866941083349, 0.05, 19882.035999999986, 39600.2, 0.56 1130 | 1.8787796903838503, 0.1, 17845.314, 38124.0, 0.57 1131 | 1.889585896315888, 0.06, 22383.316000000006, 46692.2, 0.55 1132 | 2.4409102868525467, 0.06, 17805.002, 36701.4, 0.56 1133 | 2.1216284501173415, 0.06, 19047.494000000002, 38989.4, 0.56 1134 | 1.7358135262811019, 0.04, 17235.908000000003, 35214.0, 0.55 1135 | 2.089220742474885, 0.01, 19920.94, 39309.0, 0.56 1136 | 2.7035306288655234, 0.02, 22658.49, 46584.4, 0.57 1137 | 1.9016057678790352, 0.07, 21300.507999999987, 44364.6, 0.56 1138 | 2.340299386245006, 0.04, 16087.814000000002, 33895.6, 0.54 1139 | 2.516601197935256, 0.0, 20199.534, 41375.0, 0.56 1140 | 1.347214430427482, 0.06, 22136.979999999992, 46357.4, 0.56 1141 | 1.9212145955788915, 0.07, 20003.789999999997, 38628.0, 0.55 1142 | 0.8636067882888275, 0.02, 19822.56, 40416.0, 0.56 1143 | 0.3440894789080812, 0.07, 21512.213999999993, 44365.4, 0.55 1144 | 1.4627924380838082, 0.01, 19252.039999999997, 39981.8, 0.57 1145 | 1.400992452654566, 0.03, 20289.406000000006, 45260.6, 0.55 1146 | 0.2842764892768825, 0.13, 16686.057999999997, 36765.4, 0.54 1147 | 2.3045598780864047, 0.02, 18147.41999999999, 38616.4, 0.56 1148 | 1.0073835101486528, 0.1, 18282.019999999997, 38349.8, 0.55 1149 | 1.867563650999138, 0.03, 20023.352, 40687.6, 0.56 1150 | 1.325796516575589, 0.02, 19081.416000000005, 39146.6, 0.56 1151 | -0.25961572569978153, 0.17, 13886.273999999998, 30864.6, 0.54 1152 | 0.7607852961707596, 0.04, 21141.705999999995, 44377.4, 0.58 1153 | 2.0824375532755584, 0.03, 20206.936, 40797.4, 0.56 1154 | 2.1707615541481213, 0.03, 20481.49999999999, 42135.0, 0.56 1155 | 1.6148314350069135, 0.12, 14595.38, 29558.6, 0.54 1156 | 1.5479235501418298, 0.02, 19788.686000000005, 42451.8, 0.56 1157 | 2.781744933916571, 0.01, 21047.930000000004, 45191.0, 0.56 1158 | 1.9359521892943672, 0.01, 21561.844000000005, 44937.2, 0.56 1159 | 1.5207946285767986, 0.02, 20644.350000000006, 43415.6, 0.56 1160 | 0.33376403750867456, 0.11, 16560.484, 35267.4, 0.55 1161 | 1.5285685262127757, 0.08, 17225.505999999994, 36098.8, 0.55 1162 | 1.4871120009196568, 0.07, 16958.361999999997, 35862.0, 0.55 1163 | 0.9329127678317031, 0.09, 20435.054, 44580.4, 0.56 1164 | 0.060216070184913165, 0.12, 13760.416000000003, 28210.8, 0.55 1165 | 1.5340068436385892, 0.11, 11707.886, 24896.2, 0.54 1166 | 1.5793269176715563, 0.1, 16052.095999999998, 33245.0, 0.55 1167 | 0.9013517674255996, 0.12, 15260.573999999999, 31078.6, 0.55 1168 | 1.1591269649808356, 0.12, 16559.304000000007, 34155.4, 0.55 1169 | 1.3298847587921654, 0.09, 13420.948000000002, 27711.6, 0.55 1170 | 1.6562642045606528, 0.06, 17710.21, 36950.2, 0.55 1171 | 2.4507659071683805, 0.05, 19391.089999999997, 37891.2, 0.54 1172 | 1.960532797808211, 0.09, 19456.134, 40765.0, 0.55 1173 | 0.638861551072869, 0.08, 14938.346000000001, 30023.0, 0.55 1174 | 1.417856079089117, 0.07, 20327.638, 41569.4, 0.55 1175 | 2.115653785162341, 0.02, 17637.896000000008, 36563.8, 0.56 1176 | 1.5998820256202273, 0.06, 18538.860000000008, 39024.6, 0.56 1177 | 0.022374675717100372, 0.17, 13568.067999999996, 27618.0, 0.53 1178 | 0.8723280821738988, 0.12, 14459.7, 28796.0, 0.54 1179 | 1.523989312370591, 0.01, 20391.758000000005, 41417.2, 0.56 1180 | 1.6751782199745662, 0.03, 22759.676000000007, 47057.0, 0.56 1181 | 0.906492460229876, 0.11, 12736.939999999993, 25321.0, 0.55 1182 | 1.4058615522902616, 0.0, 19858.302000000007, 40044.6, 0.55 1183 | 0.8935205009545796, 0.08, 14546.474000000002, 30410.4, 0.54 1184 | 0.3982230108755199, 0.14, 15632.234000000011, 35037.8, 0.54 1185 | 1.1648650002068779, 0.1, 14354.720000000003, 29009.6, 0.54 1186 | 0.26630916864971416, 0.16, 12783.916000000001, 26769.0, 0.54 1187 | 0.9769085952371772, 0.1, 13819.667999999998, 27834.2, 0.54 1188 | 1.1637212596794209, 0.13, 14522.127999999999, 30045.2, 0.55 1189 | 1.7417753335896535, 0.04, 17812.510000000006, 36061.2, 0.54 1190 | 2.8232607404916554, 0.03, 19885.195999999993, 39935.6, 0.56 1191 | 1.4957556397401541, 0.1, 14044.964000000002, 29283.8, 0.55 1192 | 1.7702984011233593, 0.05, 15216.758000000003, 29955.2, 0.55 1193 | 1.9243819889668052, 0.07, 13112.056, 28124.2, 0.53 1194 | 1.8133239634686935, 0.11, 12259.789999999997, 24253.8, 0.53 1195 | 2.345011806878554, 0.03, 17552.82799999999, 35438.2, 0.56 1196 | 2.0285487492508403, 0.03, 22153.612, 46921.4, 0.56 1197 | 1.9336381740388875, 0.02, 17667.076, 36422.8, 0.56 1198 | 1.976378784711378, 0.06, 17526.812, 37463.6, 0.55 1199 | 1.9151059184747072, 0.08, 11924.786, 24278.4, 0.54 1200 | 1.758701542371063, 0.1, 13578.123999999994, 27642.4, 0.53 1201 | 1.878708981836663, 0.09, 12286.876000000004, 24327.8, 0.54 1202 | 1.9931906814847489, 0.05, 17414.688, 36098.0, 0.55 1203 | 2.248685418175602, 0.02, 13817.687999999998, 28014.2, 0.55 1204 | 1.571075861862559, 0.08, 16394.383999999995, 34702.2, 0.56 1205 | 2.0918290872811895, 0.06, 19792.661999999993, 40237.8, 0.55 1206 | 2.278898992476766, 0.06, 19034.552000000007, 37970.0, 0.55 1207 | 1.119872573748757, 0.07, 17924.411999999997, 36944.8, 0.56 1208 | 1.5503712076242602, 0.06, 17345.074000000004, 34978.6, 0.57 1209 | 0.9671690976986353, 0.13, 15977.795999999998, 32944.6, 0.54 1210 | 2.2644656308898705, 0.03, 20254.105999999992, 41040.4, 0.57 1211 | 1.9793050423371787, 0.01, 21779.526, 42755.2, 0.56 1212 | 0.901373797805781, 0.08, 18482.88, 39020.0, 0.54 1213 | 1.5063639689586885, 0.02, 18385.349999999995, 38948.0, 0.56 1214 | 2.185311097806319, 0.01, 20945.163999999997, 42472.6, 0.56 1215 | 2.1338541988077964, 0.06, 13510.042000000007, 30367.0, 0.55 1216 | 1.1568235751467786, 0.12, 20123.012000000006, 44579.6, 0.55 1217 | 2.193740672758628, 0.02, 21734.13599999999, 44096.0, 0.56 1218 | 1.451922905089931, 0.08, 20871.032000000007, 40076.4, 0.55 1219 | 1.8522621729691142, 0.09, 15822.282000000001, 31727.6, 0.55 1220 | 1.5793013054831768, 0.07, 18388.203999999998, 38925.2, 0.55 1221 | 1.8007628686514296, 0.03, 19561.342, 39744.2, 0.56 1222 | 2.418332780715424, 0.0, 21828.164000000008, 45932.6, 0.55 1223 | 2.141078064222662, 0.02, 19776.228000000003, 42887.8, 0.57 1224 | 1.5193881307794799, 0.09, 21888.0, 45024.0, 0.55 1225 | 1.945632428265557, 0.05, 22858.834000000003, 45196.2, 0.57 1226 | 1.8569100179746594, 0.04, 18063.65, 37753.0, 0.56 1227 | 1.8429704194009426, 0.05, 21063.584000000003, 46964.8, 0.55 1228 | 1.325014635123446, 0.13, 19021.194000000003, 41056.8, 0.55 1229 | 1.6061312714075593, 0.06, 21545.672, 46840.0, 0.55 1230 | 2.4853736130695494, 0.03, 22528.98, 46764.6, 0.56 1231 | 1.6175973299030744, 0.04, 22492.734, 47079.4, 0.56 1232 | 1.0242899328440187, 0.15, 21050.380000000005, 42677.8, 0.54 1233 | 1.607770881297847, 0.05, 24678.453999999998, 51072.4, 0.56 1234 | 1.2398230545841384, 0.07, 21189.474000000002, 43258.4, 0.56 1235 | 2.0695783266746117, 0.05, 25506.324, 51277.2, 0.55 1236 | 2.1470720725386747, 0.04, 18999.130000000005, 38496.6, 0.55 1237 | 2.028991355430471, 0.07, 16992.266, 34199.6, 0.56 1238 | 1.5979115811639866, 0.1, 15102.739999999998, 31863.4, 0.54 1239 | 2.6191873933701917, 0.02, 15254.681999999999, 30306.6, 0.56 1240 | 2.295923511289483, 0.06, 17642.292, 36863.2, 0.56 1241 | 1.2578071821200896, 0.04, 19547.170000000002, 40335.2, 0.56 1242 | 0.3484277884447595, 0.08, 18432.982000000004, 37316.4, 0.56 1243 | 1.917528570731653, 0.06, 19245.786000000004, 40599.8, 0.55 1244 | 1.0825756320071058, 0.1, 19182.188000000002, 40991.8, 0.56 1245 | 2.4910567922151476, 0.03, 19425.366, 39774.4, 0.55 1246 | 2.454450961353649, 0.02, 18793.944000000007, 38511.6, 0.55 1247 | 2.1173610764505493, 0.09, 14857.408000000012, 29615.6, 0.55 1248 | 1.7934023092470053, 0.13, 16951.16, 37377.4, 0.55 1249 | 1.4115013912110967, 0.06, 18662.446000000007, 37163.2, 0.55 1250 | 1.2150962323215784, 0.08, 18284.620000000006, 36545.0, 0.55 1251 | 1.6159281136481523, 0.04, 19517.022, 40773.0, 0.55 1252 | 2.1467662004508825, 0.04, 20175.058000000008, 40203.6, 0.56 1253 | 0.4341562336687369, 0.15, 16270.359999999995, 33591.4, 0.54 1254 | 2.0191684412158697, 0.06, 17353.554, 36061.4, 0.56 1255 | -0.18320894644721725, 0.17, 15820.599999999999, 33394.4, 0.53 1256 | 1.5895948684021928, 0.05, 16996.197999999997, 34024.0, 0.55 1257 | 1.1380695365019138, 0.15, 15233.160000000002, 31287.8, 0.55 1258 | 0.464690713968673, 0.11, 18546.071999999996, 36015.8, 0.59 1259 | 2.3325244885446863, 0.03, 15500.956000000004, 31631.6, 0.56 1260 | 1.799985438066969, 0.03, 20219.109999999993, 41920.4, 0.57 1261 | 2.037254562190462, 0.04, 15720.334, 31494.4, 0.55 1262 | 1.6378964877269948, 0.03, 18661.072, 39210.6, 0.55 1263 | 1.353430830700763, 0.08, 19837.850000000002, 42904.2, 0.55 1264 | 1.5613218439602943, 0.04, 20504.319999999996, 43456.0, 0.57 1265 | 2.1499629749650047, 0.0, 22441.73, 45374.0, 0.56 1266 | 2.3994753188543827, 0.01, 21923.180000000004, 45534.8, 0.56 1267 | 1.7342195846197361, 0.04, 20367.621999999996, 43054.0, 0.56 1268 | 1.573636857934915, 0.01, 23128.321999999996, 47691.0, 0.56 1269 | 2.0968515203159237, 0.06, 19697.651999999995, 40532.0, 0.56 1270 | 1.7746590753555438, 0.04, 20904.249999999996, 42000.2, 0.58 1271 | 2.574847908614351, 0.02, 24138.254000000004, 51321.4, 0.56 1272 | 2.2845756280170697, 0.04, 17847.252, 39366.8, 0.55 1273 | 2.4295412645306502, 0.02, 20270.40599999999, 43501.0, 0.56 1274 | 2.5827978886550618, 0.01, 19392.255999999998, 40170.2, 0.56 1275 | 1.9120767266957177, 0.03, 25209.099999999995, 50448.6, 0.55 1276 | 1.2774636426797952, 0.03, 20758.188000000002, 43612.4, 0.55 1277 | 1.623742232412813, 0.07, 22092.453999999998, 49317.0, 0.56 1278 | 2.518123085853419, 0.01, 24976.378000000008, 50558.2, 0.56 1279 | 0.7377444956616067, 0.11, 20386.252000000004, 40343.0, 0.55 1280 | 0.6565100822572082, 0.05, 24051.41400000001, 51418.6, 0.56 1281 | 0.9129792037771857, 0.06, 23998.393999999993, 51493.0, 0.55 1282 | 0.33820613480031886, 0.09, 22582.930000000004, 48085.6, 0.56 1283 | 2.122033591730405, 0.0, 26685.757999999987, 55671.8, 0.56 1284 | -0.9555755941728566, 0.16, 16916.023999999994, 35644.0, 0.55 1285 | 1.1372800373647562, 0.1, 20076.906000000006, 41391.6, 0.55 1286 | 0.25884523822815036, 0.11, 21268.257999999987, 43065.2, 0.55 1287 | 1.542067435400081, 0.04, 20565.326, 43310.0, 0.56 1288 | 1.6090790319478896, 0.0, 23339.65599999999, 48426.2, 0.56 1289 | 1.3635242265191203, 0.03, 25431.424, 54248.8, 0.56 1290 | 1.7126363158263818, 0.01, 20724.658000000007, 42799.6, 0.56 1291 | 0.7098390001903483, 0.08, 20057.811999999998, 43172.6, 0.56 1292 | 1.7641866944988929, 0.02, 24805.008, 50331.6, 0.55 1293 | -0.11352442459356434, 0.06, 19041.944, 41474.8, 0.56 1294 | 0.3665431094084744, 0.05, 20453.358000000004, 41738.0, 0.54 1295 | 1.2980866398386761, 0.02, 19543.813999999995, 40982.4, 0.56 1296 | 1.1067714895509564, 0.01, 21351.285999999996, 42954.2, 0.56 1297 | 2.0548424785410333, 0.01, 14789.366000000002, 31975.8, 0.56 1298 | 1.9593760231029103, 0.0, 19221.34999999999, 39857.2, 0.56 1299 | 2.2985172180299753, 0.01, 20976.108000000007, 45771.8, 0.56 1300 | 1.9748894012128029, 0.04, 19749.634000000002, 38848.2, 0.57 1301 | 1.6842824869600763, 0.05, 20733.71999999999, 40707.0, 0.55 1302 | 0.8996235001208421, 0.05, 20181.414, 41987.2, 0.56 1303 | 1.2400562242146993, 0.06, 16421.66, 31016.6, 0.55 1304 | 2.0093330959233064, 0.0, 25834.406000000003, 54059.6, 0.56 1305 | 2.3501116497157155, 0.0, 25706.643999999993, 53341.8, 0.56 1306 | 1.7723086515214388, 0.03, 16610.939999999995, 33089.4, 0.55 1307 | 1.4541648207442293, 0.02, 21233.638000000003, 41926.8, 0.55 1308 | 1.6064027936923935, 0.07, 17214.823999999993, 34400.6, 0.54 1309 | 1.350545896500039, 0.05, 19475.84400000001, 37098.2, 0.55 1310 | 2.211692220107009, 0.0, 23483.98, 47600.0, 0.57 1311 | 2.3624819515132973, 0.02, 24087.710000000006, 47602.2, 0.56 1312 | 2.2349777380434888, 0.02, 25932.744000000002, 52502.0, 0.55 1313 | 2.1128296973980305, 0.0, 26254.892000000007, 53440.2, 0.57 1314 | 1.304736039209589, 0.03, 21744.264000000014, 45004.2, 0.56 1315 | 1.9480525488535372, 0.01, 22724.91, 46108.0, 0.57 1316 | 1.7115864137480568, 0.04, 21940.723999999984, 44276.0, 0.56 1317 | 2.2884284175926437, 0.0, 25760.63599999999, 52027.8, 0.56 1318 | 1.5034906991497672, 0.01, 26943.343999999994, 56922.0, 0.56 1319 | 2.2350022701142667, 0.04, 21630.50400000001, 43234.2, 0.55 1320 | 1.3124197395159127, 0.01, 24622.41799999999, 50538.0, 0.55 1321 | 1.1428473385318227, 0.04, 19452.99399999999, 41303.0, 0.55 1322 | -0.43744668642672196, 0.05, 21923.201999999994, 46648.0, 0.55 1323 | 0.6219395981066351, 0.07, 20841.636000000002, 42326.0, 0.55 1324 | 1.5003652018832399, 0.01, 18787.093999999994, 39354.4, 0.55 1325 | 1.8520267155808718, 0.05, 17436.485999999997, 34946.4, 0.56 1326 | 1.450061788762106, 0.02, 18907.402000000006, 38099.0, 0.55 1327 | 2.539373200022498, 0.02, 19885.746, 40676.6, 0.56 1328 | 0.2346141631316231, 0.08, 17824.017999999996, 39379.2, 0.55 1329 | 1.2422317100479172, 0.03, 21270.035999999996, 42887.0, 0.56 1330 | 2.6050695831226984, 0.0, 21334.464000000007, 44131.6, 0.57 1331 | 2.4772152849588527, 0.01, 18868.872000000007, 39361.4, 0.56 1332 | 1.5075121625831718, 0.07, 14362.778000000002, 28264.6, 0.55 1333 | 1.3914786131381234, 0.06, 15740.950000000003, 33169.8, 0.55 1334 | 2.3833795000111153, 0.03, 16234.146, 34024.8, 0.56 1335 | 2.6482707380493826, 0.0, 18694.032, 39684.6, 0.57 1336 | 2.394695871421539, 0.01, 23585.075999999997, 49636.8, 0.56 1337 | 1.844734141396425, 0.02, 19602.825999999997, 40856.6, 0.57 1338 | -0.2402501618563042, 0.06, 16072.376, 34589.4, 0.55 1339 | 2.490542803729693, 0.0, 17077.408, 35295.0, 0.56 1340 | 1.7991058568483929, 0.02, 19577.199999999997, 40638.4, 0.55 1341 | 1.9155481388162954, 0.02, 19202.42400000001, 41029.6, 0.56 1342 | 2.259966155567818, 0.0, 22870.540000000005, 47045.6, 0.57 1343 | 2.6156524580751426, 0.01, 14724.679999999995, 31326.8, 0.56 1344 | 1.8419414970848478, 0.0, 20524.156, 41705.0, 0.56 1345 | 0.662145572828711, 0.08, 17722.454000000005, 37172.6, 0.56 1346 | -1.7823469751570866, 0.3, 10783.037999999999, 22392.8, 0.52 1347 | -0.4118065860868034, 0.06, 18597.560000000005, 39127.6, 0.55 1348 | -2.154014634956623, 0.33, 12394.307999999986, 25124.2, 0.54 1349 | 0.40816807067263683, 0.13, 19041.729999999996, 39058.4, 0.55 1350 | -1.2069120901125192, 0.3, 12872.227999999996, 28141.6, 0.53 1351 | -0.8960857861865459, 0.09, 14809.772000000006, 31327.6, 0.56 1352 | -1.244923257317818, 0.24, 11444.222000000007, 24385.4, 0.54 1353 | -2.5756169999596374, 0.29, 10896.021999999999, 20354.2, 0.52 1354 | -2.925002291222575, 0.26, 12534.868000000002, 24497.0, 0.53 1355 | -0.8770042163234082, 0.22, 8434.072000000006, 17006.2, 0.55 1356 | -1.6740771431247365, 0.18, 14727.956000000004, 32077.8, 0.54 1357 | -1.378221323128181, 0.19, 14931.936000000002, 28388.8, 0.54 1358 | 1.6417953365412554, 0.04, 22138.420000000006, 47329.0, 0.56 1359 | 0.19240746039718007, 0.04, 16068.788, 33629.2, 0.55 1360 | -0.13335461808129412, 0.14, 20461.033999999996, 42958.8, 0.55 1361 | 0.5406191788873106, 0.1, 14467.338000000003, 29188.8, 0.55 1362 | -0.7188286242311501, 0.22, 18290.402, 36024.8, 0.54 1363 | -4.617406937617581, 0.4, 8558.587999999994, 17347.6, 0.52 1364 | -1.5992980375570474, 0.25, 8861.543999999994, 18311.6, 0.54 1365 | -2.077833483776357, 0.23, 12135.618000000002, 24503.0, 0.53 1366 | -1.2804119295312577, 0.21, 11864.430000000004, 25763.0, 0.54 1367 | -2.0714498498900435, 0.29, 14499.933999999994, 30552.4, 0.54 1368 | -0.739835631927394, 0.15, 13869.337999999998, 27521.4, 0.56 1369 | 0.2799421056428982, 0.14, 12868.96, 27248.4, 0.55 1370 | -4.778391697802174, 0.48, 6349.911999999999, 12552.8, 0.52 1371 | -6.727893134535523, 0.66, 3243.6, 7055, 0.49 1372 | -5.414914247141476, 0.51, 5791.68, 10747.0, 0.51 1373 | -2.8105191867642376, 0.4, 7685.2219999999925, 16770.4, 0.52 1374 | -5.400014168632233, 0.54, 5357.96, 10286.0, 0.5 1375 | -5.127961378130679, 0.52, 5784.75, 11992, 0.51 1376 | -5.0889151741057965, 0.5, 5934.39, 12119, 0.51 1377 | -2.853480819452693, 0.31, 11692.079999999994, 23788.2, 0.53 1378 | -3.4004983521261187, 0.37, 12028.721999999998, 24064.8, 0.52 1379 | -1.4617729412184373, 0.23, 10927.016000000001, 21830.0, 0.53 1380 | -3.4677764707753527, 0.39, 9482.827999999996, 21369.4, 0.52 1381 | -3.1848743538683184, 0.36, 8351.305999999991, 18569.6, 0.52 1382 | -4.010461541286397, 0.42, 8382.85, 17823.4, 0.5 1383 | -6.30160485960722, 0.63, 3796.95, 7735, 0.5 1384 | -3.431678454282409, 0.38, 8429.340000000004, 20041.8, 0.52 1385 | -3.7355683784202824, 0.41, 9086.59600000001, 19704.4, 0.51 1386 | -4.9225424536834, 0.51, 5917.903999999993, 11352.6, 0.51 1387 | -1.771513653965884, 0.26, 11924.998, 23746.4, 0.54 1388 | -5.790903318373082, 0.55, 4446.35, 9435, 0.5 1389 | -5.1991913510194845, 0.58, 8000.241999999995, 14900.6, 0.5 1390 | -5.600674289693948, 0.58, 4027.25, 9235, 0.49 1391 | -7.254758415045229, 0.72, 4027.46, 7102, 0.47 1392 | -7.792364560143867, 0.74, 1961.8, 5355, 0.46 1393 | -7.251420577336296, 0.7, 3083.8, 6205, 0.47 1394 | -7.1885709181725215, 0.71, 2467.55, 6035, 0.48 1395 | -1.3714581934746786, 0.24, 9989.65, 20550, 0.53 1396 | -4.885886209916498, 0.45, 5907.754000000002, 12408.0, 0.51 1397 | -3.321085722628538, 0.43, 5800.861999999995, 12042.6, 0.5 1398 | -4.667009950562121, 0.48, 5700.542000000003, 12202.6, 0.52 1399 | -5.146029577460467, 0.52, 5176.862000000002, 10390.8, 0.5 1400 | -3.7798691002112723, 0.44, 6290.85, 11900, 0.5 1401 | -3.684553578869075, 0.51, 6949.511999999995, 14363.2, 0.5 1402 | -3.8215594669722206, 0.47, 7028.2499999999945, 14616.6, 0.5 1403 | -3.9488136149284454, 0.42, 7746.815999999995, 14759.8, 0.51 1404 | -2.6480884311955015, 0.36, 9282.967999999992, 18821.6, 0.51 1405 | -4.959891081011577, 0.5, 6381.125999999995, 13634.2, 0.5 1406 | -3.9517472677452874, 0.44, 8876.85, 18449.6, 0.51 1407 | -5.118523160300942, 0.54, 5398.945999999996, 11679.8, 0.49 1408 | -4.403760589930814, 0.47, 8295.691999999992, 16430.2, 0.5 1409 | -4.484004343932545, 0.48, 6077.805999999996, 13511.6, 0.51 1410 | -3.3508895226822273, 0.47, 8124.2840000000015, 16410.6, 0.51 1411 | -5.20875327829357, 0.54, 5329.214000000002, 11172.2, 0.49 1412 | -4.727919781995905, 0.49, 5646.392000000008, 12156.4, 0.5 1413 | -5.1531871305046595, 0.56, 4651.037999999994, 10881.6, 0.49 1414 | -5.416467708726666, 0.55, 4685.2, 9435, 0.51 1415 | -5.70255958925672, 0.58, 4615.5, 8755, 0.49 1416 | -4.941060123051892, 0.5, 5106.8, 10455, 0.51 1417 | -5.437201551987104, 0.56, 5620.722000000002, 11049.2, 0.5 1418 | -3.4980482501431056, 0.43, 7569.353999999996, 16168.0, 0.51 1419 | -4.288898486282105, 0.52, 7318.24, 14300, 0.5 1420 | -4.830773181087871, 0.52, 7302.724000000001, 13426.6, 0.51 1421 | -4.300085510373602, 0.38, 9102.472000000003, 18776.6, 0.52 1422 | -5.3869168404733445, 0.54, 5194.393999999995, 10289.8, 0.52 1423 | -2.3534154375472442, 0.34, 10059.925999999996, 20994.2, 0.51 1424 | -1.30425270387954, 0.17, 12692.808000000003, 25820.6, 0.54 1425 | -4.451988581864588, 0.59, 5992.234000000001, 11577.8, 0.49 1426 | -6.954915871884148, 0.7, 3570.17, 8381, 0.48 1427 | -6.538642795383265, 0.64, 3560.65, 7650, 0.47 1428 | -3.7330746791646727, 0.42, 6920.198000000001, 14782.6, 0.5 1429 | -6.477137898662985, 0.67, 5596.33, 11236.2, 0.48 1430 | -2.1529313747278267, 0.26, 10555.576000000003, 20826.6, 0.53 1431 | -4.218015157670314, 0.46, 7853.313999999998, 16837.8, 0.49 1432 | -4.295180042057935, 0.5, 6920.169999999999, 15133.4, 0.5 1433 | -1.6809777121096772, 0.27, 10527.82, 22673.0, 0.52 1434 | -4.288081531014131, 0.43, 7920.361999999999, 16534.2, 0.5 1435 | -3.3191853591923093, 0.39, 11256.353999999998, 22119.2, 0.51 1436 | -3.585047153881656, 0.43, 8063.492000000003, 16381.0, 0.49 1437 | -3.742174555724645, 0.4, 9234.626000000002, 20347.2, 0.51 1438 | -3.126020585585491, 0.36, 13270.183999999994, 29248.0, 0.52 1439 | -2.0956112590750053, 0.23, 13794.887999999999, 29958.4, 0.53 1440 | -4.409373073989287, 0.36, 11030.711999999994, 21355.2, 0.52 1441 | -1.8605785840898292, 0.23, 17425.376000000004, 36605.8, 0.52 1442 | -1.333777074669465, 0.14, 15427.577999999994, 31984.0, 0.54 1443 | -1.3068813529568555, 0.18, 13190.998000000003, 29132.2, 0.53 1444 | -1.9234025936027885, 0.29, 12462.397999999997, 26214.2, 0.53 1445 | -1.3244960382230537, 0.24, 17857.162000000004, 39323.2, 0.53 1446 | -2.000102019670622, 0.23, 14774.003999999999, 29025.4, 0.53 1447 | -2.055676199642992, 0.26, 13439.754, 27545.8, 0.53 1448 | -0.6082498718398063, 0.19, 16445.696, 32487.4, 0.52 1449 | -2.0752764821989205, 0.31, 14703.994000000004, 28964.6, 0.51 1450 | -0.46988930966071024, 0.21, 13971.178, 28922.8, 0.52 1451 | -0.42732576774694075, 0.15, 18042.288000000004, 36731.8, 0.53 1452 | -0.7464683475587465, 0.24, 12783.999999999998, 26832.8, 0.52 1453 | -0.5190440908501559, 0.17, 16028.111999999997, 32151.0, 0.52 1454 | 2.4249711637750244, 0.01, 14208.733999999999, 29896.0, 0.56 1455 | 2.3849428511239226, 0.04, 17109.476000000002, 34829.6, 0.55 1456 | 1.766001334332685, 0.1, 10905.36999999999, 21732.2, 0.53 1457 | 1.4582754183069055, 0.09, 17159.428000000004, 36612.0, 0.54 1458 | 1.2761355674520811, 0.14, 12168.133999999998, 22810.0, 0.53 1459 | 1.5830177216473045, 0.09, 13188.341999999999, 25547.2, 0.53 1460 | 1.2220644029562635, 0.11, 11117.266000000001, 23560.0, 0.53 1461 | 2.026242089211023, 0.09, 12041.598000000004, 23250.2, 0.54 1462 | -0.035132398403364684, 0.22, 10780.684000000001, 21161.8, 0.51 1463 | 0.7832828409666374, 0.08, 11158.518000000004, 22398.0, 0.53 1464 | 0.3615365283427952, 0.19, 9098.247999999998, 19088.2, 0.51 1465 | -0.5187229295064073, 0.23, 11125.354000000001, 21672.6, 0.52 1466 | 2.577004121208319, 0.03, 15464.449999999997, 30849.0, 0.56 1467 | 1.2533697262481671, 0.11, 10904.116000000002, 23108.2, 0.53 1468 | 1.6798179754845413, 0.12, 10449.900000000003, 21596.6, 0.53 1469 | 1.5886281316144355, 0.1, 13120.347999999998, 25783.2, 0.54 1470 | 1.862398259418006, 0.07, 14930.822000000002, 30060.6, 0.55 1471 | -0.03272479606327247, 0.24, 9513.306000000002, 19761.4, 0.5 1472 | 1.3497925509442787, 0.1, 14075.168000000007, 30116.6, 0.54 1473 | 0.40365684917123523, 0.14, 16093.086000000008, 32956.8, 0.55 1474 | 0.05251818759301077, 0.13, 14392.522000000004, 28830.2, 0.55 1475 | 0.3760552200666756, 0.09, 16492.775999999998, 35945.8, 0.55 1476 | 1.1907120038529933, 0.08, 16198.371999999998, 34390.2, 0.55 1477 | 1.7849748065351514, 0.02, 21456.071999999993, 44698.8, 0.56 1478 | 1.7676856486175827, 0.03, 23818.309999999994, 47873.4, 0.55 1479 | 1.3176554095982898, 0.05, 17027.466000000004, 35409.2, 0.55 1480 | -0.4515794971804482, 0.17, 18401.04199999999, 37720.8, 0.55 1481 | 0.8403540176287378, 0.09, 19793.32599999999, 43021.8, 0.55 1482 | 0.5484087985796533, 0.12, 19502.415999999997, 40128.8, 0.55 1483 | 1.65571613293797, 0.12, 15419.249999999998, 31450.0, 0.56 1484 | -0.26460314302252474, 0.2, 12046.130000000005, 25803.6, 0.54 1485 | 2.001391184532253, 0.04, 18444.740000000005, 37126.4, 0.55 1486 | 1.4411455184805289, 0.11, 15503.132, 31223.4, 0.55 1487 | 1.5532635284334146, 0.11, 11671.676000000001, 23751.4, 0.54 1488 | 1.3358399727065213, 0.1, 14694.848, 29402.2, 0.53 1489 | 1.1272144923334262, 0.1, 17454.164000000008, 36856.8, 0.56 1490 | -0.08509562105071108, 0.2, 11862.118, 23183.8, 0.52 1491 | 1.2231069243920645, 0.1, 16369.815999999997, 31918.0, 0.54 1492 | 0.7845806137210666, 0.06, 20279.782000000003, 41714.0, 0.55 1493 | 1.2557863106720188, 0.11, 16039.147999999996, 30707.6, 0.55 1494 | 0.1716853086334721, 0.12, 13263.580000000002, 27165.6, 0.55 1495 | 2.238845528690641, 0.05, 11546.459999999997, 24740.6, 0.54 1496 | 1.1951812083592537, 0.12, 15169.917999999996, 32142.4, 0.54 1497 | 1.6291668634400482, 0.1, 16023.472, 32919.4, 0.55 1498 | 1.8124964131658066, 0.05, 15779.374000000005, 31953.6, 0.56 1499 | -0.10122496490653439, 0.07, 13877.835999999988, 28271.2, 0.54 1500 | 2.203444708311056, 0.07, 16251.620000000006, 32495.2, 0.55 1501 | -------------------------------------------------------------------------------- /plot_error.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Oct 14 18:58:20 2020 4 | 5 | @author: Wei-Cheng Wu 6 | """ 7 | import matplotlib.pyplot as plt 8 | import pandas as pd 9 | import numpy as np 10 | 11 | smooth_rate = 0.1 12 | N = int(1/smooth_rate) 13 | 14 | 15 | def smooth(sequence): 16 | y = sequence[:N-1] 17 | for i in range(len(sequence)-N+1): 18 | y.append(np.mean(sequence[i: i+N])) 19 | return y 20 | 21 | df = pd.read_csv('output.txt', header=None) 22 | df_QQ = pd.read_csv('output_QQ.txt', header=None) 23 | 24 | x = range(df.shape[0]) 25 | 26 | plt.figure(figsize=(10, 7), dpi=600) 27 | 28 | # Random 29 | y1 = smooth(list(df[1])) 30 | plt.plot(x, y1, c='#DB2763', linewidth=2) 31 | 32 | # Brute Force qoe 33 | y2 = smooth(list(df[6])) 34 | plt.plot(x, y2, c='#B0DB43', linewidth=2) 35 | 36 | # Brute Force energy 37 | y3 = smooth(list(df[11])) 38 | plt.plot(x, y3, c='#12EAEA', linewidth=2) 39 | 40 | # DQN-Q2-SFC 41 | y4 = smooth(list(df_QQ[1])) 42 | plt.plot(x, y4, c='#BCE7FD', linewidth=2) 43 | 44 | # DQN-QQE 45 | y5 = smooth(list(df[16])) 46 | plt.plot(x, y5, c='#C492B1', linewidth=2) 47 | 48 | plt.grid() 49 | plt.title('Comparison of Error Rate') 50 | plt.legend(['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 51 | plt.xlabel('Iteration') 52 | plt.ylabel('Error rate (%)') 53 | #plt.savefig('Comparison_error.png') 54 | plt.show() 55 | -------------------------------------------------------------------------------- /plot_error_boxplot.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Oct 14 18:58:20 2020 4 | 5 | @author: Wei-Cheng Wu 6 | """ 7 | import matplotlib.pyplot as plt 8 | import pandas as pd 9 | import numpy as np 10 | 11 | smooth_rate = 0.1 12 | N = int(1/smooth_rate) 13 | 14 | 15 | def smooth(sequence): 16 | y = sequence[:N-1] 17 | for i in range(len(sequence)-N+1): 18 | y.append(np.mean(sequence[i: i+N])) 19 | return y 20 | 21 | df = pd.read_csv('output.txt', header=None) 22 | df_QQ = pd.read_csv('output_QQ.txt', header=None) 23 | 24 | x = range(df.shape[0]) 25 | 26 | fig, ax = plt.subplots(figsize=(10, 7), dpi=600) 27 | 28 | # Random 29 | y1 = smooth(list(df[1])) 30 | 31 | # Brute Force qoe 32 | y2 = smooth(list(df[6])) 33 | 34 | # Brute Force energy 35 | y3 = smooth(list(df[11])) 36 | 37 | # DQN-Q2-SFC 38 | y4 = smooth(list(df_QQ[1])) 39 | 40 | # DQN-QQE 41 | y5 = smooth(list(df[16])) 42 | 43 | bplot = ax.boxplot([y1, y2, y3, y4, y5], labels = ['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], patch_artist = True) 44 | 45 | colors = ['#DB2763', '#B0DB43', '#12EAEA', '#BCE7FD', '#C492B1'] 46 | 47 | # colors 48 | for patch, color in zip(bplot['boxes'], colors): 49 | patch.set_facecolor(color) 50 | 51 | ax.grid(axis='y', linestyle='--') 52 | ax.set_axisbelow(True) 53 | ax.set_title('Comparison of Error Rate') 54 | #plt.legend(['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 55 | #plt.xlabel('Iteration') 56 | ax.set_ylabel('Error rate (%)') 57 | ax.set_ylim([-0.001, 0.65]) 58 | #plt.savefig('Comparison_error.png') 59 | plt.show() 60 | -------------------------------------------------------------------------------- /plot_max_energy.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Oct 14 18:58:20 2020 4 | 5 | @author: Wei-Cheng Wu 6 | """ 7 | import matplotlib.pyplot as plt 8 | import pandas as pd 9 | import numpy as np 10 | 11 | smooth_rate = 0.1 12 | N = int(1/smooth_rate) 13 | 14 | 15 | def smooth(sequence): 16 | y = sequence[:N-1] 17 | for i in range(len(sequence)-N+1): 18 | y.append(np.mean(sequence[i: i+N])) 19 | return y 20 | 21 | df = pd.read_csv('output.txt', header=None) 22 | df_QQ = pd.read_csv('output_QQ.txt', header=None) 23 | 24 | x = range(df.shape[0]) 25 | 26 | plt.figure(figsize=(10, 7), dpi=600) 27 | 28 | # Random 29 | y1 = smooth(list(df[3])) 30 | plt.plot(x, y1, c='#DB2763', linewidth=2) 31 | 32 | # Brute Force qoe 33 | y2 = smooth(list(df[8])) 34 | plt.plot(x, y2, c='#B0DB43', linewidth=2) 35 | 36 | # Brute Force energy 37 | y3 = smooth(list(df[13])) 38 | plt.plot(x, y3, c='#12EAEA', linewidth=2) 39 | 40 | # DQN-Q2-SFC 41 | y4 = smooth(list(df_QQ[3])) 42 | plt.plot(x, y4, c='#BCE7FD', linewidth=2) 43 | 44 | # DQN-QQE 45 | y5 = smooth(list(df[18])) 46 | plt.plot(x, y5, c='#C492B1', linewidth=2) 47 | 48 | plt.grid() 49 | plt.title('Comparison of Maximum Energy') 50 | plt.legend(['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 51 | plt.xlabel('Iteration') 52 | plt.ylabel('Energy Consumption (J)') 53 | #plt.savefig('Comparison_max_energy.png') 54 | plt.show() -------------------------------------------------------------------------------- /plot_max_energy_boxplot.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Oct 14 18:58:20 2020 4 | 5 | @author: Wei-Cheng Wu 6 | """ 7 | import matplotlib.pyplot as plt 8 | import pandas as pd 9 | import numpy as np 10 | 11 | smooth_rate = 0.1 12 | N = int(1/smooth_rate) 13 | 14 | 15 | def smooth(sequence): 16 | y = sequence[:N-1] 17 | for i in range(len(sequence)-N+1): 18 | y.append(np.mean(sequence[i: i+N])) 19 | return y 20 | 21 | df = pd.read_csv('output.txt', header=None) 22 | df_QQ = pd.read_csv('output_QQ.txt', header=None) 23 | 24 | x = range(df.shape[0]) 25 | 26 | fig, ax = plt.subplots(figsize=(10, 7), dpi=600) 27 | 28 | # Random 29 | y1 = smooth(list(df[3])) 30 | 31 | # Brute Force qoe 32 | y2 = smooth(list(df[8])) 33 | 34 | # Brute Force energy 35 | y3 = smooth(list(df[13])) 36 | 37 | 38 | # DQN-Q2-SFC 39 | y4 = smooth(list(df_QQ[3])) 40 | 41 | # DQN-QQE 42 | y5 = smooth(list(df[18])) 43 | 44 | bplot = ax.boxplot([y1, y2, y3, y4, y5], labels = ['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], patch_artist = True) 45 | 46 | colors = ['#DB2763', '#B0DB43', '#12EAEA', '#BCE7FD', '#C492B1'] 47 | # colors 48 | for patch, color in zip(bplot['boxes'], colors): 49 | patch.set_facecolor(color) 50 | 51 | 52 | ax.grid(axis='y', linestyle='--') 53 | ax.set_axisbelow(True) 54 | ax.set_title('Comparison of Maximum Energy') 55 | #plt.legend(['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 56 | #plt.xlabel('Iteration') 57 | ax.set_ylabel('Energy Consumption (J)') 58 | #plt.savefig('Comparison_max_energy.png') 59 | plt.show() -------------------------------------------------------------------------------- /plot_mean_energy.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Oct 14 18:58:20 2020 4 | 5 | @author: Wei-Cheng Wu 6 | """ 7 | import matplotlib.pyplot as plt 8 | import pandas as pd 9 | import numpy as np 10 | 11 | smooth_rate = 0.1 12 | N = int(1/smooth_rate) 13 | 14 | 15 | def smooth(sequence): 16 | y = sequence[:N-1] 17 | for i in range(len(sequence)-N+1): 18 | y.append(np.mean(sequence[i: i+N])) 19 | return y 20 | 21 | df = pd.read_csv('output.txt', header=None) 22 | df_QQ = pd.read_csv('output_QQ.txt', header=None) 23 | 24 | x = range(df.shape[0]) 25 | 26 | plt.figure(figsize=(10, 7), dpi=600) 27 | 28 | # Random 29 | y1 = smooth(list(df[2])) 30 | plt.plot(x, y1, c='#DB2763', linewidth=2) 31 | 32 | # Brute Force qoe 33 | y2 = smooth(list(df[7])) 34 | plt.plot(x, y2, c='#B0DB43', linewidth=2) 35 | 36 | # Brute Force energy 37 | y3 = smooth(list(df[12])) 38 | plt.plot(x, y3, c='#12EAEA', linewidth=2) 39 | 40 | # DQN-Q2-SFC 41 | y4 = smooth(list(df_QQ[2])) 42 | plt.plot(x, y4, c='#BCE7FD', linewidth=2) 43 | 44 | # DQN-QQE 45 | y5 = smooth(list(df[17])) 46 | plt.plot(x, y5, c='#C492B1', linewidth=2) 47 | 48 | plt.grid() 49 | plt.title('Comparison of Average Energy') 50 | plt.legend(['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 51 | plt.xlabel('Iteration') 52 | plt.ylabel('Energy Consumption (J)') 53 | #plt.savefig('Comparison_mean_energy_300iters.png') 54 | plt.show() -------------------------------------------------------------------------------- /plot_mean_energy_boxplot.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Oct 14 18:58:20 2020 4 | 5 | @author: Wei-Cheng Wu 6 | """ 7 | import matplotlib.pyplot as plt 8 | import pandas as pd 9 | import numpy as np 10 | 11 | smooth_rate = 0.1 12 | N = int(1/smooth_rate) 13 | 14 | 15 | def smooth(sequence): 16 | y = sequence[:N-1] 17 | for i in range(len(sequence)-N+1): 18 | y.append(np.mean(sequence[i: i+N])) 19 | return y 20 | 21 | df = pd.read_csv('output.txt', header=None) 22 | df_QQ = pd.read_csv('output_QQ.txt', header=None) 23 | 24 | x = range(df.shape[0]) 25 | 26 | fig, ax = plt.subplots(figsize=(10, 7), dpi=600) 27 | 28 | # Random 29 | y1 = smooth(list(df[2])) 30 | tmp_y1 = np.mean(list(df[2])) 31 | 32 | # Brute Force qoe 33 | y2 = smooth(list(df[7])) 34 | tmp_y2 = np.mean(list(df[7])) 35 | 36 | # Brute Force energy 37 | y3 = smooth(list(df[12])) 38 | tmp_y3 = np.mean(list(df[12])) 39 | 40 | # DQN-Q2-SFC 41 | y4 = smooth(list(df_QQ[2])) 42 | tmp_y4 = np.mean(list(df_QQ[2])) 43 | 44 | # DQN-QQE 45 | y5 = smooth(list(df[17])) 46 | tmp_y5 = np.mean(list(df[17])) 47 | 48 | bplot = ax.boxplot([y1, y2, y3, y4, y5], labels = ['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], patch_artist = True) 49 | 50 | colors = ['#DB2763', '#B0DB43', '#12EAEA', '#BCE7FD', '#C492B1'] 51 | # colors 52 | for patch, color in zip(bplot['boxes'], colors): 53 | patch.set_facecolor(color) 54 | 55 | print(tmp_y4, '&', tmp_y5) 56 | 57 | ax.grid(axis='y', linestyle='--') 58 | ax.set_axisbelow(True) 59 | ax.set_title('Comparison of Average Energy') 60 | #plt.legend(['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 61 | #plt.xlabel('Iteration') 62 | ax.set_ylabel('Energy Consumption (J)') 63 | #plt.savefig('Comparison_mean_energy_300iters.png') 64 | plt.show() -------------------------------------------------------------------------------- /plot_qoe.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Oct 14 18:58:20 2020 4 | 5 | @author: Wei-Cheng Wu 6 | """ 7 | import matplotlib.pyplot as plt 8 | import pandas as pd 9 | import numpy as np 10 | 11 | smooth_rate = 0.1 12 | N = int(1/smooth_rate) 13 | 14 | def eval_Q(df): 15 | iterations = 1500 16 | loc_Q1 = (1*(iterations+1)/4) - 1 17 | loc_Q2 = (iterations/2)- 1 18 | loc_Q3 = (3*(iterations+1)/4) - 1 19 | #print("Q1: ", loc_Q1, ", Q2: ", loc_Q2, ", Q3: ", loc_Q3) 20 | #print(int(loc_Q1)) 21 | Q1 = 0 22 | Q2 = 0 23 | Q3 = 0 24 | 25 | # Q1 26 | Q1 = df[int(loc_Q1)]*(loc_Q1-int(loc_Q1)) + df[int(loc_Q1)+1]*(1-(loc_Q1-int(loc_Q1))) 27 | 28 | # Q2 29 | if iterations%2 == 0: 30 | Q2 = (df[int(loc_Q2)] + df[int(loc_Q2)+1]) / 2 31 | else: 32 | Q2 = df[int(loc_Q2)+1] 33 | 34 | # Q3 35 | Q3 = df[int(loc_Q3)]*(loc_Q3-int(loc_Q3)) + df[int(loc_Q3)+1]*(1-(loc_Q3-int(loc_Q3))) 36 | 37 | return Q1, Q2, Q3 38 | 39 | def smooth(sequence): 40 | y = sequence[:N-1] 41 | for i in range(len(sequence)-N+1): 42 | y.append(np.mean(sequence[i: i+N])) 43 | return y 44 | 45 | df = pd.read_csv('output.txt', header=None) 46 | df_QQ = pd.read_csv('output_QQ.txt', header=None) 47 | 48 | x = range(df.shape[0]) 49 | 50 | plt.figure(figsize=(10, 7), dpi=600) 51 | 52 | # Random 53 | y1 = smooth(list(df[0])) 54 | plt.plot(x, y1, c='#DB2763', linewidth=2) 55 | 56 | # Brute Force qoe 57 | y2 = smooth(list(df[5])) 58 | plt.plot(x, y2, c='#B0DB43', linewidth=2) 59 | 60 | # Brute Force energy 61 | y3 = smooth(list(df[10])) 62 | plt.plot(x, y3, c='#12EAEA', linewidth=2) 63 | 64 | # DQN-Q2-SFC 65 | y4 = smooth(list(df_QQ[0])) 66 | plt.plot(x, y4, c='#BCE7FD', linewidth=2) 67 | 68 | # DQN-QQE 69 | y5 = smooth(list(df[15])) 70 | plt.plot(x, y5, c='#C492B1', linewidth=2) 71 | 72 | 73 | plt.grid() 74 | plt.title('Comparison of QoE') 75 | plt.legend(['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 76 | plt.xlabel('Iteration') 77 | plt.ylabel('QoE') 78 | #plt.savefig('Comparison_qoe.png') 79 | plt.show() 80 | -------------------------------------------------------------------------------- /plot_qoe_boxplot.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Oct 14 18:58:20 2020 4 | 5 | @author: Wei-Cheng Wu 6 | """ 7 | import matplotlib.pyplot as plt 8 | import pandas as pd 9 | import numpy as np 10 | 11 | smooth_rate = 0.1 12 | N = int(1/smooth_rate) 13 | 14 | def eval_Q(df): 15 | iterations = 1500 16 | loc_Q1 = (1*(iterations+1)/4) - 1 17 | loc_Q2 = (iterations/2)- 1 18 | loc_Q3 = (3*(iterations+1)/4) - 1 19 | #print("Q1: ", loc_Q1, ", Q2: ", loc_Q2, ", Q3: ", loc_Q3) 20 | #print(int(loc_Q1)) 21 | Q1 = 0 22 | Q2 = 0 23 | Q3 = 0 24 | 25 | # Q1 26 | Q1 = df[int(loc_Q1)]*(loc_Q1-int(loc_Q1)) + df[int(loc_Q1)+1]*(1-(loc_Q1-int(loc_Q1))) 27 | 28 | # Q2 29 | if iterations%2 == 0: 30 | Q2 = (df[int(loc_Q2)] + df[int(loc_Q2)+1]) / 2 31 | else: 32 | Q2 = df[int(loc_Q2)+1] 33 | 34 | # Q3 35 | Q3 = df[int(loc_Q3)]*(loc_Q3-int(loc_Q3)) + df[int(loc_Q3)+1]*(1-(loc_Q3-int(loc_Q3))) 36 | 37 | return Q1, Q2, Q3 38 | 39 | def smooth(sequence): 40 | y = sequence[:N-1] 41 | for i in range(len(sequence)-N+1): 42 | y.append(np.mean(sequence[i: i+N])) 43 | return y 44 | 45 | df = pd.read_csv('output.txt', header=None) 46 | df_QQ = pd.read_csv('output_QQ.txt', header=None) 47 | 48 | x = range(df.shape[0]) 49 | 50 | fig, ax = plt.subplots(figsize=(10, 7), dpi=600) 51 | 52 | # Random 53 | y1 = smooth(list(df[0])) 54 | RAND_Q1, RAND_Q2, RAND_Q3 = eval_Q(sorted(list(df[0]))) 55 | 56 | print("Random ==>") 57 | print("Q1: ", round(RAND_Q1, 2), ", Q2: ", round(RAND_Q2, 2), ", Q3: ", round(RAND_Q3, 2), "\n") 58 | 59 | # Brute Force qoe 60 | y2 = smooth(list(df[5])) 61 | BFQ_Q1, BFQ_Q2, BFQ_Q3 = eval_Q(sorted(list(df[5]))) 62 | 63 | print("Brute Force qoe ==>") 64 | print("Q1: ", round(BFQ_Q1, 2), ", Q2: ", round(BFQ_Q2, 2), ", Q3: ", round(BFQ_Q3, 2), "\n") 65 | 66 | # Brute Force energy 67 | y3 = smooth(list(df[10])) 68 | BFE_Q1, BFE_Q2, BFE_Q3 = eval_Q(sorted(list(df[10]))) 69 | 70 | print("Brute Force energy ==>") 71 | print("Q1: ", round(BFE_Q1, 2), ", Q2: ", round(BFE_Q2, 2), ", Q3: ", round(BFE_Q3, 2), "\n") 72 | 73 | # DQN-Q2-SFC 74 | y4 = smooth(list(df_QQ[0])) 75 | Q2SFC_Q1, Q2SFC_Q2, Q2SFC_Q3 = eval_Q(sorted(list(df_QQ[0]))) 76 | 77 | print("DQN-Q2-SFC ==>") 78 | print("Q1: ", round(Q2SFC_Q1, 2), ", Q2: ", round(Q2SFC_Q2, 2), ", Q3: ", round(Q2SFC_Q3, 2), "\n") 79 | 80 | # DQN-QQE 81 | y5 = smooth(list(df[15])) 82 | QQE_Q1, QQE_Q2, QQE_Q3 = eval_Q(sorted(list(df[15]))) 83 | 84 | print("DQN-QQE ==>") 85 | print("Q1: ", round(QQE_Q1, 2), ", Q2: ", round(QQE_Q2, 2), ", Q3: ", round(QQE_Q3, 2), "\n") 86 | 87 | #print("DQN compare: ") 88 | #print(sum(list(df_QQ[0]))/len(list(df_QQ[0])), sum(list(df[5]))/len(list(df[5]))) 89 | 90 | bplot = plt.boxplot([y1, y2, y3, y4, y5], labels = ['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], patch_artist = True) 91 | 92 | MinMax = [item.get_ydata()[1] for item in bplot['whiskers']] 93 | print("Before: ", MinMax) 94 | MinMax = [round(item, 2) for item in MinMax] 95 | print("After: ", MinMax) 96 | 97 | 98 | 99 | colors = ['#DB2763', '#B0DB43', '#12EAEA', '#BCE7FD', '#C492B1'] 100 | 101 | # colors 102 | for patch, color in zip(bplot['boxes'], colors): 103 | patch.set_facecolor(color) 104 | 105 | ax.grid(axis='y', linestyle='--') 106 | ax.set_axisbelow(True) 107 | ax.set_title('Comparison of QoE') 108 | #plt.legend(['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], loc=2, prop={'size': 20}, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 109 | #plt.xlabel('Iteration') 110 | ax.set_ylabel('QoE') 111 | #plt.savefig('Comparison_qoe.png') 112 | plt.show() 113 | -------------------------------------------------------------------------------- /plot_time.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Oct 14 18:58:20 2020 4 | 5 | @author: Wei-Cheng Wu 6 | """ 7 | import matplotlib.pyplot as plt 8 | import pandas as pd 9 | import numpy as np 10 | 11 | smooth_rate = 0.1 12 | N = int(1/smooth_rate) 13 | 14 | 15 | def smooth(sequence): 16 | y = sequence[:N-1] 17 | for i in range(len(sequence)-N+1): 18 | y.append(np.mean(sequence[i: i+N])) 19 | return y 20 | 21 | df = pd.read_csv('output.txt', header=None) 22 | df_QQ = pd.read_csv('output_QQ.txt', header=None) 23 | 24 | x = range(df.shape[0]) 25 | 26 | plt.figure(figsize=(10, 7), dpi=600) 27 | 28 | # Random 29 | y1 = smooth(list(df[4])) 30 | plt.plot(x, y1, c='#DB2763', linewidth=2) 31 | 32 | # Brute Force qoe 33 | y2 = smooth(list(df[9])) 34 | plt.plot(x, y2, c='#B0DB43', linewidth=2) 35 | 36 | # Brute Force energy 37 | y3 = smooth(list(df[14])) 38 | plt.plot(x, y3, c='#12EAEA', linewidth=2) 39 | 40 | # DQN-Q2-SFC 41 | y4 = smooth(list(df_QQ[4])) 42 | plt.plot(x, y4, c='#BCE7FD', linewidth=2) 43 | 44 | # DQN-QQE 45 | y5 = smooth(list(df[19])) 46 | plt.plot(x, y5, c='#C492B1', linewidth=2) 47 | 48 | plt.grid() 49 | plt.title('Comparison of Time') 50 | plt.legend(['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 51 | plt.xlabel('Iteration') 52 | plt.ylabel('second (s)') 53 | #plt.savefig('Comparison_error.png') 54 | plt.show() 55 | -------------------------------------------------------------------------------- /plot_time_barplot.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Oct 14 18:58:20 2020 4 | 5 | @author: Wei-Cheng Wu 6 | """ 7 | import matplotlib.pyplot as plt 8 | import pandas as pd 9 | import numpy as np 10 | 11 | 12 | smooth_rate = 0.1 13 | N = int(1/smooth_rate) 14 | 15 | 16 | def smooth(sequence): 17 | y = sequence[:N-1] 18 | for i in range(len(sequence)-N+1): 19 | y.append(np.mean(sequence[i: i+N])) 20 | return y 21 | 22 | df = pd.read_csv('output.txt', header=None) 23 | df_QQ = pd.read_csv('output_QQ.txt', header=None) 24 | 25 | x = range(df.shape[0]) 26 | 27 | fig, ax = plt.subplots(figsize=(10, 7), dpi=600) 28 | 29 | # Random 30 | #y1 = smooth(list(df[4])) 31 | y1 = np.mean(list(df[4])) 32 | bplot1 = ax.bar(['Random'], [y1], color='#DB2763', hatch='o' ,width=0.5) 33 | 34 | # Brute Force qoe 35 | y2 = np.mean(list(df[9])) 36 | bplot2 = ax.bar(['Brute Force-qoe'], [y2], color='#B0DB43', hatch='+' ,width=0.5) 37 | 38 | # Brute Force energy 39 | y3 = np.mean(list(df[14])) 40 | bplot3 = ax.bar(['Brute Force-energy'], [y3], color='#12EAEA', hatch='.' ,width=0.5) 41 | 42 | # DQN-Q2-SFC 43 | y4 = np.mean(list(df_QQ[4])) 44 | bplot4 = ax.bar(['DQN-Q2-SFC'], [y4], color='#BCE7FD', hatch='\\' ,width=0.5) 45 | 46 | # DQN-QQE 47 | y5 = np.mean(list(df[19])) 48 | bplot5 = ax.bar(['DQN-QQE'], [y5], color='#C492B1', hatch='/' ,width=0.5) 49 | 50 | #colors = ['darkgreen', 'darkmagenta', 'darkcyan', 'darkred', 'darkblue'] 51 | #hatchs = ('/', '\\', 'o', '-', '+') 52 | #bplot = plt.bar(['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], [y1, y2, y3, y4, y5], color=colors, hatch=hatchs ,width=0.5) 53 | #print(y4, '&', y5) 54 | #print(y2, '&', y3) 55 | print("Random: ", round(y1, 2)) 56 | print("Brute Force-qoe: ", round(y2, 2), ", Brute Force-energy: ", round(y3, 2)) 57 | print("DQN-Q2-SFC: ", round(y4, 2), ", DQN-QQE: ", round(y5, 2)) 58 | 59 | ax.grid(axis='y', linestyle='--') 60 | ax.set_axisbelow(True) 61 | ax.set_title('Comparison of Average Processing Time') 62 | #plt.legend(['Random', 'Brute Force-qoe', 'Brute Force-energy', 'DQN-Q2-SFC', 'DQN-QQE'], loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 63 | #plt.xlabel('Iteration') 64 | ax.set_ylabel('second (s)') 65 | #plt.savefig('Comparison_error.png') 66 | plt.show() 67 | -------------------------------------------------------------------------------- /random_sfc.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from config import VNFGroupConfig 3 | from energy import Energy 4 | from env import VNFGroup 5 | import numpy as np 6 | import time 7 | 8 | group_config = VNFGroupConfig() 9 | energy = Energy() 10 | env = VNFGroup() 11 | 12 | P = 10.0 13 | 14 | 15 | class RandomSFC: 16 | def __init__(self): 17 | self.B = group_config.get_initialized_bandwidth() 18 | self.D = group_config.get_initialized_delay() 19 | self.sfc_requests = group_config.get_test_sfc() 20 | self.running_sfc = np.ndarray([0, 6], dtype=np.int32) 21 | self.total_qoe = 0.0 22 | self.error_counter = 0 23 | 24 | # ============================================================================================ 25 | self.time = 0 26 | 27 | self.vnf_id_collection = [0, 1, 2, 3, 4] 28 | 29 | # Energy of each type of VNFs 30 | self.E_vnf = group_config.get_initialized_vnf() 31 | 32 | # IDLE Energy of each type of VNFs 33 | self.E_IDLEvnf = group_config.get_initialized_IDLEvnf(energy.idle_energy) 34 | 35 | # ACTIVE IDLE OFF 36 | self.state = group_config.get_initialized_state() 37 | 38 | # Number of each type of VNFs on each node 39 | self.capaVNFs = group_config.get_initialized_capaVNFs() 40 | 41 | # IDLE time of each node 42 | self.idletime = group_config.get_initialized_idletime() 43 | 44 | self.energy_OIA = 0 45 | self.total_OIA = [] 46 | # ============================================================================================ 47 | 48 | def reset(self): 49 | energy.reset() 50 | self.__init__() 51 | #self.set_used_nodes = [] 52 | 53 | def set_sfc_requests(self, sfc_requests): 54 | self.sfc_requests = sfc_requests 55 | 56 | def random_release_sfc(self, thresh=0.2): 57 | prob = np.array([np.random.random() for _ in range(self.running_sfc.shape[0])]) 58 | released_sfc = self.running_sfc[prob <= thresh] 59 | self.running_sfc = self.running_sfc[prob > thresh] 60 | for c in released_sfc: 61 | for i in range(0, 4): 62 | self.B[c[i+2], c[i+1], i] += c[0] 63 | 64 | def check_B(self, c, B_): 65 | for vnf_id in range(1, 5): 66 | if self.B[c[vnf_id], c[vnf_id-1], vnf_id-1] < B_: 67 | return False 68 | return True 69 | 70 | def check_D(self, c, D_): 71 | d_sum = 0.0 72 | for vnf_id in range(1, 5): 73 | d_sum += self.D[c[vnf_id], c[vnf_id-1], vnf_id-1] 74 | if d_sum > D_: 75 | return 0, False 76 | return d_sum, True 77 | 78 | def allocate_B(self, c, B_): 79 | for vnf_id in range(1, 5): 80 | self.B[c[vnf_id], c[vnf_id-1], vnf_id-1] -= B_ 81 | 82 | def select(self): 83 | start = time.time() 84 | [B_, D_] = self.sfc_requests.pop(0) 85 | while True: 86 | self.random_release_sfc() 87 | c = [np.random.choice(5) for _ in range(5)] 88 | if self.check_B(c, B_): 89 | d_sum, flag = self.check_D(c, D_) 90 | if flag: 91 | self.total_qoe += np.log(B_) - P*np.exp(-(D_-d_sum)/10.0) 92 | self.allocate_B(c, B_) 93 | sfc = [B_] 94 | sfc += c 95 | self.running_sfc = np.concatenate([self.running_sfc, np.array([sfc])], axis=0) 96 | 97 | # Energy 98 | # =================================================================================================== 99 | #print("===========================================") 100 | #print("VNF No.: ", self.vnf_id_collection) 101 | #print("Placement of VNFs: ", c) 102 | energy.update(c, self.state, self.idletime, self.vnf_id_collection, self.capaVNFs) 103 | #print("State: ", self.state) 104 | #print("Energy of each VNF: ", self.E_vnf) 105 | #print("IDLE Energy of each VNF: ", self.E_IDLEvnf) 106 | #print("\nAllocate_of_eachVNF:") 107 | #print("VNF:") 108 | #print(" 0 1 2 3 4") 109 | #print(self.capaVNFs) 110 | #print("IDLE time countdown: ", self.idletime) 111 | self.energy_OIA = energy.energy_OIA_mode(c, self.E_vnf, self.E_IDLEvnf, 112 | self.state, self.vnf_id_collection, self.capaVNFs) 113 | #print("Energy of OIA: ", round(self.energy_OIA, 0)) 114 | self.total_OIA.append(self.energy_OIA) 115 | #print("===========================================\n") 116 | # =================================================================================================== 117 | 118 | else: 119 | self.total_qoe -= P 120 | self.error_counter += 1 121 | try: 122 | [B_, D_] = self.sfc_requests.pop(0) 123 | except IndexError: 124 | break 125 | end = time.time() 126 | self.time = round((end-start), 2) 127 | 128 | def get_mean_qoe(self): 129 | return self.total_qoe / env.num_requests 130 | 131 | def get_error_rate(self): 132 | return self.error_counter / env.num_requests 133 | 134 | def get_mean_energy_OIA(self): 135 | return sum(self.total_OIA) / env.num_requests 136 | 137 | def get_max_energy_OIA(self): 138 | return max(self.total_OIA) 139 | 140 | 141 | 142 | if __name__ == '__main__': 143 | sfc = RandomSFC() 144 | sfc.select() 145 | 146 | print('Period: {:g}s '.format(sfc.time)) 147 | 148 | print('Mean QoE:', sfc.get_mean_qoe()) 149 | print('Error Rate:', sfc.get_error_rate()) 150 | print("Mean Energy of OIA: ", round(sfc.get_mean_energy_OIA(), 0)) 151 | print("Max Energy of OIA: ", round(sfc.get_max_energy_OIA(), 0)) 152 | -------------------------------------------------------------------------------- /run.bat: -------------------------------------------------------------------------------- 1 | call C:\Users\SNMLAB\Anaconda3\Scripts\activate.bat C:\Users\SNMLAB\Anaconda3 2 | python main.py 3 | python main_QQ.py 4 | pause --------------------------------------------------------------------------------