├── .gitignore ├── README.md ├── LICENSE ├── WOA.py ├── table(WOA).csv └── main.py /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /__pycache__ 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # The-Whale-Optimization-Algorithm 2 | S. Mirjalili and A. Lewis, "The Whale Optimization Algorithm", Advances in Engineering Software, vol. 95, pp. 51-67, 2016. 3 | 4 | https://doi.org/10.1016/j.advengsoft.2016.01.008 5 | 6 | https://www.mathworks.com/matlabcentral/fileexchange/55667-the-whale-optimization-algorithm 7 | 8 | 1. 重新優化了測試腳本 9 | 10 | 2. 測試腳本請參考我的另一個作品https://github.com/ZongSingHuang/Metaheuristic-benchmark 11 | 12 | 3. 礙於計算全部的測試函數所需時間太長,因此我只測前36個測試函數 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 a26833765@gmail.com 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /WOA.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Thu Jul 16 21:59:58 2020 4 | 5 | @author: ZongSing_NB 6 | 7 | Main reference: 8 | https://seyedalimirjalili.com/woa 9 | https://doi.org/10.1016/j.advengsoft.2016.01.008 10 | """ 11 | 12 | import numpy as np 13 | import matplotlib.pyplot as plt 14 | 15 | class WOA(): 16 | def __init__(self, fitness, D=30, P=20, G=500, ub=1, lb=0, 17 | b=1, a_max=2, a_min=0, a2_max=-1, a2_min=-2, l_max=1, l_min=-1): 18 | self.fitness = fitness 19 | self.D = D 20 | self.P = P 21 | self.G = G 22 | self.ub = ub*np.ones([self.P, self.D]) 23 | self.lb = lb*np.ones([self.P, self.D]) 24 | self.a_max = a_max 25 | self.a_min = a_min 26 | self.a2_max = a2_max 27 | self.a2_min = a2_min 28 | self.l_max = l_max 29 | self.l_min = l_min 30 | self.b = b 31 | 32 | self.gbest_X = np.zeros([self.D]) 33 | self.gbest_F = np.inf 34 | self.loss_curve = np.zeros(self.G) 35 | 36 | 37 | def opt(self): 38 | # 初始化 39 | self.X = np.random.uniform(low=self.lb, high=self.ub, size=[self.P, self.D]) 40 | 41 | # 迭代 42 | for g in range(self.G): 43 | # 適應值計算 44 | F = self.fitness(self.X) 45 | 46 | # 更新最佳解 47 | if np.min(F) < self.gbest_F: 48 | idx = F.argmin() 49 | self.gbest_X = self.X[idx].copy() 50 | self.gbest_F = F.min() 51 | 52 | # 收斂曲線 53 | self.loss_curve[g] = self.gbest_F 54 | 55 | # 更新 56 | a = self.a_max - (self.a_max-self.a_min)*(g/self.G) 57 | a2 = self.a2_max - (self.a2_max-self.a2_min)*(g/self.G) 58 | 59 | for i in range(self.P): 60 | p = np.random.uniform() 61 | r1 = np.random.uniform() 62 | r2 = np.random.uniform() 63 | r3 = np.random.uniform() 64 | A = 2*a*r1 - a #(2.3) 65 | C = 2*r2 # (2.4) 66 | l = (a2-1)*r3 + 1 # (???) 67 | 68 | if p>0.5: 69 | D = np.abs(self.gbest_X - self.X[i, :]) 70 | self.X[i, :] = D*np.exp(self.b*l)*np.cos(2*np.pi*l)+self.gbest_X # (2.5) 71 | else: 72 | if np.abs(A)<1: 73 | D = np.abs(C*self.gbest_X - self.X[i, :]) # (2.1) 74 | self.X[i, :] = self.gbest_X - A*D # (2.2) 75 | else: 76 | idx = np.random.randint(low=0, high=self.P) 77 | X_rand = self.X[idx] 78 | D = np.abs(C*X_rand - self.X[i, :]) # (2.7) 79 | self.X[i, :] = X_rand - A*D # (2.8) 80 | 81 | # 邊界處理 82 | self.X = np.clip(self.X, self.lb, self.ub) 83 | 84 | def plot_curve(self): 85 | plt.figure() 86 | plt.title('loss curve ['+str(round(self.gBest_curve[-1], 3))+']') 87 | plt.plot(self.gBest_curve, label='loss') 88 | plt.grid() 89 | plt.legend() 90 | plt.show() 91 | -------------------------------------------------------------------------------- /table(WOA).csv: -------------------------------------------------------------------------------- 1 | ,Sphere,Rastrigin,Ackley,Griewank,Schwefel P2.22,Rosenbrock,Sehwwefel P2.21,Quartic,Schwefel P1.2,Penalized 1,Penalized 2,Schwefel P2.26,Step,Kowalik,Shekel Foxholes,Goldstein-Price,Shekel 5,Branin,Hartmann 3,Shekel 7,Shekel 10,Six-Hump Camel-Back,Hartmann 6,Zakharov,Sum Squares,Alpine,Michalewicz,Exponential,Schaffer,Bent Cigar,Bohachevsky 1,Elliptic,Drop Wave,Cosine Mixture,Ellipsoidal,Levy and Montalvo 1 2 | avg,3.124507473974843e-80,0.0,2.8599345114344034e-15,0.0,1.159976736439899e-51,5.573258652667212,8.628882440631947e-10,0.0011589745328185299,3049.757101675445,0.004649524810558432,0.056440561436841834,-12433.958726767769,0.0,0.000754641520846649,3.0391730695106287,7.999362728666028,-8.13352240521477,0.3979680452569228,-3.803123840165272,-8.077772082856962,-8.23135521549731,-1.0316284529741968,-3.036518217936076,402.35782500980895,2.8081097423535677e-82,1.085577114866048e-05,-1.7297445276590437,-1.0,0.0028360989895258202,4.687727793552608e-77,0.0,6.616970984567579e-79,-0.9808735983423809,-3.0,1535.2505158605034,0.001430426572441468 3 | std,1.655786453170929e-79,0.0,2.0642458830386014e-15,0.0,8.107229293733338e-51,10.173452920002585,3.339406000386362e-09,0.0017198735729847994,8005.85999581245,0.005208078049567224,0.07052973253660526,345.56030103084225,0.0,0.0005550314346983846,3.2963443960008445,10.68068215339476,2.74043673264644,0.00021232790759270805,0.07252041912941637,2.6391132511766315,2.627876727567212,9.96619942310438e-10,0.18314169591050897,158.92685394270836,1.9293376509084715e-81,7.599039804062326e-05,0.2172074944287678,0.0,0.0026616857261983064,2.474226201711187e-76,0.0,4.6318728947948185e-78,0.029216061122722323,0.0,318.4960294740456,0.0013490405318794323 4 | worst,1.097063592596113e-78,0.0,7.549516567451064e-15,0.0,5.791055858897006e-50,28.729103687295453,1.8011657752964485e-08,0.006455751063908289,46167.05108455343,0.023431577822908747,0.37114261466303566,-10990.407740527866,0.0,0.002952973750247674,12.670505811135913,33.14854428970155,-2.4569379613821107,0.398747585262047,-3.6002353960628337,-2.748551361500492,-1.540898282254397,-1.0316284483149791,-2.3500531153166397,741.8256443272527,1.3784857499182132e-80,0.000542788557433024,-0.9999999999985903,-1.0,0.021467899072913965,1.713158323086928e-75,0.0,3.3084807361992594e-77,-0.936245327807878,-3.0,2024.2094285776743,0.006085666824005897 5 | best,1.5125630283252164e-97,0.0,4.440892098500626e-16,0.0,1.3007236218479615e-61,0.007577461632510637,1.7764858811143653e-18,3.0208197361423494e-06,3.039436974962615e-09,0.0003524136341234956,0.0019940954618676283,-12569.48661817301,0.0,0.000315890309498474,0.9980038378065845,3.000000261880809,-10.152963603246706,0.39788735774551043,-3.86269138645347,-10.39680798707147,-10.153198754335401,-1.031628453489869,-3.3088182865255544,45.640589412589065,3.6519751469188537e-103,5.241733922248276e-63,-1.801303408457342,-1.0,0.0024558581714964056,6.777101465175597e-91,0.0,2.6802951971494326e-98,-1.0,-3.0,766.178342118747,1.6055344770811555e-05 6 | ideal,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-12569.486618173014,0.0,0.0003074861,0.9980038377944493,3.0,-10.1532,0.39788735772973816,-3.86278214782076,-10.1532,-10.1532,-1.031628453489877,-3.32236801141551,0.0,0.0,0.0,-1.8013034100985532,-1.0,0.0,0.0,0.0,0.0,-1.0,-3.0,0.0,0.0 7 | time,0.20000526905059815,0.20154058933258057,0.20929253101348877,0.2086906051635742,0.2031985664367676,0.20579229831695556,0.19855033874511718,0.2168924617767334,0.20262840270996094,0.23808951377868653,0.233242769241333,0.20276500701904296,0.20120723247528077,0.3773151445388794,0.41858925342559816,0.20282784461975098,0.22453847885131836,0.19663100242614745,0.2207411766052246,0.23595865249633788,0.22331437587738037,0.1973168992996216,0.2224238920211792,0.21330738067626953,0.20460853099822998,0.20387202739715576,0.19910965919494628,0.19954426288604737,0.19356555461883546,0.20253920078277587,0.19290897369384766,0.20678897380828856,0.19340539932250977,0.20479066371917726,0.20212745189666748,0.2204906940460205 8 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Thu Jul 16 21:43:03 2020 4 | 5 | @author: ZongSing_NB 6 | """ 7 | 8 | import time 9 | import functools 10 | 11 | import numpy as np 12 | import pandas as pd 13 | 14 | from WOA import WOA 15 | import benchmark 16 | import bound_X 17 | import ideal_F 18 | import dimension 19 | 20 | D = 30 21 | G = 500 22 | P = 30 23 | run_times = 50 24 | table = pd.DataFrame(np.zeros([6, 36]), index=['avg', 'std', 'worst', 'best', 'ideal', 'time']) 25 | loss_curves = np.zeros([G, 36]) 26 | F_table = np.zeros([run_times, 36]) 27 | for t in range(run_times): 28 | item = 0 29 | ub = bound_X.Sphere()[1]*np.ones(dimension.Sphere(D)) 30 | lb = bound_X.Sphere()[0]*np.ones(dimension.Sphere(D)) 31 | optimizer = WOA(fitness=benchmark.Sphere, 32 | D=dimension.Sphere(D), P=P, G=G, ub=ub, lb=lb) 33 | st = time.time() 34 | optimizer.opt() 35 | ed = time.time() 36 | F_table[t, item] = optimizer.gbest_F 37 | table[item]['avg'] += optimizer.gbest_F 38 | table[item]['time'] += ed - st 39 | table[item]['ideal'] = ideal_F.Sphere() 40 | loss_curves[:, item] += optimizer.loss_curve 41 | 42 | 43 | item = item + 1 44 | ub = bound_X.Rastrigin()[1]*np.ones(dimension.Rastrigin(D)) 45 | lb = bound_X.Rastrigin()[0]*np.ones(dimension.Rastrigin(D)) 46 | optimizer = WOA(fitness=benchmark.Rastrigin, 47 | D=dimension.Rastrigin(D), P=P, G=G, ub=ub, lb=lb) 48 | st = time.time() 49 | optimizer.opt() 50 | ed = time.time() 51 | F_table[t, item] = optimizer.gbest_F 52 | table[item]['avg'] += optimizer.gbest_F 53 | table[item]['time'] += ed - st 54 | table[item]['ideal'] = ideal_F.Rastrigin() 55 | loss_curves[:, item] += optimizer.loss_curve 56 | 57 | 58 | item = item + 1 59 | ub = bound_X.Ackley()[1]*np.ones(dimension.Ackley(D)) 60 | lb = bound_X.Ackley()[0]*np.ones(dimension.Ackley(D)) 61 | optimizer = WOA(fitness=benchmark.Ackley, 62 | D=dimension.Ackley(D), P=P, G=G, ub=ub, lb=lb) 63 | st = time.time() 64 | optimizer.opt() 65 | ed = time.time() 66 | F_table[t, item] = optimizer.gbest_F 67 | table[item]['avg'] += optimizer.gbest_F 68 | table[item]['time'] += ed - st 69 | table[item]['ideal'] = ideal_F.Ackley() 70 | loss_curves[:, item] += optimizer.loss_curve 71 | 72 | 73 | item = item + 1 74 | ub = bound_X.Griewank()[1]*np.ones(dimension.Griewank(D)) 75 | lb = bound_X.Griewank()[0]*np.ones(dimension.Griewank(D)) 76 | optimizer = WOA(fitness=benchmark.Griewank, 77 | D=dimension.Griewank(D), P=P, G=G, ub=ub, lb=lb) 78 | st = time.time() 79 | optimizer.opt() 80 | ed = time.time() 81 | F_table[t, item] = optimizer.gbest_F 82 | table[item]['avg'] += optimizer.gbest_F 83 | table[item]['time'] += ed - st 84 | table[item]['ideal'] = ideal_F.Griewank() 85 | loss_curves[:, item] += optimizer.loss_curve 86 | 87 | 88 | item = item + 1 89 | ub = bound_X.Schwefel_P222()[1]*np.pi*np.ones(dimension.Schwefel_P222(D)) 90 | lb = bound_X.Schwefel_P222()[0]*np.pi*np.ones(dimension.Schwefel_P222(D)) 91 | optimizer = WOA(fitness=benchmark.Schwefel_P222, 92 | D=dimension.Schwefel_P222(D), P=P, G=G, ub=ub, lb=lb) 93 | st = time.time() 94 | optimizer.opt() 95 | ed = time.time() 96 | F_table[t, item] = optimizer.gbest_F 97 | table[item]['avg'] += optimizer.gbest_F 98 | table[item]['time'] += ed - st 99 | table[item]['ideal'] = ideal_F.Schwefel_P222() 100 | loss_curves[:, item] += optimizer.loss_curve 101 | 102 | 103 | item = item + 1 104 | ub = bound_X.Rosenbrock()[1]*np.ones(dimension.Rosenbrock(D)) 105 | lb = bound_X.Rosenbrock()[0]*np.ones(dimension.Rosenbrock(D)) 106 | optimizer = WOA(fitness=benchmark.Rosenbrock, 107 | D=dimension.Rosenbrock(D), P=P, G=G, ub=ub, lb=lb) 108 | st = time.time() 109 | optimizer.opt() 110 | ed = time.time() 111 | F_table[t, item] = optimizer.gbest_F 112 | table[item]['avg'] += optimizer.gbest_F 113 | table[item]['time'] += ed - st 114 | table[item]['ideal'] = ideal_F.Rosenbrock() 115 | loss_curves[:, item] += optimizer.loss_curve 116 | 117 | 118 | item = item + 1 119 | ub = bound_X.Sehwwefel_P221()[1]*np.ones(dimension.Sehwwefel_P221(D)) 120 | lb = bound_X.Sehwwefel_P221()[0]*np.ones(dimension.Sehwwefel_P221(D)) 121 | optimizer = WOA(fitness=benchmark.Sehwwefel_P221, 122 | D=dimension.Sehwwefel_P221(D), P=P, G=G, ub=ub, lb=lb) 123 | st = time.time() 124 | optimizer.opt() 125 | ed = time.time() 126 | F_table[t, item] = optimizer.gbest_F 127 | table[item]['avg'] += optimizer.gbest_F 128 | table[item]['time'] += ed - st 129 | table[item]['ideal'] = ideal_F.Sehwwefel_P221() 130 | loss_curves[:, item] += optimizer.loss_curve 131 | 132 | 133 | item = item + 1 134 | ub = bound_X.Quartic()[1]*np.ones(dimension.Quartic(D)) 135 | lb = bound_X.Quartic()[0]*np.ones(dimension.Quartic(D)) 136 | optimizer = WOA(fitness=benchmark.Quartic, 137 | D=dimension.Quartic(D), P=P, G=G, ub=ub, lb=lb) 138 | st = time.time() 139 | optimizer.opt() 140 | ed = time.time() 141 | F_table[t, item] = optimizer.gbest_F 142 | table[item]['avg'] += optimizer.gbest_F 143 | table[item]['time'] += ed - st 144 | table[item]['ideal'] = ideal_F.Quartic() 145 | loss_curves[:, item] += optimizer.loss_curve 146 | 147 | 148 | item = item + 1 149 | ub = bound_X.Schwefel_P12()[1]*np.ones(dimension.Schwefel_P12(D)) 150 | lb = bound_X.Schwefel_P12()[0]*np.ones(dimension.Schwefel_P12(D)) 151 | optimizer = WOA(fitness=benchmark.Schwefel_P12, 152 | D=dimension.Schwefel_P12(D), P=P, G=G, ub=ub, lb=lb) 153 | st = time.time() 154 | optimizer.opt() 155 | ed = time.time() 156 | F_table[t, item] = optimizer.gbest_F 157 | table[item]['avg'] += optimizer.gbest_F 158 | table[item]['time'] += ed - st 159 | table[item]['ideal'] = ideal_F.Schwefel_P12() 160 | loss_curves[:, item] += optimizer.loss_curve 161 | 162 | 163 | item = item + 1 164 | ub = bound_X.Penalized1()[1]*np.ones(dimension.Penalized1(D)) 165 | lb = bound_X.Penalized1()[0]*np.ones(dimension.Penalized1(D)) 166 | optimizer = WOA(fitness=benchmark.Penalized1, 167 | D=dimension.Penalized1(D), P=P, G=G, ub=ub, lb=lb) 168 | st = time.time() 169 | optimizer.opt() 170 | ed = time.time() 171 | F_table[t, item] = optimizer.gbest_F 172 | table[item]['avg'] += optimizer.gbest_F 173 | table[item]['time'] += ed - st 174 | table[item]['ideal'] = ideal_F.Penalized1() 175 | loss_curves[:, item] += optimizer.loss_curve 176 | 177 | 178 | item = item + 1 179 | ub = bound_X.Penalized2()[1]*np.ones(dimension.Penalized2(D)) 180 | lb = bound_X.Penalized2()[0]*np.ones(dimension.Penalized2(D)) 181 | optimizer = WOA(fitness=benchmark.Penalized2, 182 | D=dimension.Penalized2(D), P=P, G=G, ub=ub, lb=lb) 183 | st = time.time() 184 | optimizer.opt() 185 | ed = time.time() 186 | F_table[t, item] = optimizer.gbest_F 187 | table[item]['avg'] += optimizer.gbest_F 188 | table[item]['time'] += ed - st 189 | table[item]['ideal'] = ideal_F.Penalized2() 190 | loss_curves[:, item] += optimizer.loss_curve 191 | 192 | 193 | item = item + 1 194 | ub = bound_X.Schwefel_226()[1]*np.ones(dimension.Schwefel_226(D)) 195 | lb = bound_X.Schwefel_226()[0]*np.ones(dimension.Schwefel_226(D)) 196 | optimizer = WOA(fitness=benchmark.Schwefel_226, 197 | D=dimension.Schwefel_226(dimension.Schwefel_226(D)), P=P, G=G, ub=ub, lb=lb) 198 | st = time.time() 199 | optimizer.opt() 200 | ed = time.time() 201 | F_table[t, item] = optimizer.gbest_F 202 | table[item]['avg'] += optimizer.gbest_F 203 | table[item]['time'] += ed - st 204 | table[item]['ideal'] = ideal_F.Schwefel_226(D) 205 | loss_curves[:, item] += optimizer.loss_curve 206 | 207 | 208 | item = item + 1 209 | ub = bound_X.Step()[1]*np.ones(dimension.Step(D)) 210 | lb = bound_X.Step()[0]*np.ones(dimension.Step(D)) 211 | optimizer = WOA(fitness=benchmark.Step, 212 | D=dimension.Step(D), P=P, G=G, ub=ub, lb=lb) 213 | st = time.time() 214 | optimizer.opt() 215 | ed = time.time() 216 | F_table[t, item] = optimizer.gbest_F 217 | table[item]['avg'] += optimizer.gbest_F 218 | table[item]['time'] += ed - st 219 | table[item]['ideal'] = ideal_F.Step() 220 | loss_curves[:, item] += optimizer.loss_curve 221 | 222 | 223 | item = item + 1 224 | ub = bound_X.Kowalik()[1]*np.ones(dimension.Kowalik()) 225 | lb = bound_X.Kowalik()[0]*np.ones(dimension.Kowalik()) 226 | optimizer = WOA(fitness=benchmark.Kowalik, 227 | D=dimension.Kowalik(), P=P, G=G, ub=ub, lb=lb) 228 | st = time.time() 229 | optimizer.opt() 230 | ed = time.time() 231 | F_table[t, item] = optimizer.gbest_F 232 | table[item]['avg'] += optimizer.gbest_F 233 | table[item]['time'] += ed - st 234 | table[item]['ideal'] = ideal_F.Kowalik() 235 | loss_curves[:, item] += optimizer.loss_curve 236 | 237 | 238 | item = item + 1 239 | ub = bound_X.ShekelFoxholes()[1]*np.ones(dimension.ShekelFoxholes()) 240 | lb = bound_X.ShekelFoxholes()[0]*np.ones(dimension.ShekelFoxholes()) 241 | optimizer = WOA(fitness=benchmark.ShekelFoxholes, 242 | D=dimension.ShekelFoxholes(), P=P, G=G, ub=ub, lb=lb) 243 | st = time.time() 244 | optimizer.opt() 245 | ed = time.time() 246 | F_table[t, item] = optimizer.gbest_F 247 | table[item]['avg'] += optimizer.gbest_F 248 | table[item]['time'] += ed - st 249 | table[item]['ideal'] = ideal_F.ShekelFoxholes() 250 | loss_curves[:, item] += optimizer.loss_curve 251 | 252 | 253 | item = item + 1 254 | ub = bound_X.GoldsteinPrice()[1]*np.ones(dimension.GoldsteinPrice()) 255 | lb = bound_X.GoldsteinPrice()[0]*np.ones(dimension.GoldsteinPrice()) 256 | optimizer = WOA(fitness=benchmark.GoldsteinPrice, 257 | D=dimension.GoldsteinPrice(), P=P, G=G, ub=ub, lb=lb) 258 | st = time.time() 259 | optimizer.opt() 260 | ed = time.time() 261 | F_table[t, item] = optimizer.gbest_F 262 | table[item]['avg'] += optimizer.gbest_F 263 | table[item]['time'] += ed - st 264 | table[item]['ideal'] = ideal_F.GoldsteinPrice() 265 | loss_curves[:, item] += optimizer.loss_curve 266 | 267 | 268 | item = item + 1 269 | Shekel5 = functools.partial(benchmark.Shekel, m=5) 270 | ub = bound_X.Shekel()[1]*np.ones(dimension.Shekel()) 271 | lb = bound_X.Shekel()[0]*np.ones(dimension.Shekel()) 272 | optimizer = WOA(fitness=Shekel5, 273 | D=dimension.Shekel(), P=P, G=G, ub=ub, lb=lb) 274 | st = time.time() 275 | optimizer.opt() 276 | ed = time.time() 277 | F_table[t, item] = optimizer.gbest_F 278 | table[item]['avg'] += optimizer.gbest_F 279 | table[item]['time'] += ed - st 280 | table[item]['ideal'] = ideal_F.Shekel() 281 | loss_curves[:, item] += optimizer.loss_curve 282 | 283 | 284 | item = item + 1 285 | ub = bound_X.Branin()[2:]*np.ones(dimension.Branin()) 286 | lb = bound_X.Branin()[:2]*np.ones(dimension.Branin()) 287 | optimizer = WOA(fitness=benchmark.Branin, 288 | D=dimension.Branin(), P=P, G=G, ub=ub, lb=lb) 289 | st = time.time() 290 | optimizer.opt() 291 | ed = time.time() 292 | F_table[t, item] = optimizer.gbest_F 293 | table[item]['avg'] += optimizer.gbest_F 294 | table[item]['time'] += ed - st 295 | table[item]['ideal'] = ideal_F.Branin() 296 | loss_curves[:, item] += optimizer.loss_curve 297 | 298 | 299 | item = item + 1 300 | ub = bound_X.Hartmann3()[1]*np.ones(dimension.Hartmann3()) 301 | lb = bound_X.Hartmann3()[0]*np.ones(dimension.Hartmann3()) 302 | optimizer = WOA(fitness=benchmark.Hartmann3, 303 | D=dimension.Hartmann3(), P=P, G=G, ub=ub, lb=lb) 304 | st = time.time() 305 | optimizer.opt() 306 | ed = time.time() 307 | F_table[t, item] = optimizer.gbest_F 308 | table[item]['avg'] += optimizer.gbest_F 309 | table[item]['time'] += ed - st 310 | table[item]['ideal'] = ideal_F.Hartmann3() 311 | loss_curves[:, item] += optimizer.loss_curve 312 | 313 | 314 | item = item + 1 315 | Shekel7 = functools.partial(benchmark.Shekel, m=7) 316 | ub = bound_X.Shekel()[1]*np.ones(dimension.Shekel()) 317 | lb = bound_X.Shekel()[0]*np.ones(dimension.Shekel()) 318 | optimizer = WOA(fitness=Shekel7, 319 | D=dimension.Shekel(), P=P, G=G, ub=ub, lb=lb) 320 | st = time.time() 321 | optimizer.opt() 322 | ed = time.time() 323 | F_table[t, item] = optimizer.gbest_F 324 | table[item]['avg'] += optimizer.gbest_F 325 | table[item]['time'] += ed - st 326 | table[item]['ideal'] = ideal_F.Shekel() 327 | loss_curves[:, item] += optimizer.loss_curve 328 | 329 | 330 | item = item + 1 331 | Shekel10 = functools.partial(benchmark.Shekel, m=10) 332 | ub = bound_X.Shekel()[1]*np.ones(dimension.Shekel()) 333 | lb = bound_X.Shekel()[0]*np.ones(dimension.Shekel()) 334 | optimizer = WOA(fitness=benchmark.Shekel, 335 | D=dimension.Shekel(), P=P, G=G, ub=ub, lb=lb) 336 | st = time.time() 337 | optimizer.opt() 338 | ed = time.time() 339 | F_table[t, item] = optimizer.gbest_F 340 | table[item]['avg'] += optimizer.gbest_F 341 | table[item]['time'] += ed - st 342 | table[item]['ideal'] = ideal_F.Shekel() 343 | loss_curves[:, item] += optimizer.loss_curve 344 | 345 | 346 | item = item + 1 347 | ub = bound_X.SixHumpCamelBack()[1]*np.ones(dimension.SixHumpCamelBack()) 348 | lb = bound_X.SixHumpCamelBack()[0]*np.ones(dimension.SixHumpCamelBack()) 349 | optimizer = WOA(fitness=benchmark.SixHumpCamelBack, 350 | D=dimension.SixHumpCamelBack(), P=P, G=G, ub=ub, lb=lb) 351 | st = time.time() 352 | optimizer.opt() 353 | ed = time.time() 354 | F_table[t, item] = optimizer.gbest_F 355 | table[item]['avg'] += optimizer.gbest_F 356 | table[item]['time'] += ed - st 357 | table[item]['ideal'] = ideal_F.SixHumpCamelBack() 358 | loss_curves[:, item] += optimizer.loss_curve 359 | 360 | 361 | item = item + 1 362 | ub = bound_X.Hartmann6()[1]*np.ones(dimension.Hartmann6()) 363 | lb = bound_X.Hartmann6()[0]*np.ones(dimension.Hartmann6()) 364 | optimizer = WOA(fitness=benchmark.Hartmann6, 365 | D=dimension.Hartmann6(), P=P, G=G, ub=ub, lb=lb) 366 | st = time.time() 367 | optimizer.opt() 368 | ed = time.time() 369 | F_table[t, item] = optimizer.gbest_F 370 | table[item]['avg'] += optimizer.gbest_F 371 | table[item]['time'] += ed - st 372 | table[item]['ideal'] = ideal_F.Hartmann6() 373 | loss_curves[:, item] += optimizer.loss_curve 374 | 375 | 376 | item = item + 1 377 | ub = bound_X.Zakharov()[1]*np.ones(dimension.Zakharov(D)) 378 | lb = bound_X.Zakharov()[0]*np.ones(dimension.Zakharov(D)) 379 | optimizer = WOA(fitness=benchmark.Zakharov, 380 | D=dimension.Zakharov(D), P=P, G=G, ub=ub, lb=lb) 381 | st = time.time() 382 | optimizer.opt() 383 | ed = time.time() 384 | F_table[t, item] = optimizer.gbest_F 385 | table[item]['avg'] += optimizer.gbest_F 386 | table[item]['time'] += ed - st 387 | table[item]['ideal'] = ideal_F.Zakharov() 388 | loss_curves[:, item] += optimizer.loss_curve 389 | 390 | 391 | item = item + 1 392 | ub = bound_X.SumSquares()[1]*np.ones(dimension.SumSquares(D)) 393 | lb = bound_X.SumSquares()[0]*np.ones(dimension.SumSquares(D)) 394 | optimizer = WOA(fitness=benchmark.SumSquares, 395 | D=dimension.SumSquares(D), P=P, G=G, ub=ub, lb=lb) 396 | st = time.time() 397 | optimizer.opt() 398 | ed = time.time() 399 | F_table[t, item] = optimizer.gbest_F 400 | table[item]['avg'] += optimizer.gbest_F 401 | table[item]['time'] += ed - st 402 | table[item]['ideal'] = ideal_F.SumSquares() 403 | loss_curves[:, item] += optimizer.loss_curve 404 | 405 | 406 | item = item + 1 407 | ub = bound_X.Alpine()[1]*np.ones(dimension.Alpine(D)) 408 | lb = bound_X.Alpine()[0]*np.ones(dimension.Alpine(D)) 409 | optimizer = WOA(fitness=benchmark.Alpine, 410 | D=dimension.Alpine(D), P=P, G=G, ub=ub, lb=lb) 411 | st = time.time() 412 | optimizer.opt() 413 | ed = time.time() 414 | F_table[t, item] = optimizer.gbest_F 415 | table[item]['avg'] += optimizer.gbest_F 416 | table[item]['time'] += ed - st 417 | table[item]['ideal'] = ideal_F.Alpine() 418 | loss_curves[:, item] += optimizer.loss_curve 419 | 420 | 421 | item = item + 1 422 | ub = bound_X.Michalewicz()[1]*np.ones(dimension.Michalewicz()) 423 | lb = bound_X.Michalewicz()[0]*np.ones(dimension.Michalewicz()) 424 | optimizer = WOA(fitness=benchmark.Michalewicz, 425 | D=dimension.Michalewicz(), P=P, G=G, ub=ub, lb=lb) 426 | st = time.time() 427 | optimizer.opt() 428 | ed = time.time() 429 | F_table[t, item] = optimizer.gbest_F 430 | table[item]['avg'] += optimizer.gbest_F 431 | table[item]['time'] += ed - st 432 | table[item]['ideal'] = ideal_F.Michalewicz(dimension.Michalewicz()) 433 | loss_curves[:, item] += optimizer.loss_curve 434 | 435 | 436 | item = item + 1 437 | ub = bound_X.Exponential()[1]*np.ones(dimension.Exponential(D)) 438 | lb = bound_X.Exponential()[0]*np.ones(dimension.Exponential(D)) 439 | optimizer = WOA(fitness=benchmark.Exponential, 440 | D=dimension.Exponential(D), P=P, G=G, ub=ub, lb=lb) 441 | st = time.time() 442 | optimizer.opt() 443 | ed = time.time() 444 | F_table[t, item] = optimizer.gbest_F 445 | table[item]['avg'] += optimizer.gbest_F 446 | table[item]['time'] += ed - st 447 | table[item]['ideal'] = ideal_F.Exponential() 448 | loss_curves[:, item] += optimizer.loss_curve 449 | 450 | 451 | item = item + 1 452 | ub = bound_X.Schaffer()[1]*np.ones(dimension.Schaffer()) 453 | lb = bound_X.Schaffer()[0]*np.ones(dimension.Schaffer()) 454 | optimizer = WOA(fitness=benchmark.Schaffer, 455 | D=dimension.Schaffer(), P=P, G=G, ub=ub, lb=lb) 456 | st = time.time() 457 | optimizer.opt() 458 | ed = time.time() 459 | F_table[t, item] = optimizer.gbest_F 460 | table[item]['avg'] += optimizer.gbest_F 461 | table[item]['time'] += ed - st 462 | table[item]['ideal'] = ideal_F.Schaffer() 463 | loss_curves[:, item] += optimizer.loss_curve 464 | 465 | 466 | item = item + 1 467 | ub = bound_X.BentCigar()[1]*np.ones(dimension.BentCigar(D)) 468 | lb = bound_X.BentCigar()[0]*np.ones(dimension.BentCigar(D)) 469 | optimizer = WOA(fitness=benchmark.BentCigar, 470 | D=dimension.BentCigar(D), P=P, G=G, ub=ub, lb=lb) 471 | st = time.time() 472 | optimizer.opt() 473 | ed = time.time() 474 | F_table[t, item] = optimizer.gbest_F 475 | table[item]['avg'] += optimizer.gbest_F 476 | table[item]['time'] += ed - st 477 | table[item]['ideal'] = ideal_F.BentCigar() 478 | loss_curves[:, item] += optimizer.loss_curve 479 | 480 | 481 | item = item + 1 482 | ub = bound_X.Bohachevsky1()[1]*np.ones(dimension.Bohachevsky1()) 483 | lb = bound_X.Bohachevsky1()[0]*np.ones(dimension.Bohachevsky1()) 484 | optimizer = WOA(fitness=benchmark.Bohachevsky1, 485 | D=dimension.Bohachevsky1(), P=P, G=G, ub=ub, lb=lb) 486 | st = time.time() 487 | optimizer.opt() 488 | ed = time.time() 489 | F_table[t, item] = optimizer.gbest_F 490 | table[item]['avg'] += optimizer.gbest_F 491 | table[item]['time'] += ed - st 492 | table[item]['ideal'] = ideal_F.Bohachevsky1() 493 | loss_curves[:, item] += optimizer.loss_curve 494 | 495 | 496 | item = item + 1 497 | ub = bound_X.Elliptic()[1]*np.ones(dimension.Elliptic(D)) 498 | lb = bound_X.Elliptic()[0]*np.ones(dimension.Elliptic(D)) 499 | optimizer = WOA(fitness=benchmark.Elliptic, 500 | D=dimension.Elliptic(D), P=P, G=G, ub=ub, lb=lb) 501 | st = time.time() 502 | optimizer.opt() 503 | ed = time.time() 504 | F_table[t, item] = optimizer.gbest_F 505 | table[item]['avg'] += optimizer.gbest_F 506 | table[item]['time'] += ed - st 507 | table[item]['ideal'] = ideal_F.Elliptic() 508 | loss_curves[:, item] += optimizer.loss_curve 509 | 510 | 511 | item = item + 1 512 | ub = bound_X.DropWave()[1]*np.ones(dimension.DropWave()) 513 | lb = bound_X.DropWave()[0]*np.ones(dimension.DropWave()) 514 | optimizer = WOA(fitness=benchmark.DropWave, 515 | D=dimension.DropWave(), P=P, G=G, ub=ub, lb=lb) 516 | st = time.time() 517 | optimizer.opt() 518 | ed = time.time() 519 | F_table[t, item] = optimizer.gbest_F 520 | table[item]['avg'] += optimizer.gbest_F 521 | table[item]['time'] += ed - st 522 | table[item]['ideal'] = ideal_F.DropWave() 523 | loss_curves[:, item] += optimizer.loss_curve 524 | 525 | 526 | item = item + 1 527 | ub = bound_X.CosineMixture()[1]*np.ones(dimension.CosineMixture(D)) 528 | lb = bound_X.CosineMixture()[0]*np.ones(dimension.CosineMixture(D)) 529 | optimizer = WOA(fitness=benchmark.CosineMixture, 530 | D=dimension.CosineMixture(dimension.CosineMixture(D)), P=P, G=G, ub=ub, lb=lb) 531 | st = time.time() 532 | optimizer.opt() 533 | ed = time.time() 534 | F_table[t, item] = optimizer.gbest_F 535 | table[item]['avg'] += optimizer.gbest_F 536 | table[item]['time'] += ed - st 537 | table[item]['ideal'] = ideal_F.CosineMixture(dimension.CosineMixture(D)) 538 | loss_curves[:, item] += optimizer.loss_curve 539 | 540 | 541 | item = item + 1 542 | ub = bound_X.Ellipsoidal(dimension.Ellipsoidal(D))[1]*np.ones(dimension.Ellipsoidal(D)) 543 | lb = bound_X.Ellipsoidal(dimension.Ellipsoidal(D))[0]*np.ones(dimension.Ellipsoidal(D)) 544 | optimizer = WOA(fitness=benchmark.Ellipsoidal, 545 | D=dimension.Ellipsoidal(D), P=P, G=G, ub=ub, lb=lb) 546 | st = time.time() 547 | optimizer.opt() 548 | ed = time.time() 549 | F_table[t, item] = optimizer.gbest_F 550 | table[item]['avg'] += optimizer.gbest_F 551 | table[item]['time'] += ed - st 552 | table[item]['ideal'] = ideal_F.Ellipsoidal() 553 | loss_curves[:, item] += optimizer.loss_curve 554 | 555 | 556 | item = item + 1 557 | ub = bound_X.LevyandMontalvo1()[1]*np.ones(dimension.LevyandMontalvo1(D)) 558 | lb = bound_X.LevyandMontalvo1()[0]*np.ones(dimension.LevyandMontalvo1(D)) 559 | optimizer = WOA(fitness=benchmark.LevyandMontalvo1, 560 | D=dimension.LevyandMontalvo1(D), P=P, G=G, ub=ub, lb=lb) 561 | st = time.time() 562 | optimizer.opt() 563 | ed = time.time() 564 | F_table[t, item] = optimizer.gbest_F 565 | table[item]['avg'] += optimizer.gbest_F 566 | table[item]['time'] += ed - st 567 | table[item]['ideal'] = ideal_F.LevyandMontalvo1() 568 | loss_curves[:, item] += optimizer.loss_curve 569 | 570 | 571 | print(t+1) 572 | 573 | loss_curves = loss_curves / run_times 574 | loss_curves = pd.DataFrame(loss_curves) 575 | loss_curves.columns = ['Sphere', 'Rastrigin', 'Ackley', 'Griewank', 'Schwefel P2.22', 576 | 'Rosenbrock', 'Sehwwefel P2.21', 'Quartic', 'Schwefel P1.2', 'Penalized 1', 577 | 'Penalized 2', 'Schwefel P2.26', 'Step', 'Kowalik', 'Shekel Foxholes', 578 | 'Goldstein-Price', 'Shekel 5', 'Branin', 'Hartmann 3', 'Shekel 7', 579 | 'Shekel 10', 'Six-Hump Camel-Back', 'Hartmann 6', 'Zakharov', 'Sum Squares', 580 | 'Alpine', 'Michalewicz', 'Exponential', 'Schaffer', 'Bent Cigar', 581 | 'Bohachevsky 1', 'Elliptic', 'Drop Wave', 'Cosine Mixture', 'Ellipsoidal', 582 | 'Levy and Montalvo 1'] 583 | loss_curves.to_csv('loss_curves(WOA).csv') 584 | 585 | table.loc[['avg', 'time']] = table.loc[['avg', 'time']] / run_times 586 | table.loc['worst'] = F_table.max(axis=0) 587 | table.loc['best'] = F_table.min(axis=0) 588 | table.loc['std'] = F_table.std(axis=0) 589 | table.columns = ['Sphere', 'Rastrigin', 'Ackley', 'Griewank', 'Schwefel P2.22', 590 | 'Rosenbrock', 'Sehwwefel P2.21', 'Quartic', 'Schwefel P1.2', 'Penalized 1', 591 | 'Penalized 2', 'Schwefel P2.26', 'Step', 'Kowalik', 'Shekel Foxholes', 592 | 'Goldstein-Price', 'Shekel 5', 'Branin', 'Hartmann 3', 'Shekel 7', 593 | 'Shekel 10', 'Six-Hump Camel-Back', 'Hartmann 6', 'Zakharov', 'Sum Squares', 594 | 'Alpine', 'Michalewicz', 'Exponential', 'Schaffer', 'Bent Cigar', 595 | 'Bohachevsky 1', 'Elliptic', 'Drop Wave', 'Cosine Mixture', 'Ellipsoidal', 596 | 'Levy and Montalvo 1'] 597 | table.to_csv('table(WOA).csv') --------------------------------------------------------------------------------