Оптимизировать набор координат на основе функции стоимости - PullRequest
1 голос
/ 06 февраля 2020

У меня есть набор (x_i, y_i) координат, определяющих путь между начальной точкой и конечной позицией, который я не хочу перемещать. Прямо сейчас я оптимизирую путь на основе расстояния между точками (чтобы уменьшить длину пути) и кривизны точек, которые входят в функцию стоимости и якобиана. Проблема в том, что для достижения sh мне нужно создать вектор состояния со всеми сложенными и найти минимум. Пространство состояний имеет длину 2 * N, где N - количество сэмплов, которое у меня есть, и оно работает очень медленно даже для небольшого количества точек. Схема следующая (только с учетом расстояния между точками):

def jacobian_function(self, state_vector):
        """
        The jacobian of the cost function to be used by the optimizer
        :param state_vector : The extended state vector
        """
        gradient_array = np.zeros(len(state_vector))
        for i in range(1, int(len(state_vector) / self.num_states) - 1):  # -1 to not modify last point
            state_before = state_vector[2 * (i - 1):2 * i]
            state_curr = state_vector[2 * i:2 * (i + 1)]
            state_next = state_vector[2 * (i + 1):2 * (i + 2)]

            factor = 0.1 * 2 * (
                    state_before - 2 * state_curr + state_next)
            gradient_array[2 * i:2 * (i + 1)] += -2 * factor
            gradient_array[2 * (i - 1):2 * i] += factor
            gradient_array[2 * (i + 1):2 * (i + 2)] += factor

        return gradient_array

def cost_function(self, state_vector):
        """
        The cost function to be used by the optimizer
        :param state_vector : The extended state vector
        """
        cost = 0
        for i in range(1, int(len(state_vector) / 2) - 1):  # -1 to not modify last point
            smooth_vector = state_vector[2 * (i + 1):2 * (i + 2)] + state_vector[
                                                                    2 * (i - 1):2 * i] - 2 * state_vector[
                                                                                             2 * i:2 * (i + 1)]
            cost += 0.1 * np.dot(smooth_vector, smooth_vector)
        return cost

states = np.array([[1,2,3,4,5],[1,2,3,4,5]])
states_extended = np.reshape(states, states.shape[0] * states.shape[1], order='F')

result = optimize.minimize(fun=self.cost_function, states_extended, method="BFGS",jac=self.jacobian_function, options={'disp': True})

Есть ли у вас идеи ускорить процесс при рассмотрении всех точек данных (обычно N составляет около 800)?

...