code: def update_X(self):
      for i in range(self.size_pop):
          x = self.X[i, :]
          x = self.pso_add(self.cp, x, self.pbest_x[i])
          self.X[i, :] = x
  
      self.cal_y()
      self.update_pbest()
      self.update_gbest()
  
      for i in range(self.size_pop):
          x = self.X[i, :]
          x = self.pso_add(self.cg, x, self.gbest_x)
          self.X[i, :] = x
  
      self.cal_y()
      self.update_pbest()
      self.update_gbest()
  
      for i in range(self.size_pop):
          x = self.X[i, :]
          new_x_strategy = np.random.randint(3)
          if new_x_strategy == 0:
              x = mutation.swap(x)
          elif new_x_strategy == 1:
              x = mutation.reverse(x)
          elif new_x_strategy == 2:
              x = mutation.transpose(x)
  
          self.X[i, :] = x
  
      self.cal_y()
      self.update_pbest()
      self.update_gbest()
  
imports: import numpy
  from sko.tools import func_transformer
  from .base import SkoBase
  from .operators import crossover, mutation, ranking, selection
  from .operators import mutation
label_desc: Use image node_id 4 for calling the PSO_TSP obj's underlying member method code with example usage: obj.update_X() without return types