pastebin

Paste Search Dynamic
Recent pastes
BHPSOGWO
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3.  
  4. np.random.seed(42)
  5.  
  6. class BHPSOGWO():
  7.     def __init__(self, fit_func, num_dim=30, num_particle=20, max_iter=500):
  8.         self.fit_func = fit_func
  9.         self.num_dim = num_dim
  10.         self.num_particle = num_particle
  11.         self.max_iter = max_iter
  12.  
  13.         self.score_alpha = np.inf
  14.         self.score_beta = np.inf
  15.         self.score_delta = np.inf
  16.         self.X_alpha = np.zeros(self.num_dim)
  17.         self.X_beta = np.zeros(self.num_dim)
  18.         self.X_delta = np.zeros(self.num_dim)
  19.         self.gBest_X = np.zeros(self.num_dim)
  20.        
  21.         self.C1 = 0.5
  22.         self.C2 = 0.5
  23.         self.C3 = 0.5
  24.        
  25.         self.X = (np.random.uniform(size=[self.num_particle, self.num_dim]) > 0.5)*1.0
  26.        
  27.         self.gBest_curve = np.zeros(self.max_iter)
  28.         self.gBest_score = 0
  29.        
  30.         self.V = 0.3 * np.random.normal(size=[self.num_particle, self.num_dim])
  31.        
  32.         self.w = 0.5 + np.random.uniform()/2
  33.        
  34.         self._iter = 0
  35.        
  36.         self._itter = self._iter + 1
  37.  
  38.        
  39.     def opt(self):
  40.         while(self._iter<self.max_iter):
  41.             for i in range(self.num_particle):
  42.                 score = self.fit_func(self.X[i, :])
  43.                
  44.                 if score<self.score_alpha:
  45.                     # # ---EvoloPy ver.---
  46.                     # self.score_delta = self.score_beta
  47.                     # self.X_delta = self.X_beta.copy()
  48.                     # self.score_beta = self.score_alpha
  49.                     # self.X_beta = self.X_alpha.copy()
  50.                     # # ------------------
  51.                     self.score_alpha = score.copy()
  52.                     self.X_alpha = self.X[i, :].copy()
  53.            
  54.                 if score>self.score_alpha and score<self.score_beta:
  55.                     # # ---EvoloPy ver.---
  56.                     # self.score_delta = self.score_beta
  57.                     # self.X_delta = self.X_beta.copy()
  58.                     # # ------------------
  59.                     self.score_beta = score.copy()
  60.                     self.X_beta = self.X[i, :].copy()
  61.            
  62.                 if score>self.score_alpha and score>self.score_beta and score<self.score_delta:
  63.                     self.score_delta = score.copy()
  64.                     self.X_delta = self.X[i, :].copy()
  65.            
  66.             a = 2 - 2*self._iter/self.max_iter # (8)
  67.            
  68.             for i in range(self.num_particle):
  69.                 r1 = np.random.uniform(size=[self.num_dim])
  70.                 A1 = 2*a*r1 - a # (3)
  71.                 D_alpha = np.abs(self.C1*self.X_alpha - self.w*self.X[i, :]) #(19)
  72.                 cstep_alpha = self.sigmoid(-1*A1*D_alpha) # (18)
  73.                 bstep_alpha = ( cstep_alpha>=np.random.uniform(size=[self.num_dim]) )*1.0 # (17)
  74.                 X1 = ((self.X_alpha+bstep_alpha)>=1)*1.0 # (16)
  75.                
  76.                 r1 = np.random.uniform(size=[self.num_dim])
  77.                 A2 = 2*a*r1 - a # (3)
  78.                 D_beta = np.abs(self.C2*self.X_beta - self.w*self.X[i, :]) #(19)
  79.                 cstep_beta = self.sigmoid(-1*A2*D_beta) # (18)
  80.                 bstep_beta = ( cstep_beta>=np.random.uniform(size=[self.num_dim]) )*1.0 # (17)
  81.                 X2 = ((self.X_beta+bstep_beta)>=1)*1.0 # (16)
  82.                
  83.                 r1 = np.random.uniform(size=[self.num_dim])
  84.                 A3 = 2*a*r1 - a # (3)
  85.                 D_delta = np.abs(self.C3*self.X_delta - self.w*self.X[i, :]) #(19)
  86.                 cstep_delta = self.sigmoid(-1*A3*D_delta) # (18)
  87.                 bstep_delta = ( cstep_delta>=np.random.uniform(size=[self.num_dim]) )*1.0 # (17)
  88.                 X3 = ((self.X_delta+bstep_delta)>=1)*1.0 # (16)
  89.                
  90.                 # with r
  91.                 r1 = np.random.uniform(size=[self.num_dim])
  92.                 r2 = np.random.uniform(size=[self.num_dim])
  93.                 r3 = np.random.uniform(size=[self.num_dim])
  94.                 self.V[i, :] = self.w*(self.V[i, :]
  95.                                        + self.C1*r1*(X1-self.X[i, :])
  96.                                        + self.C2*r2*(X2-self.X[i, :])
  97.                                        + self.C3*r3*(X3-self.X[i, :])) # (20)
  98.                
  99.                 self.X[i, :] = self.sigmoid((X1+X2+X3)/3) + self.V[i, :] # (21) + (14)
  100.                
  101.                 self.X[i, :] = ( self.X[i, :]>=np.random.uniform(size=[self.num_dim]) ) *1.0 # (14)
  102.            
  103.             # print('iter:', self._iter, ', score:', self.score_alpha)
  104.             # print(self.X_alpha)
  105.             # print('---')
  106.            
  107.             self._iter = self._iter + 1
  108.             self.gBest_curve[self._iter-1] = self.score_alpha.copy()
  109.             self.gBest_score = self.score_alpha.copy()
  110.             self.gBest_X = self.X_alpha.copy()
  111.        
  112.     def plot_curve(self):
  113.         plt.figure()
  114.         plt.title('loss curve ['+str(round(self.gBest_curve[-1], 3))+']')
  115.         plt.plot(self.gBest_curve, label='loss')
  116.         plt.grid()
  117.         plt.legend()
  118.         plt.show()
  119.    
  120.     def sigmoid(self, x):
  121.         return 1/(1+np.exp(-10*(x-0.5))) # (15)
Parsed in 0.074 seconds