示例#1
0
	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
			)
示例#2
0
	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
示例#3
0
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
			)