Возможно, вам подойдет следующий подход: Изначально вычислите выпуклую оболочку H
.Затем выберите подмножество n
случайных точек из H
, что создает новый многоугольник, который может не охватывать все точки, поэтому назовем его квазивыпуклой оболочкой Q
.Посчитайте, сколько точек содержится в Q
(вкладыши).Повторите это в течение определенного количества раз и сохраните предложение Q
с наибольшим количеством вкладышей.
Это, похоже, немного связано с RANSAC, но для этой задачи у нас на самом деле нет понятия о том, чтовыбросы есть, поэтому мы не можем реально оценить соотношение выбросов.Следовательно, я не знаю, насколько хорошим будет приближение или сколько итераций вам нужно, чтобы получить разумный результат.Может быть, вы можете добавить некоторые эвристики вместо того, чтобы выбирать n
точек чисто случайным образом, или у вас может быть порог того, сколько точек должно содержаться хотя бы в Q
, и затем останавливаться, когда вы достигаете этого порога.
Редактировать
На самом деле, подумав об этом, вы можете использовать подход RANSAC:
max_inliers = 0
best_Q = None
while(true):
points = sample_n_points(X)
Q = construct_convex_hull(points)
n_inliers = count_inliers(Q, X)
if n_inliers > max_inliers:
max_inliers = n_inliers
best_Q = Q
if some_condition:
break
Преимущество этого состоит в том, что создание выпуклой оболочкибыстрее, чем в вашем подходе, поскольку он использует максимум n
баллов.Кроме того, проверка количества вкладышей должна быть быстрой, так как это может быть просто сравнение знаков с каждой ветвью выпуклой оболочки.