def __replenish_controls_complex_population(self): buffer_controls_populations = dict() controls_populations = dict() needed_controls_population_size = \ self.__controls_evolution_parameters.population_size arguments_space = \ self.__complex_controls_arguments_space state_space_coordinates = \ self.__complex_controls_state_space \ .state_space_coordinates for state_space_coordinate in state_space_coordinates: buffer_controls_population = \ self.__buffer_controls_complex_population \ .get_controls_population( state_space_coordinate ) controls_population = \ self.__controls_complex_population \ .get_controls_population( state_space_coordinate ) buffer_controls = buffer_controls_population.controls controls = controls_population.controls while len(controls) != needed_controls_population_size: if len(buffer_controls) != 0: controls.append( buffer_controls.pop() ) else: break buffer_controls_populations[state_space_coordinate] = \ ControlsPopulation(arguments_space, buffer_controls) controls_populations[state_space_coordinate] = \ ControlsPopulation(arguments_space, controls) self.__buffer_controls_complex_population = \ ControlsComplexPopulation( buffer_controls_populations ) self.__controls_complex_population = \ ControlsComplexPopulation( controls_populations )
def __init__(self, navigations, controls_evolution_parameters, controls_constructing_parameters, control_tests_number): super(ControlsOptimizer, self).__init__() if control_tests_number <= 0: raise Exception() #!!!!! Создавать внятные исключения if (navigations) == 0: raise Exception() #!!!!! Создавать внятные исключения first_navigation = navigations[0] self.__complex_controls_state_space = \ first_navigation.complex_controls_state_space self.__complex_controls_arguments_space = \ first_navigation.complex_controls_arguments_space self.__targets_state_space = \ first_navigation.targets_state_space self.__confirming_distance = \ first_navigation.confirming_distance are_navigations_compatible = True for navigation in navigations: are_navigations_compatible &= \ self.__complex_controls_state_space \ == navigation.complex_controls_state_space are_navigations_compatible &= \ self.__complex_controls_arguments_space \ == navigation.complex_controls_arguments_space are_navigations_compatible &= \ self.__targets_state_space \ == navigation.targets_state_space are_navigations_compatible &= \ self.__confirming_distance \ == navigation.confirming_distance if not are_navigations_compatible: raise Exception() #!!!!! Создавать внятные исключения self.__navigations = list(navigations) self.__controls_evolution_parameters = controls_evolution_parameters self.__controls_constructing_parameters = controls_constructing_parameters #!!!!! self.__control_tests_number = control_tests_number controls_populations = dict() state_space_coordinates = \ self.__complex_controls_state_space \ .state_space_coordinates for state_space_coordinate in state_space_coordinates: controls_population = \ ControlsPopulation( self.__complex_controls_arguments_space, [] ) controls_populations[state_space_coordinate] = controls_population self.__buffer_controls_complex_population = \ ControlsComplexPopulation( controls_populations ) self.__controls_complex_population = \ ControlsComplexPopulation( controls_populations ) self.__controls_complex_population_rating = None self.__complex_control_tests = set() self.__vacant_navigations = set(self.__navigations) self.__vacant_controls = None self.__has_vacant_controls = None
class ControlsOptimizer(metaclass = ABCMeta): @staticmethod def check_controls_optimizers_compatibility(first_controls_optimizer, second_controls_optimizer): are_controls_optimizers_compatible = True # Размеры популяций должны быть равными first_population_size, second_population_size = \ first_controls_optimizer.__controls_evolution_parameters.population_size, \ second_controls_optimizer.__controls_evolution_parameters.population_size are_controls_optimizers_compatible &= \ first_population_size == second_population_size # Состав функций управления first_state_space, second_state_space = \ first_controls_optimizer.__complex_controls_state_space, \ second_controls_optimizer.__complex_controls_state_space are_controls_optimizers_compatible &= \ first_state_space == second_state_space # Состав аргументов функций управления first_arguments_space, second_arguments_space = \ first_controls_optimizer.__complex_controls_arguments_space, \ second_controls_optimizer.__complex_controls_arguments_space are_controls_optimizers_compatible &= \ first_arguments_space <= second_arguments_space return are_controls_optimizers_compatible def __init__(self, navigations, controls_evolution_parameters, controls_constructing_parameters, control_tests_number): super(ControlsOptimizer, self).__init__() if control_tests_number <= 0: raise Exception() #!!!!! Создавать внятные исключения if (navigations) == 0: raise Exception() #!!!!! Создавать внятные исключения first_navigation = navigations[0] self.__complex_controls_state_space = \ first_navigation.complex_controls_state_space self.__complex_controls_arguments_space = \ first_navigation.complex_controls_arguments_space self.__targets_state_space = \ first_navigation.targets_state_space self.__confirming_distance = \ first_navigation.confirming_distance are_navigations_compatible = True for navigation in navigations: are_navigations_compatible &= \ self.__complex_controls_state_space \ == navigation.complex_controls_state_space are_navigations_compatible &= \ self.__complex_controls_arguments_space \ == navigation.complex_controls_arguments_space are_navigations_compatible &= \ self.__targets_state_space \ == navigation.targets_state_space are_navigations_compatible &= \ self.__confirming_distance \ == navigation.confirming_distance if not are_navigations_compatible: raise Exception() #!!!!! Создавать внятные исключения self.__navigations = list(navigations) self.__controls_evolution_parameters = controls_evolution_parameters self.__controls_constructing_parameters = controls_constructing_parameters #!!!!! self.__control_tests_number = control_tests_number controls_populations = dict() state_space_coordinates = \ self.__complex_controls_state_space \ .state_space_coordinates for state_space_coordinate in state_space_coordinates: controls_population = \ ControlsPopulation( self.__complex_controls_arguments_space, [] ) controls_populations[state_space_coordinate] = controls_population self.__buffer_controls_complex_population = \ ControlsComplexPopulation( controls_populations ) self.__controls_complex_population = \ ControlsComplexPopulation( controls_populations ) self.__controls_complex_population_rating = None self.__complex_control_tests = set() self.__vacant_navigations = set(self.__navigations) self.__vacant_controls = None self.__has_vacant_controls = None @abstractmethod def _create_complex_control_test(self, navigation, test_complex_control): pass @property def navigations(self): return self.__navigations @property def controls_evolution_parameters(self): return self.__controls_evolution_parameters @property def controls_constructing_parameters(self): return self.__controls_constructing_parameters @property def control_tests_number(self): return self.__control_tests_number @abstractproperty def improvement_direction(self): pass @property def buffer_controls_complex_population(self): return self.__buffer_controls_complex_population @buffer_controls_complex_population.setter def buffer_controls_complex_population(self, controls_complex_population): is_controls_complex_population_compatible = True is_controls_complex_population_compatible &= \ controls_complex_population.state_space \ == self.__complex_controls_state_space is_controls_complex_population_compatible &= \ controls_complex_population.controls_arguments_space \ == self.__complex_controls_arguments_space if is_controls_complex_population_compatible: self.__buffer_controls_complex_population = \ controls_complex_population else: raise Exception() #!!!!! Создавать внятные исключения @property def controls_complex_population(self): return self.__controls_complex_population @property def is_iteration_active(self): return self.__controls_complex_population_rating is not None def start_iteration(self): if self.is_iteration_active: raise Exception() #!!!!! Создавать внятные исключения if self.__check_controls_complex_population_completeness(): is_controls_complex_population_completeness = True else: self.__replenish_controls_complex_population() is_controls_complex_population_completeness = \ self.__check_controls_complex_population_completeness() if is_controls_complex_population_completeness: state_space_coordinates = \ self.__complex_controls_state_space \ .state_space_coordinates self.__controls_complex_population_rating = \ ControlsComplexPopulationRating( self.__controls_complex_population ) self.__vacant_controls = dict() self.__has_vacant_controls = True for state_space_coordinate in state_space_coordinates: controls_population = \ self.__controls_complex_population \ .get_controls_population( state_space_coordinate ) self.__vacant_controls[state_space_coordinate] = \ controls_population.controls \ * self.__control_tests_number else: raise Exception() #!!!!! Создавать внятные исключения def iterate(self, delta_time): if not self.is_iteration_active: raise Exception() #!!!!! Создавать внятные исключения for navigation in set(self.__vacant_navigations): if self.__has_vacant_controls: test_controls = dict() vacant_controls = self.__vacant_controls state_space_coordinates = \ self.__complex_controls_state_space \ .state_space_coordinates for state_space_coordinate in state_space_coordinates: controls = vacant_controls[state_space_coordinate] control_number = randint(0, len(controls) - 1) test_controls[state_space_coordinate] = \ controls.pop( control_number ) if len(controls) == 0: self.__has_vacant_controls = False test_complex_control = ComplexControl(test_controls) complex_control_test = \ self._create_complex_control_test( navigation, test_complex_control ) self.__complex_control_tests.add(complex_control_test) self.__vacant_navigations.remove(navigation) else: break for complex_control_test in set(self.__complex_control_tests): if complex_control_test.is_initialized: complex_control_test.iterate(delta_time) else: complex_control_test.initialize() if complex_control_test.is_finished: self.__controls_complex_population_rating \ .rate_complex_control( complex_control_test.complex_control, complex_control_test.result ) self.__vacant_navigations.add( complex_control_test.navigation ) self.__complex_control_tests.remove( complex_control_test ) #!!!!! <Временно> # global test_number # test_number += 1 # if complex_control_test.result is not None: # print("\n\n\n-------------------------------------------") # print("Номер испытания: %s\n" % str(test_number)) # print("Левый двигатель:") # print(complex_control_test.complex_control[ShipLeftEngineForce()]) # print("\nПравый двигатель:") # print(complex_control_test.complex_control[ShipRightEngineForce()]) # print("\nДвигатель вертикальной тяги:") # print(complex_control_test.complex_control[ShipTopEngineForce()]) # print( # "\nРезультат испытания: %s" \ # % str(complex_control_test.result) # ) #!!!!! </Временно> if not bool(self.__complex_control_tests): if not self.__has_vacant_controls: self.__controls_complex_population = \ evolve_complex_controls_population( self.__controls_complex_population_rating, self.improvement_direction, self.__controls_evolution_parameters, self.__controls_constructing_parameters ) self.__controls_complex_population_rating = None self.__vacant_controls = None def __check_controls_complex_population_completeness(self): is_controls_complex_population_full = True needed_controls_population_size = \ self.__controls_evolution_parameters.population_size state_space_coordinates = \ self.__complex_controls_state_space \ .state_space_coordinates for state_space_coordinate in state_space_coordinates: controls_population = \ self.__controls_complex_population.get_controls_population( state_space_coordinate ) if controls_population.count != needed_controls_population_size: is_controls_complex_population_full = False break return is_controls_complex_population_full def __replenish_controls_complex_population(self): buffer_controls_populations = dict() controls_populations = dict() needed_controls_population_size = \ self.__controls_evolution_parameters.population_size arguments_space = \ self.__complex_controls_arguments_space state_space_coordinates = \ self.__complex_controls_state_space \ .state_space_coordinates for state_space_coordinate in state_space_coordinates: buffer_controls_population = \ self.__buffer_controls_complex_population \ .get_controls_population( state_space_coordinate ) controls_population = \ self.__controls_complex_population \ .get_controls_population( state_space_coordinate ) buffer_controls = buffer_controls_population.controls controls = controls_population.controls while len(controls) != needed_controls_population_size: if len(buffer_controls) != 0: controls.append( buffer_controls.pop() ) else: break buffer_controls_populations[state_space_coordinate] = \ ControlsPopulation(arguments_space, buffer_controls) controls_populations[state_space_coordinate] = \ ControlsPopulation(arguments_space, controls) self.__buffer_controls_complex_population = \ ControlsComplexPopulation( buffer_controls_populations ) self.__controls_complex_population = \ ControlsComplexPopulation( controls_populations )