Если я правильно понимаю вашу проблему, я думаю, что это возможно решить в математическом смысле. Позволь мне объяснить. Поскольку целевая функция является линейной в лямбде (как указывает Superkogito), максимум (или минимум) всегда достигается в одной из угловых точек. Используя это, вы можете вычислить лямбду.
Позвольте мне начать с нескольких простых примеров. Для любой точки в пределах черного многоугольника ясно, что лямбда равен 1: вы можете просто поставить B = B_BP. Теперь давайте возьмем B = (-1, 3). Если вы возьмете любую черную точку, отличную от B_BP = (-1, 0), и у вас лямбда> 0, то с любой зеленой точкой в квадрате ваша x-координата будет выше -1. Поэтому лучшее, что вы можете сделать, это поставить B_BP = (-1, 0). Тогда зеленая точка должна быть B_GP = (-1, 3), поэтому lambda = 0.
Следуя той же логике c, вы можете видеть, что на ребре, определяемом конечными точками (-1, 0 ) и (-1, 3) вы всегда будете использовать B_BP = (-1, 0) и B_GP = (-1, 3). Поднимаясь по этому краю, лямбда будет уменьшаться с 1 до 0. В (-1, 1) лямбда = 2/3, в (-1, 2) лямбда = 1/3. То же самое для верхнего края между (-1, 3) и (2, 3): в (0, 3) лямбда = 1/3 и так далее. Для зеленого треугольника с углом (4, 3) вы должны использовать (4, 3) в качестве конечной точки. Тогда в (3, 3), например, лямбда = 1 / 2.
Интересная проблема, очевидно, заключается во внутренних частях треугольников. Здесь также B_GP является одним из углов, а B_BP находится на черной линии, которая является стороной треугольника. Вы можете показать это, предполагая, что есть другое решение, где это не так, а затем доказав, что можно увеличить лямбду, сместив B_GP или B_BP немного влево или вправо. Полное математическое доказательство было бы слишком длинным, я думаю. Теперь давайте возьмем треугольник слева, с зеленым углом (-1, 3) и черной стороной между (-1, 0) и (2, 3). Тогда для максимальной лямбды B_GP = (-1, 3) и B_BP на черной стороне. Поскольку B = лямбда * B_BP + (1 - лямбда) * B_GP, это дает вам два уравнения. А поскольку B_BP находится на линии y = x + 1, это дает вам третье уравнение. Из них вы можете решить x- и y-координаты B_BP и лямбды (с учетом точки B).
Я сделал это и пришел к лямбде = (Bx - By + 4) / 3. Координаты тогда B_BP - это B_BPx = (Bx + 1 + лямбда) / лямбда и B_BPy = (By - 3 + 3 * лямбда) / лямбда (просто заполните лямбду). Например, для точки (0, 2) у вас будет лямбда = 2/3. Вы можете сделать то же самое для двух других треугольников, я тоже это сделал.
Подведу итог:
Для левого треугольника: lambda = (Bx - By + 4) / 3
Для верхнего правого треугольника: лямбда = (-By - Bx + 7) / 2
Для нижнего правого треугольника: лямбда = By - Bx + 4
Программирование это теперь тривиально. Если вы хотите, я могу дать вам соответствующие координаты B_BP для двух других треугольников, пожалуйста, дайте мне знать. Кстати, вы можете прийти к ним, проведя прямую линию через угол треугольника и B.
Конечно, это работает только тогда, когда целевая функция линейна. В других случаях вам придется использовать подход, предложенный Superkogito. Я надеюсь, что я правильно понял ваш вопрос, пожалуйста, простите меня, если нет! По крайней мере, я нашел это хорошим математическим испытанием.