diff --git a/flight_algorithms/algorithms/base_algorithm.py b/flight_algorithms/algorithms/base_algorithm.py index 4d63c64..b5ee53d 100644 --- a/flight_algorithms/algorithms/base_algorithm.py +++ b/flight_algorithms/algorithms/base_algorithm.py @@ -2,30 +2,24 @@ #from flight_algorithms.Flight import Flight import random import math - +import sys class FlightAlgorithm(metaclass=ABCMeta): - def __init__(self, domain, fitness_function, seed=random.randint(10, 100), - set_all_generators=False, init=[]): + def __init__(self, domain, fitness_function,seed=random.randint(10, 100),seed_init=True,init=[]): self.domain = domain self.fitness_function = fitness_function self.seed = seed + self.seed_init = seed_init self.init = init - self.init_seed(set_all_generators) - - self.population = [] - self.best_cost = 0.0 # returned - self.scores = 0.0 # returned - self.nfe = 0 # returned - + if self.seed_init: + # Set the seed for initial population only + self.r_init = random.Random(seed) + else: + # Same seeds for both init and other random generators + self.r_init = random.Random(seed) + random.seed(seed) - - - def init_seed(self, set_all_generators=False): - self.r_init = random.Random(self.seed) - - if set_all_generators: - random.seed(self.seed) + self.best_cost =0.0 # returned @abstractmethod def run(self, **kwargs) -> tuple: diff --git a/flight_algorithms/algorithms/rs.py b/flight_algorithms/algorithms/rs.py new file mode 100644 index 0000000..c5e6d9e --- /dev/null +++ b/flight_algorithms/algorithms/rs.py @@ -0,0 +1,62 @@ +import sys +import os +sys.path.append(os.getcwd()) +from abc import ABCMeta +from utils.utils import plot_scores, print_schedule, read_file +from flight_algorithms.algorithms.base_algorithm import FlightAlgorithm +import heapq +import math +import random +import sys +from fitness import * + + +class RandomSearch(FlightAlgorithm, metaclass=ABCMeta): + def __init__(self, domain, fitness_function, seed=random.randint(10, 100), + seed_init=True, init=[], epochs=100): + super().__init__(domain, fitness_function, seed, seed_init, init) + self.epochs = epochs + self.best_cost=sys.maxsize + self.best_solution=0.0 + + + def run(self, **kwargs) -> tuple: + scores = [] + nfe = 0 + if len(self.init) > 0: + solution = self.init + else: + solution = [self.r_init.randint(self.domain[i][0], self.domain[i][1]) + for i in range(len(self.domain))] + for i in range(self.epochs): + if i != 0: + solution = [random.randint(self.domain[i][0], self.domain[i][1]) + for i in range(len(self.domain))] + if not self.fitness_function.__name__ == 'fitness_function': + cost = self.fitness_function(solution) + else: + cost = self.fitness_function(solution, 'FCO') + nfe += 1 + if cost < self.best_cost: + self.best_cost = cost + self.best_solution = solution + scores.append(self.best_cost) + return self.best_solution, self.best_cost, scores, nfe, self.seed + + + +if __name__ == '__main__': + read_file('flights.txt') + rs=RandomSearch(domain=domain['domain'],fitness_function=fitness_function,seed=5,seed_init=False) + soln, cost, scores, nfe, seed=rs.run() + plot_scores(scores,rs.__class__.__name__,save_fig=False) + print_schedule(soln,'FCO') + """" + 1. Change all algorithms + 2. Docstrings + 3. Type hinting + 4. Unit tests + 5. Change all single_runs + 6. Change all multiple runs + + """ \ No newline at end of file