code: def run(self, max_iter=None):
      self.max_iter = max_iter or self.max_iter
      for iter_num in range(self.max_iter):
          # self.update_V()
          self.recorder()
          self.update_X()
          # self.cal_y()
          # self.update_pbest()
          # self.update_gbest()
  
          if self.verbose:
              print(
                  "Iter: {}, Best fit: {} at {}".format(
                      iter_num, self.gbest_y, self.gbest_x
                  )
              )
  
          self.gbest_y_hist.append(self.gbest_y)
      self.best_x, self.best_y = self.gbest_x, self.gbest_y
      return self.best_x, self.best_y
  
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 9 for calling the PSO_TSP obj's underlying member method code with example usage: obj.run(max_iter) and returns: self,  self