def optimize_trajectory(states_groups):
	trajectory = None
	
	
	
	if states_groups:
		def generate_initial_state_node(state):
			state_node = \
				_StateNode(
					state                  = state,
					predecessor_state_node = None,
					segment                = None,
					estimation             = 0.0
				)
				
			return state_node
			
		open_states_nodes = \
			[generate_initial_state_node(initial_state) \
				for initial_state \
				in states_groups[0]]
				
				
		for states_group in states_groups[1:]:
			open_states_nodes = \
				optimize_transition(
					open_states_nodes,
					states_group
				)
				
				
				
		if open_states_nodes:
			best_goal_state_node_filter = \
				Filter(
					key = (lambda goal_state_node: goal_state_node.estimation)
				)
				
			best_goal_state_node_filter.check_elements(open_states_nodes)
			
			
			trajectory = []
			state_node = best_goal_state_node_filter.minimal_element
			
			while state_node.predecessor_state_node is not None:
				trajectory.insert(0, state_node.segment)
				state_node = state_node.predecessor_state_node
				
				
				
	return trajectory