Changeset 1289 for framspy/evolalg
- Timestamp:
- 01/15/24 05:43:37 (10 months ago)
- Location:
- framspy/evolalg
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
framspy/evolalg/base/experiment_abc.py
r1283 r1289 23 23 current_generation = 0 24 24 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: 28 28 self.hof = HallOfFame(hof_size) 29 29 self.popsize = popsize … … 126 126 # instead of single best, could add all individuals in population here, but then the outcome would depend on the order of adding 127 127 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)) 132 130 133 131 def initialize_evolution(self, initialgenotype): … … 149 147 # saved generation has been completed, start with the next one 150 148 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 154 150 else: 155 151 self.initialize_evolution(initialgenotype) … … 192 188 def get_args_for_parser(): 193 189 parser = argparse.ArgumentParser() 194 parser.add_argument('-popsize', type= int, default=50,190 parser.add_argument('-popsize', type=int, default=50, 195 191 help="Population size, default: 50.") 196 parser.add_argument('-generations', type= int, default=5,192 parser.add_argument('-generations', type=int, default=5, 197 193 help="Number of generations, default: 5.") 198 parser.add_argument('-tournament', type= int, default=5,194 parser.add_argument('-tournament', type=int, default=5, 199 195 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, 201 197 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, 203 199 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, 205 201 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, 207 203 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, 209 205 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.") 210 208 211 209 return parser -
framspy/evolalg/base/experiment_niching_abc.py
r1272 r1289 24 24 archive_size: int = None 25 25 26 def __init__(self, fit, normalize, popsize, hof_size, save_only_best =True, knn_niching=5, knn_nslc=10, archive_size=0) -> None:26 def __init__(self, fit, normalize, popsize, hof_size, save_only_best, knn_niching, knn_nslc, archive_size) -> None: 27 27 ExperimentABC.__init__(self,popsize=popsize, hof_size=hof_size, save_only_best=save_only_best) 28 28 self.fit = fit … … 51 51 divide_by = np.sum(dissim_matrix) 52 52 else: 53 raise Exception(f"Wrong normalization method,",self.normalize)53 raise ValueError("Wrong normalization method: '%s'" % self.normalize) 54 54 if divide_by != 0: 55 55 return dissim_matrix/divide_by … … 65 65 dissim_list = np.mean(np.partition( 66 66 self.normalize_dissim(dissim_matrix), self.knn_niching)[:, :self.knn_niching], axis=1) 67 68 if Individual.fitness_set_negative_to_zero is False and ("niching" in self.fit or "novelty" in self.fit): 69 raise ValueError("Negative fitness values not tested in combination with niching or novelty. When using these techniques, verify formulas or consider using the flag -fitness_set_negative_to_zero") # once the formulas are verified/improved, the command-line flag and this conditional check can be removed. 67 70 68 71 if "niching" in self.fit: … … 73 76 i.fitness = d 74 77 else: 75 raise Exception("Wrong fit type: ", self.fit, 76 f" choose the correct one or implement a new behavior.") 78 raise ValueError("Unsupported fit type: '%s'. Use the correct type or implement a new behavior." % self.fit) 77 79 population_structures.update_archive(dissim_matrix, population_archive) 78 80 -
framspy/evolalg/run_frams_islands.py
r1205 r1289 1 1 from FramsticksLib import FramsticksLib 2 2 from .structures.individual import Individual 3 3 from .frams_base.experiment_frams_islands import ExperimentFramsIslands 4 4 … … 8 8 # must be set before FramsticksLib() constructor call 9 9 FramsticksLib.DETERMINISTIC = False 10 parsed_args =ExperimentFramsIslands.get_args_for_parser().parse_args() 10 parsed_args = ExperimentFramsIslands.get_args_for_parser().parse_args() 11 Individual.fitness_set_negative_to_zero = parsed_args.fitness_set_negative_to_zero # setting the "static" field once 11 12 print("Argument values:", ", ".join( 12 13 ['%s=%s' % (arg, getattr(parsed_args, arg)) for arg in vars(parsed_args)])) … … 22 23 } 23 24 24 print('Best individuals:')25 25 experiment = ExperimentFramsIslands(frams_lib=framsLib, 26 26 optimization_criteria=opt_criteria, -
framspy/evolalg/run_frams_niching.py
r1270 r1289 1 1 from FramsticksLib import FramsticksLib 2 from .structures.individual import Individual 2 3 3 4 from .frams_base.experiment_frams_niching import ExperimentFramsNiching … … 9 10 FramsticksLib.DETERMINISTIC = False 10 11 parsed_args = ExperimentFramsNiching.get_args_for_parser().parse_args() 12 Individual.fitness_set_negative_to_zero = parsed_args.fitness_set_negative_to_zero # setting the "static" field once 11 13 print("Argument values:", ", ".join( 12 14 ['%s=%s' % (arg, getattr(parsed_args, arg)) for arg in vars(parsed_args)])) … … 22 24 } 23 25 24 print('Best individuals:')25 26 experiment = ExperimentFramsNiching(frams_lib=framsLib, 26 27 optimization_criteria=opt_criteria, -
framspy/evolalg/run_numerical_example.py
r1190 r1289 1 import numpy as np 1 2 from .numerical_example.numerical_example import ExperimentNumerical 3 from .structures.individual import Individual 2 4 3 5 4 6 def main(): 5 7 parsed_args = ExperimentNumerical.get_args_for_parser().parse_args() 8 Individual.fitness_set_negative_to_zero = parsed_args.fitness_set_negative_to_zero # setting the "static" field once 6 9 print("Argument values:", ", ".join( 7 10 ['%s=%s' % (arg, getattr(parsed_args, arg)) for arg in vars(parsed_args)])) 8 11 9 initialgenotype = [100, 100, 100, 100] 10 print('Best individuals:') 12 initialgenotype = np.array([100, 100, 100, 100]) 11 13 experiment = ExperimentNumerical( 12 14 hof_size=parsed_args.hof_size, … … 20 22 pxov=parsed_args.pxov, 21 23 tournament_size=parsed_args.tournament) 22 print( len(hof))24 print('Best individuals:') 23 25 for ind in hof: 24 print(ind. genotype, ind.rawfitness)26 print(ind.rawfitness, '\t-->\t', ind.genotype) 25 27 26 28 -
framspy/evolalg/run_numerical_islands_example.py
r1190 r1289 1 from .numerical_example.numerical_islands_example import \ 2 ExperimentNumericalIslands 1 import numpy as np 2 from .numerical_example.numerical_islands_example import ExperimentNumericalIslands 3 from .structures.individual import Individual 3 4 4 5 5 6 def main(): 6 7 parsed_args = ExperimentNumericalIslands.get_args_for_parser().parse_args() 8 Individual.fitness_set_negative_to_zero = parsed_args.fitness_set_negative_to_zero # setting the "static" field once 7 9 print("Argument values:", ", ".join( 8 10 ['%s=%s' % (arg, getattr(parsed_args, arg)) for arg in vars(parsed_args)])) 9 11 10 initialgenotype = [100, 100, 100, 100] 11 print('Best individuals:') 12 initialgenotype = np.array([100, 100, 100, 100]) 12 13 experiment = ExperimentNumericalIslands( 13 14 hof_size=parsed_args.hof_size, … … 23 24 pxov=parsed_args.pxov, 24 25 tournament_size=parsed_args.tournament) 25 print( len(hof))26 print('Best individuals:') 26 27 for ind in hof: 27 print(ind. genotype, ind.rawfitness)28 print(ind.rawfitness, '\t-->\t', ind.genotype) 28 29 29 30 -
framspy/evolalg/structures/individual.py
r1272 r1289 3 3 4 4 class Individual: 5 only_positive_fitness = True # Note: when using diversification techniques (e.g. niching), setting this toFalse and allowing negative fitness values requires verifying/improving diversification formulas. Dividing fitness by similarity (or multiplying by diversity) may have undesired consequences when fitness can be both positive and negative (e.g. low similarity may make positive fitness values higher and negative fitness values lower, while the intention would be to improve fitness for low similarity).5 fitness_set_negative_to_zero = False # "static" field. Note: when using diversification techniques (e.g. niching or novelty), leaving this as False and allowing negative fitness values requires verifying/improving diversification formulas. Dividing fitness by similarity (or multiplying by diversity) may have undesired consequences when fitness can be both positive and negative (e.g. low similarity may make positive fitness values higher and negative fitness values lower, while the intention would be to improve fitness for low similarity). 6 6 7 7 def __init__(self): … … 29 29 fitness = evaluate(genotype) 30 30 if fitness is not BAD_FITNESS: # BAD_FITNESS indicates that the genotype was not valid or some other problem occurred during evaluation 31 if self.only_positive_fitness: 32 if fitness < 0: 33 fitness = 0 31 if Individual.fitness_set_negative_to_zero and fitness < 0: 32 fitness = 0 34 33 self.fitness = self.rawfitness = fitness 35 34
Note: See TracChangeset
for help on using the changeset viewer.