Ignore:
Timestamp:
01/15/24 05:43:37 (4 months ago)
Author:
Maciej Komosinski
Message:

fitness_set_negative_to_zero boolean (a.k.a. "only positive fitness", needed for novelty and niching diversity control) becomes a command-line flag instead of a hardcoded value

File:
1 edited

Legend:

Unmodified
Added
Removed
  • framspy/evolalg/base/experiment_abc.py

    r1283 r1289  
    2323    current_generation = 0
    2424    time_elapsed = 0
    25    
    26 
    27     def __init__(self, popsize, hof_size, save_only_best=True) -> None:
     25
     26
     27    def __init__(self, popsize, hof_size, save_only_best) -> None:
    2828        self.hof = HallOfFame(hof_size)
    2929        self.popsize = popsize
     
    126126        # instead of single best, could add all individuals in population here, but then the outcome would depend on the order of adding
    127127        self.hof.add(best)
    128         self.stats.append(
    129             best.rawfitness if self.save_only_best else best)
    130         print("%d\t%d\t%g\t%g" % (generation, len(
    131             all_individuals), worst.rawfitness, best.rawfitness))
     128        self.stats.append(best.rawfitness if self.save_only_best else best)
     129        print("%d\t%d\t%g\t%g" % (generation, len(all_individuals), worst.rawfitness, best.rawfitness))
    132130
    133131    def initialize_evolution(self, initialgenotype):
     
    149147            # saved generation has been completed, start with the next one
    150148            self.current_generation += 1
    151             print("...Resuming from saved state: population size = %d, hof size = %d, stats size = %d, archive size = %d, generation = %d/%d" % (len(self.population_structures.population), len(self.hof),
    152                                                                                                                                                  len(self.stats),  (len(self.population_structures.archive)), self.current_generation, generations))  # self.current_generation (and g) are 0-based, parsed_args.generations is 1-based
    153 
     149            print("...Resuming from saved state: population size = %d, hof size = %d, stats size = %d, archive size = %d, generation = %d/%d" % (len(self.population_structures.population), len(self.hof), len(self.stats), (len(self.population_structures.archive)), self.current_generation, generations))  # self.current_generation (and g) are 0-based, parsed_args.generations is 1-based
    154150        else:
    155151            self.initialize_evolution(initialgenotype)
     
    192188    def get_args_for_parser():
    193189        parser = argparse.ArgumentParser()
    194         parser.add_argument('-popsize',type= int, default= 50,
     190        parser.add_argument('-popsize', type=int, default=50,
    195191                            help="Population size, default: 50.")
    196         parser.add_argument('-generations',type= int, default= 5,
     192        parser.add_argument('-generations', type=int, default=5,
    197193                                help="Number of generations, default: 5.")
    198         parser.add_argument('-tournament',type= int, default= 5,
     194        parser.add_argument('-tournament', type=int, default=5,
    199195                            help="Tournament size, default: 5.")
    200         parser.add_argument('-pmut',type= float, default= 0.7,
     196        parser.add_argument('-pmut', type=float, default=0.7,
    201197                        help="Probability of mutation, default: 0.7")
    202         parser.add_argument('-pxov',type= float, default= 0.2,
     198        parser.add_argument('-pxov', type=float, default=0.2,
    203199                        help="Probability of crossover, default: 0.2")
    204         parser.add_argument('-hof_size',type= int, default= 10,
     200        parser.add_argument('-hof_size', type=int, default=10,
    205201                            help="Number of genotypes in Hall of Fame. Default: 10.")
    206         parser.add_argument('-hof_savefile',type= str, required= False,
     202        parser.add_argument('-hof_savefile', type=str, required=False,
    207203                                help= 'If set, Hall of Fame will be saved in Framsticks file format (recommended extension *.gen. This also activates saving state (checpoint} file and auto-resuming from the saved state, if this file exists.')
    208         parser.add_argument('-save_only_best',type= bool, default= True, required= False,
     204        parser.add_argument('-save_only_best', type=bool, default=True, required=False,
    209205                            help="")
     206        parser.add_argument('-fitness_set_negative_to_zero', action='store_true',
     207                            help="This flag forces fitness to become max(0,fitness), so it is always made non-negative. Using niching or novelty techniques without this flag (thus allowing negative fitness values) requires verifying/improving fitness diversification formulas to work as intended for both positive and negative fitness values.")
    210208       
    211209        return parser
Note: See TracChangeset for help on using the changeset viewer.