class_docstr: Class version of NSGA-III selection including memory for best, worst and
  extreme points. Registering this operator in a toolbox is a bit different
  than classical operators, it requires to instantiate the class instead
  of just registering the function::
  
      >>> from deap import base
      >>> ref_points = uniform_reference_points(nobj=3, p=12)
      >>> toolbox = base.Toolbox()
      >>> toolbox.register("select", selNSGA3WithMemory(ref_points))
class_docstr_tok: ["Class","version","of","NSGA-III","selection","including","memory","for","best",",","worst","and","extreme","points",".","Registering","this","operator","in","a","toolbox","is","a","bit","different","than","classical","operators",",","it","requires","to","instantiate","the","class","instead","of","just","registering","the","function",":",":",">",">",">","from","deap","import","base",">",">",">","ref_points","=","uniform_reference_points","(","nobj=3",",","p=12",")",">",">",">","toolbox","=","base.Toolbox","(",")",">",">",">","toolbox.register","(","``","select","''",",","selNSGA3WithMemory","(","ref_points",")",")"]
code: def __call__(self, individuals, k):
      chosen, memory = selNSGA3(
          individuals,
          k,
          self.ref_points,
          self.nd,
          self.best_point,
          self.worst_point,
          self.extreme_points,
          True,
      )
      self.best_point = memory.best_point.reshape((1, -1))
      self.worst_point = memory.worst_point.reshape((1, -1))
      self.extreme_points = memory.extreme_points
      return chosen
  
imports: import bisect
  from collections import defaultdict, namedtuple
  from itertools import chain
  import math
  from operator import attrgetter, itemgetter
  import random
  import numpy
label_desc: Use image node_id 2 for calling the selNSGA3WithMemory obj's underlying member method code with example usage: obj.__call__(individuals, k) and returns: chosen