У меня есть набор (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)?