Здесь я покажу, как можно решить «сложный» случай этой проблемы. Я думаю, что этот метод может быть обобщен. Я поместил еще один более простой пример в комментарии к исходному сообщению.
Рассмотрим две строки:
10000019 * X - 10000015 * Y + 909093 >= 0 (L1)
-10000022 * X + 10000018 * Y + 1428574 >= 0 (L2)
A = 10000019, B = -10000015, C = -909093
Точка пересечения H:
Hx = -5844176948071/3, Hy = -5844179285738/3
Для точки M (X, Y) квадрат расстояния HM ^ 2 равен:
HM^2 = (9*X^2+35065061688426*X
+68308835724213587680825685
+9*Y^2+35065075714428*Y)/9
g = gcd (A, B) = 1: уравнение L1 A*X+B*Y+909093
может принимать любое целочисленное значение.
Коэффициенты Безу, U = 2500004 и V = 2500005, подтвердите:
A * U + B * V = 1
Теперь мы переписываем задачу в «двойственном» базисе (K, T), определяемом:
X = T*U - K*B
Y = T*V + K*A
После замены получаем:
T+909093 >= 0
2*T+12*K+1428574 >= 0
minimize 112500405000369*T^2
+900003150002790*T*K
+1800006120005274*K^2
+175325659092760325844*T
+701302566240903900522*K
+Constant
После дальнейшего перевода (сначала на T, затем на K, чтобы минимизировать
постоянная во втором уравнении), T = T1-909093, K = K1 + 32468:
T1 >= 0
2*T1+4+12*K1 >= 0
minimize 112500405000369*T1^2
+300001050000930*T1
+900003150002790*T1*K1
+1200004080003516*K1
+1800006120005274*K1^2
+Constant
Алгоритм, который я предложил, заключается в цикле на T1. На самом деле нам не нужно
цикл здесь, так как лучший результат дается T1 = K1 = 0, что соответствует:
X = -1948055649352, Y = -1948056428573
Мой начальный пост ниже.
Вот еще одна идея алгоритма. Это может работать, но я не реализовал это ...
При соответствующем изменении знаков в соответствии с положением (x, y), проблема может быть записана:
A*X+B*Y>=C (line D)
a*X+b*Y>=c (line d)
minimize the distance between M(X,Y) and H, the intersection point
A*b != a*B (intersection is defined)
A,B,C,a,b,c,X,Y all integers
Множество всех значений, достигаемых (A X + B Y), является множеством всех кратных g = gcd (A, B), и существуют целые числа (u, v), такие что A u + B v = g (теорема Безу). Из точки с целочисленными координатами (X0, Y0) все точки с целочисленными координатами и одинаковым значением A X + B Y равны (X0-K B / g, Y0 + K А / г), для всех целых чисел К.
Чтобы решить эту проблему, мы можем выполнить цикл по линиям, параллельным D, с увеличением расстояния от H и содержащим точки с целочисленными координатами.
Вычислите g, u, v и H (координаты H, вероятно, не нужны, нам нужны только коэффициенты квадратичной формы, соответствующие расстоянию).
T0 = ceil (C / g)
Петля от T = T0
а. Найдите K наименьшее (или наибольшее, в зависимости от знака Bb A) целое число, проверяющее * (T uK B / g) + b * (T v + К А / г)> = с
б. Сохраняйте точку (T u-K B / г, T v + K A / г), если она ближе к H
с. Выйдите из цикла, когда (T-T0) соответствует расстоянию от D, большему, чем лучший результат, в противном случае продолжайте с T + = 1