CaptainFest / Separating_hyperplane

Separating 2 sets of points

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Separating_hyperplane

Условие задачи

Имеются два множества точек в декартовой прямоугольной системе координат. Точка с номером i (в условной нумерации) может принадлежать 1-му или 2-му множеству. Какому множеству принадлежит точка заранее известно.

Необходимо попытаться построить такую прямую линию, которая разделяет группу точек множества 1 и множества 2, то есть такую прямую линию, что все точки из множества 1 лежат строго по одну сторону относительно этой линии, а все точки множества 2 — строго по другую. И ответить на вопрос, возможно ли построение такой прямой, либо же нет.

Не допускается построение такой разделяющей линии, на которой лежит какая-либо точка, то есть прямая линия должна разделять группы точек 1-го и 2-го множеств строго.

Формат ввода

В первой строке входных данных записано одно целое число n (1≤n≤300) — количество всех точек.

В последующих n строках записаны координаты звезд.

В i-й из этих строк записано три целых числа — equation, разделенных одним пробелом Здесь equation, если точка принадлежит множеству 1, и equation в противном случае.

Гарантируется, что входные данные не содержат двух звезд с совпадающими координатами.

Формат вывода

В единственной строке выходных данных выведите Yes, если существует разделяющая линия, или No, если разделяющей линии не существует.

Решение

Решение строится из двух предположений. Два множества можно разделить гиперплоскостью, если их минимальная выпуклая оболочка не пересекается. А также если одна выпуклая оболочка не находится внутри другой.

Случаи, когда эти свойства не выполняются показаны на картинках.
Итак, решение начинается с построения выпуклых оболочек с помощью метода Джарвиса. Это позволит как сократить количество рассматриваемых точек, так и проверить эти 2 свойства. Далее проверяем пересечение всех полученных отрезков одной выпуклой оболочки с другой. Данную проверку выполняет функция intersect()
Отрезки equation и equation пересекаются тогда и только тогда, когда одновременно выполнены следующие 3 условия:
а) пересекаются ограничивающие их прямоугольники
b) equation
c) equation
Второй случай требует рассмотрения нахождения точек одного множества в выпуклой оболочке другой. Данное свойство проверяется слудующим образом. Для того, чтобы точка находиась внутри выпуклой оболочки, необходимо, чтобы equation было или всегда неотрицательно, или всегда неположительно. Эта проверка не должна выполняться, если минимальная выпуклая оболочка представляет из себя линию.

About

Separating 2 sets of points


Languages

Language:Jupyter Notebook 100.0%