コード例 #1
0
ファイル: test_genalg.py プロジェクト: vishalbelsare/GASTOp
    def testProgressBar(self):
        """Tests single progress bar for genalg.
        """
        user_spec_nodes = np.array([[]]).reshape(0, 3)

        nodes = np.array([[1, 2, 3], [2, 3, 4]])
        edges = np.array([[0, 1]])
        properties = np.array([[0, 3]])

        pop_size = 10
        population = [
            Truss(user_spec_nodes, nodes, edges, properties)
            for i in range(pop_size)
        ]

        for truss in population:
            truss.fitness_score = np.random.random()

        population.sort(key=lambda x: x.fitness_score)

        GA = GenAlg(config)

        GA.population = population
        progress_truss = False
        progress_fitness = False
        # dumb GA run
        num_generations = 20
        progress = ProgMon(progress_fitness, progress_truss, num_generations)
        # Loop over all generations:
        for current_gen in tqdm(range(num_generations)):
            progress.progress_monitor(current_gen, population)
            time.sleep(0.05)
            for truss in GA.population:
                truss.fitness_score = truss.fitness_score + 5.0
        return GA.population[0], GA.pop_progress
コード例 #2
0
ファイル: __main__.py プロジェクト: vishalbelsare/GASTOp
def main(args=sys.argv[1:]):
    """Runs the main GASTOp script, from the command line.

    Reads and parses user input from command line, runs the code,
    and prints and plots the resulting best truss.
    """

    args = parse_args(args)
    config = utilities.init_file_parser(args.config_path)

    if args.display:
        progress_fitness = True
        progress_truss = True
    elif args.quiet:
        progress_fitness = False
        progress_truss = False
    else:
        progress_fitness = config['monitor_params']['progress_fitness']
        progress_truss = config['monitor_params']['progress_truss']

    if args.num_threads:
        num_threads = args.num_threads
    else:
        num_threads = config['ga_params']['num_threads']

    if args.num_gens:
        num_generations = args.num_gens
    else:
        num_generations = config['ga_params']['num_generations']

    if args.pop_size:
        pop_size = args.pop_size
    else:
        pop_size = config['ga_params']['pop_size']

    # Create the Genetic Algorithm Object
    ga = GenAlg(config)
    ga.initialize_population(pop_size)
    best, progress_history = ga.run(num_generations=num_generations,
                                    progress_fitness=progress_fitness,
                                    progress_truss=progress_truss,
                                    num_threads=num_threads)

    print(best)
    if args.output:
        utilities.save_progress_history(progress_history,
                                        path_progress_history=args.output)

    if progress_fitness or progress_truss:
        best.plot(
            domain=config['random_params']['domain'],
            loads=config['evaluator_params']['boundary_conditions']['loads'],
            fixtures=config['evaluator_params']['boundary_conditions']
            ['fixtures'],
            deflection=True)
コード例 #3
0
    def test_rastrigin(self):
        """Test GA using rastrigin function,
        highly non-convex optimization test function.
        """

        config['fitness_params'] = {'equation': 'rastrigin', 'parameters': {}}
        config['ga_params']['pop_size'] = 1000
        ga = GenAlg(config)
        ga.initialize_population()
        best, progress_history = ga.run()
        self.assertAlmostEqual(best.fitness_score, 0, places=2)
コード例 #4
0
    def test_sphere(self):
        """Tests GA using sphere function, 
        ie sum of squares. Simple convex test case.
        """

        config['ga_params']['num_threads'] = 2
        config['fitness_params'] = {'equation': 'sphere', 'parameters': {}}
        ga = GenAlg(config)
        ga.initialize_population(pop_size)
        best, progress_history = ga.run(num_generations=100,
                                        progress_fitness=True,
                                        progress_truss=False)
        self.assertAlmostEqual(best.fitness_score, 0, places=4)
コード例 #5
0
ファイル: test_genalg.py プロジェクト: vishalbelsare/GASTOp
    def testInvalidCrossover(self):
        """Tests genalg when % crossover + % mutation >1"""

        config = utilities.init_file_parser(init_file_path)
        config['ga_params']['percent_crossover'] = .6
        config['ga_params']['percent_mutation'] = .6
        ga = GenAlg(config)
        ga.initialize_population(100)
        for t in ga.population:
            t.fitness_score = np.random.random()
        self.assertRaises(RuntimeError, ga.update_population)

        bad_path = 'gastop-config/error_config.txt'
        self.assertRaises(RuntimeError, utilities.init_file_parser, bad_path)
コード例 #6
0
ファイル: test_genalg.py プロジェクト: vishalbelsare/GASTOp
    def test_nodes_in_domain(self):
        """Tests if the created nodes are in the desired range.
        """
        # Create the Genetic Algorithm Object
        ga = GenAlg(config)
        ga.initialize_population(pop_size)

        for truss in ga.population:
            for node in truss.rand_nodes:
                self.assertTrue(node[0] > ga.random_params['domain'][0, 0])
                self.assertTrue(node[0] < ga.random_params['domain'][1, 0])
                self.assertTrue(node[1] > ga.random_params['domain'][0, 1])
                self.assertTrue(node[1] < ga.random_params['domain'][1, 1])
                self.assertTrue(node[2] > ga.random_params['domain'][0, 2])
                self.assertTrue(node[2] < ga.random_params['domain'][1, 2])
コード例 #7
0
ファイル: test_utilities.py プロジェクト: f0uriest/GASTOp
    def testSaveLoadPopProgress(self):
        '''Tests that the pop_progress dictionary is correctly saved to and
        loaded from a JSON file.
        '''
        # Parse input paramters from init.txt file
        init_file_path = 'gastop-config/struct_making_test_init.txt'
        config = utilities.init_file_parser(init_file_path)

        progress_fitness = False
        progress_truss = False
        num_threads = 1
        num_generations = 3
        pop_size = 5

        # Create the Genetic Algorithm Object
        ga = GenAlg(config)
        ga.initialize_population(pop_size)
        best, progress_history = ga.run(num_generations=num_generations,
                                        progress_fitness=progress_fitness,
                                        progress_truss=progress_truss,
                                        num_threads=num_threads)

        # Save and load pop_progress to/from JSON file
        utilities.save_progress_history(progress_history)
        loaded_progress_history = utilities.load_progress_history()
        print(loaded_progress_history)

        for gen in loaded_progress_history.keys():
            self.assertTrue(
                isinstance(loaded_progress_history[gen]['Generation'], int))
            self.assertTrue(
                isinstance(loaded_progress_history[gen]['Best Truss'], Truss))
            self.assertTrue(
                isinstance(loaded_progress_history[gen]['Best Fitness Score'],
                           float))
            self.assertTrue(
                isinstance(
                    loaded_progress_history[gen]
                    ['Population Median Fitness Score'], float))
            self.assertTrue(
                isinstance(
                    loaded_progress_history[gen]
                    ['Population Fitness Score Range'], float))
コード例 #8
0
ファイル: test_genalg.py プロジェクト: vishalbelsare/GASTOp
    def testProgressPlotClass(self):
        """Tests fitness plot for progmon
        """
        user_spec_nodes = np.array([[]]).reshape(0, 3)
        nodes = np.array([[1, 2, 3], [2, 3, 4]])
        edges = np.array([[0, 1]])
        properties = np.array([[0, 3]])

        pop_size = 10
        population = [
            Truss(user_spec_nodes, nodes, edges, properties)
            for i in range(pop_size)
        ]

        for truss in population:
            truss.fitness_score = np.random.random()

        population.sort(key=lambda x: x.fitness_score)
        # print([x.fitness_score for x in population])

        GA = GenAlg(config)

        GA.population = population
        progress_fitness = True
        progress_truss = False
        num_generations = 20

        progress = ProgMon(progress_fitness, progress_truss, num_generations)
        #

        # Loop over all generations:
        for current_gen in range(num_generations):
            progress.progress_monitor(current_gen, population)
            for truss in GA.population:
                #truss.fos = np.random.random()
                truss.fitness_score = truss.fitness_score + 5.0
        # plt.show()  # sfr, keep plot from closing right after this completes, terminal will hang until this is closed
        return GA.population[0], GA.pop_progress
コード例 #9
0
ファイル: test_genalg.py プロジェクト: vishalbelsare/GASTOp
    def testSaveLoadState(self):
        '''Tests that config and population can be saved to and loaded from
        JSON files.
        '''
        # Parse input parameters from init file
        init_file_path = 'gastop-config/struct_making_test_init.txt'
        config = utilities.init_file_parser(init_file_path)

        # Create GenAlg object
        pop_size = int(1e4)
        ga = GenAlg(config)
        ga.initialize_population(pop_size)

        # Save and reload
        ga.save_state()
        ga_loaded = ga.load_state()
        config = ga_loaded.config
        population = ga_loaded.population

        # Test config
        self.assertTrue(isinstance(config['ga_params']['num_elite'], int))
        self.assertTrue(
            isinstance(config['ga_params']['percent_crossover'], float))
        self.assertTrue(
            type(config['mutator_params']['node_mutator_params']['boundaries'])
            is type(np.array([1, 1])))
        self.assertTrue(
            isinstance(
                config['mutator_params']['node_mutator_params']['int_flag'],
                bool))

        # Test population
        for truss in population:
            self.assertTrue(isinstance(truss, Truss))
            self.assertTrue(isinstance(truss.user_spec_nodes, np.ndarray))
            self.assertTrue(isinstance(truss.rand_nodes, np.ndarray))
            self.assertTrue(isinstance(truss.edges, np.ndarray))
            self.assertTrue(isinstance(truss.properties, np.ndarray))
コード例 #10
0
ファイル: test_genalg.py プロジェクト: vishalbelsare/GASTOp
    def testUpdatePopulation(self):
        '''Tests that the population correctly updates every generation.
        '''
        # Create GenAlg object and assign random fitness scores
        pop_size = int(1e4)
        ga = GenAlg(init_file_path)
        ga.initialize_population(pop_size)
        for truss in ga.population:
            truss.fitness_score = np.random.random()

        ga.population.sort(key=lambda x: x.fitness_score)
        ga.update_population()

        # Check that population is sorted by fitness_score
        fitness = [truss.fitness_score for truss in ga.population
                   ][:config['ga_params']['num_elite']]
        self.assertTrue(sorted(fitness) == fitness)

        for truss in ga.population:
            self.assertTrue(isinstance(truss, Truss))
            self.assertTrue(isinstance(truss.user_spec_nodes, np.ndarray))
            self.assertTrue(isinstance(truss.rand_nodes, np.ndarray))
            self.assertTrue(isinstance(truss.edges, np.ndarray))
            self.assertTrue(isinstance(truss.properties, np.ndarray))
コード例 #11
0
# Parse input paramters from init.txt file
init_file_path = 'gastop-config/struct_making_test_init.txt'
config = utilities.init_file_parser(init_file_path)

ga_params = config['ga_params']
random_params = config['random_params']
crossover_params = config['crossover_params']
mutator_params = config['mutator_params']
selector_params = config['selector_params']
evaluator_params = config['evaluator_params']
fitness_params = config['fitness_params']

# properties_df = 0
evaluator = 0

pop_size = int(1e6)
num_gens = int(1e2)

# boundaries = Boundaries(#Input here);

# Create the Evaluator Object
#evaluator = Eval(blah)

# Create a Fitness Function Object
fitness_function = FitnessFunction('rastrigin', 0)
pop_size = int(1e4)
ga = GenAlg(ga_params, mutator_params, random_params, crossover_params,
            selector_params, evaluator, fitness_function)
#ga.initialize_population(pop_size)
cProfile.run('ga.initialize_population(pop_size)')
コード例 #12
0
from gastop import GenAlg, utilities

# needs to be full path
animation_path = '/Users/susanredmond/Desktop/APC524_FinalProject/animation'
# Parse input paramters from init.txt file
init_file_path = 'gastop-config/struct_making_test_init2.txt'

config = utilities.init_file_parser(init_file_path)

pop_size = 1000
num_gens = 50
progress_fitness = True
progress_truss = True

# Create the Genetic Algorithm Object
ga = GenAlg(config)
ga.initialize_population(pop_size)
best, progress_history = ga.run(num_generations=num_gens,
                                progress_fitness=progress_fitness,
                                progress_truss=progress_truss,
                                num_threads=8)

print(best)

best.plot(
    domain=config['random_params']['domain'],
    loads=config['evaluator_params']['boundary_conditions']['loads'],
    fixtures=config['evaluator_params']['boundary_conditions']['fixtures'],
    deflection=True,
    load_scale=.0002,
    def_scale=50)
コード例 #13
0
# Parse input paramters from init.txt file
init_file_path = 'gastop-config/struct_making_test_init2.txt'
config = utilities.init_file_parser(init_file_path)

pop_size = config['ga_params']['pop_size']
num_gens = config['ga_params']['num_generations']

conf = Config()
conf.trace_filter = GlobbingFilter(include=['__main__', 'gastop.*'])

graphviz = GraphvizOutput(output_file='filter_exclude4.png')

with PyCallGraph(output=graphviz, config=conf):

    # Create the Genetic Algorithm Object
    ga = GenAlg(config)
    ga.initialize_population(200)
    best, progress_history = ga.run(num_generations=10,
                                    progress_display=1,
                                    num_threads=1)

# con = best.edges.copy()
# matl = best.properties.copy()
# matl = matl[(con[:, 0]) >= 0]
# con = con[(con[:, 0]) >= 0]
# matl = matl[(con[:, 1]) >= 0]
# con = con[(con[:, 1]) >= 0]

# print(best.rand_nodes)
# print(con)
# print(matl)
コード例 #14
0
ファイル: test_genalg.py プロジェクト: vishalbelsare/GASTOp
    def testOddNumCrossover(self):
        """Tests genalg when crossover number is odd
        to make sure it still return the correct population size
        """

        config = utilities.init_file_parser(init_file_path)
        config['ga_params']['percent_crossover'] = 1
        config['ga_params']['percent_mutation'] = 0
        config['ga_params']['num_elite'] = 5
        ga = GenAlg(config)
        ga.initialize_population(100)
        ga.run(num_generations=2)
        self.assertAlmostEqual(len(ga.population), 100)

        # test zero crossover
        config['ga_params']['percent_crossover'] = 0
        config['ga_params']['percent_mutation'] = 1
        ga = GenAlg(config)
        ga.initialize_population(100)
        ga.run(num_generations=2)
        self.assertAlmostEqual(len(ga.population), 100)
コード例 #15
0
import timeit
import multiprocessing
import sys
sys.path.append('.')

from gastop import GenAlg, Truss, Evaluator, FitnessFunction, Crossover, Mutator, Selector, utilities

# Parse input paramters from init.txt file
init_file_path = 'gastop-config/struct_making_test_init.txt'
config = utilities.init_file_parser(init_file_path)

pop_size = int(1e2)
num_gens = int(1e1)

# Create GenAlg object and assign random fitness scores
ga = GenAlg(config)
ga.initialize_population(pop_size)
for truss in ga.population:
    truss.fitness_score = np.random.random()

setup ='''
import numpy as np
import multiprocessing
from gastop import GenAlg, Truss, Evaluator, FitnessFunction, Crossover, Mutator, Selector, utilities
from __main__ import method1, method2

init_file_path = 'gastop-config/struct_making_test_init.txt'
config = utilities.init_file_parser(init_file_path)

pop_size = int(1e2)
num_gens = int(1e1)