docstr: V[i]=X[r1]+F(X[r2]-X[r3]),
  where i, r1, r2, r3 are randomly generated
docstr_tok: ["V","[","i","]","=X","[","r1","]","+F","(","X","[","r2","]","-X","[","r3","]",")",",","where","i",",","r1",",","r2",",","r3","are","randomly","generated"]
code: def mutation(self):
      """
      V[i]=X[r1]+F(X[r2]-X[r3]),
      where i, r1, r2, r3 are randomly generated
      """
      X = self.X
      # i is not needed,
      # and TODO: r1, r2, r3 should not be equal
      random_idx = np.random.randint(
          0, self.size_pop, size=(self.size_pop, 3)
      )
  
      r1, r2, r3 = random_idx[:, 0], random_idx[:, 1], random_idx[:, 2]
  
      # 这里F用固定值，为了防止早熟，可以换成自适应值
      self.V = X[r1, :] + self.F * (X[r2, :] - X[r3, :])
  
      # the lower & upper bound still works in mutation
      mask = np.random.uniform(
          low=self.lb, high=self.ub, size=(self.size_pop, self.n_dim)
      )
      self.V = np.where(self.V < self.lb, mask, self.V)
      self.V = np.where(self.V > self.ub, mask, self.V)
      return self.V
  
file_path: scikit-opt/sko/DE.py
imports: import numpy
  from .base import SkoBase
  from abc import ABCMeta, abstractmethod
  from .operators import crossover, mutation, ranking, selection
  from .GA import GeneticAlgorithmBase, GA
label_desc: Use image node_id 5 for calling the DE obj's underlying member method code with example usage: obj.mutation() and returns: self