У меня есть система, в которой мне нужно рассчитать возможный диапазон значений для каждой переменной (мне не нужно находить решение для системы).Вот иллюстрация примера системы:
Каждая синяя линия - это узел (названный надписью над ним), а серые линии - этокрая между узлами.Имеется начальное ограничение: например, ребро BC может быть любым действительным числом от 0 до 1 включительно, а ребро BE может быть любым числом, большим или равным 9. Узлы не могут пересекать другие узлы.Полезно представить их в виде металлических стержней, которые могут выдвигаться и складываться, толкая синие пластины.
Моя цель - рассчитать для каждого края минимальную и максимальную длину, которой они могут быть.Начальные ограничения устанавливают систему, но конечный результат может быть более ограниченным, чем они.Например, у ребра DF начальная min / max равна (2, ∞), но вы можете видеть, что на самом деле она не может быть короче 3, так как при сжатии она тянет D в E, а E к F, а EF имеетминимум 3. Конечный результат будет следующим:
Предостережение: мне нужен алгоритм, который может масштабироваться до сотен тысячузлов, которые были бы более плотно связаны, чем этот пример.Он не может экспоненциально увеличиваться во время выполнения, поскольку мне также приходится запускать этот алгоритм сотни тысяч раз.
Я попробовал метод, который давал некоторые более ограниченные значения, но не самые ограниченные значения.Чтобы визуализировать метод, я, по существу, вытянул все пластины влево как можно дальше, а затем записал максимальную позицию каждой пластины.Затем я сделал то же самое, потянув их вправо.Затем для каждого ребра я просто нахожу разницу между значениями каждой пластины.Этот метод очень эффективно находит максимальные значения, но проблема в том, что у вас есть ситуация, подобная приведенной в этом примере, когда CD как бы «заблокирован» для BE с помощью BC и DE.Это не может быть 6, так как система только позволяет ему быть на 2 короче, чем 9. Мне нужен способ, который находит истинное минимальное значение 7. Мой метод не фиксирует это «блокирующее» отношение: когда вы тянете C вседо левой стороны, BC равно 0, а когда вы вытягиваете D полностью вправо, DE равно 0, но они не могут быть оба 0, если CD равен 6.
В этом примереЛегко видеть, что CD ограничен BE, но на практике система будет гораздо плотнее и больше, чем в примере, и обнаружение таких ситуаций кажется нетривиальным.Если метод предполагает поиск вокруг него локально, я боюсь, что он будет плохо масштабироваться, но это может быть единственным способом.
Если это смоделировано как задача линейного программирования (AB + BC = AC, AB>1 и т. Д.), Возможно, есть некоторые атрибуты этой системы, которыми можно воспользоваться: тот факт, что все коэффициенты ограничений равны 1, и что в ограничениях есть только сложение и вычитание.
У кого-нибудь есть какие-либо предложения о том, как подойти к этой проблеме?Или есть какие-то идеи о том, на какую сложность во время выполнения я должен реально надеяться?Спасибо!