Программирование ограничений - это то, что вам нужно. В CP на основе распространения вы чередуете (a) принятие решения в текущей точке выбора в дереве поиска и (б) распространение последствий этого решения, насколько это возможно. Понятно, что вы делаете это, поддерживая домен D
возможных значений для каждой проблемной переменной x
такой, что D(x)
- это набор значений для x
, которые еще не исключены вдоль текущего пути поиска. В вашей проблеме вы можете свести ее к большому набору логических переменных, x_ij
, где x_ij
истинно. Iff event i
предшествует событию j
. Изначально D(x) = {true, false}
для всех переменных. Решение просто уменьшает область неопределенной переменной (для булевой переменной это означает, что ее домен сводится к одному значению, истинному или ложному, что совпадает с назначением). Если в любой точке пути поиска D(x)
становится пустым для любого x
, вы достигли тупика и должны вернуться.
Если вы умны, вы попытаетесь учиться на каждом провале, а также отступить, если требуется, чтобы избежать поиска в поиске, чтобы избежать избыточного поиска (это называется backjumping - например, если вы идентифицируете это тупик, который вы достигли на уровне 7, был вызван выбором, который вы сделали на уровне 3, нет никакого смысла в отступлении до уровня 6, потому что не существует решения в этом поддереве, учитывая выбор, сделанный вами на уровне 3!).
Теперь, учитывая, что у вас есть определенная степень доверия к вашим данным, у вас действительно есть проблема оптимизации. То есть вы не просто ищете решение, которое удовлетворяет всем ограничениям, которые должно быть должно быть истинным, но которое также наилучшим образом удовлетворяет другим «мягким» ограничениям в зависимости от степени доверия, который у вас есть. Что вам нужно сделать здесь, это решить объективную функцию, присваивая оценку заданному набору удовлетворенных/нарушенных частичных ограничений. Затем вы хотите сократить ваш поиск, когда найдете, что текущий путь поиска не может улучшить наилучшее найденное ранее решение.
Если вы решите пойти на логический подход, вы можете с удовольствием изучить SAT-решатели, которые разрывают эти проблемы. Но первое место, которое я бы посмотрел, - это MiniZinc, язык CP, который отображает на множество различных современных решателей ограничений.
Удачи!
В принципе, я считаю, что вы говорите о программировании на основе ограничений, с вероятностями, в которые входите. Что-то вроде [этого] (http://www.cse.unsw.edu.au/~tw/wecai2002.pdf)? – Amadan
Thanks; это обеспечило мне много поводов для наблюдения. Я бы отметил это «ответил», если только я смог найти отметку галочки, чтобы нажать. –
Это не большой ответ, хотя даже если он привел вас в правильном направлении. Не стесняйтесь суммировать свои результаты в своем собственном ответе и проверяйте это; Я уверен, что это будет более подробно, чем я могу сделать в этот момент. – Amadan