class_docstr: genetic algorithm
  
  Parameters
  ----------------
  func : function
      The func you want to do optimal
  n_dim : int
      number of variables of func
  lb : array_like
      The lower bound of every variables of func
  ub : array_like
      The upper bound of every variables of func
  constraint_eq : tuple
      equal constraint
  constraint_ueq : tuple
      unequal constraint
  precision : array_like
      The precision of every variables of func
  size_pop : int
      Size of population
  max_iter : int
      Max of iter
  prob_mut : float between 0 and 1
      Probability of mutation
  n_processes : int
      Number of processes, 0 means use all cpu
  Attributes
  ----------------------
  Lind : array_like
       The num of genes of every variable of func（segments）
  generation_best_X : array_like. Size is max_iter.
      Best X of every generation
  generation_best_ranking : array_like. Size if max_iter.
      Best ranking of every generation
  Examples
  -------------
  https://github.com/guofei9987/scikit-opt/blob/master/examples/demo_ga.py
code: def gray2rv(self, gray_code):
      # Gray Code to real value: one piece of a whole chromosome
      # input is a 2-dimensional numpy array of 0 and 1.
      # output is a 1-dimensional numpy array which convert every row of input into a real number.
      _, len_gray_code = gray_code.shape
      b = gray_code.cumsum(axis=1) % 2
      mask = np.logspace(
          start=1, stop=len_gray_code, base=0.5, num=len_gray_code
      )
      return (b * mask).sum(axis=1) / mask.sum()
  
imports: import numpy
  from .base import SkoBase
  from sko.tools import func_transformer
  from abc import ABCMeta, abstractmethod
  from .operators import crossover, mutation, ranking, selection
label_desc: Use image node_id 3 for calling the GA obj's underlying member method code with example usage: obj.gray2rv(gray_code) and returns: unknown