Ограничение python- переменная как случайная выборка из домена

Я пытался использовать модуль https://labix.org/python-constraint для решения проблемы, вывод которой должен быть списком, содержащим случайные выборки из большего списка, где каждый список должен содержать по крайней мере на один элемент больше по значению, чем любой элемент в предыдущем списке,

Итак, если наш входной список [63, 70, 72, 79, 85, 90, 95, 96, 107, 121] тогда удовлетворительный результат будет:

[[63, 79], [70, 72], [85, 90], [95, 107], [96, 121]]

Однако следующее не будет удовлетворять, так как все элементы в последнем списке ниже, чем все элементы в непосредственно предшествующем:

[[63, 79], [70, 72], [90, 95], [107, 121], [85, 96]]

Я думал, что смогу использовать python-ограничение для решения этой проблемы, но кажется, что модуль будет работать только в домене с плоским списком, где переменная соответствует уникальному элементу в списке:

from constraint import *

problem = Problem()
problem.addVariable("a", [1,2,3])
problem.addVariable("b", [4,5,6])

problem.addConstraint(lambda a, b: a*2 == b, ("a", "b"))
problem.getSolutions()
>>> [{'a': 3, 'b': 6}, {'a': 2, 'b': 4}]

Таким образом, в вышеприведенных "a" и "b" связаны со случайно выбранными единичными элементами из их соответствующих доменов. Что мне нужно сделать, это вытащить подсписки из большой коллекции, а затем установить ограничения для последовательных пар этих подсписков. Однако не похоже, что это возможно с помощью python-ограничений.

Одно из решений, которое я придумал, состоит в том, чтобы предварительно вычислить все возможные пары значений из списка источников, а затем передать его как домен:

from constraint import *
import itertools

source = [63, 70, 72, 79, 85, 90, 95, 96, 107, 121]
all_combs = list(itertools.combinations(source, 2))

problem = Problem()
problem.addVariables(["a", "b"], all_combs)
problem.addConstraint(lambda a, b: set(a).isdisjoint(b) and min(a)<max(b), ("a", "b"))
problem.getSolutions()

Хотя это кажется грубым, оно работает. Однако проблема в том, что мне могут потребоваться подсписки разной длины в конкретном шаблоне, например шаблоне размеров 2,2,3,3, чтобы решение всегда имело такую ​​форму:

[[63, 79], [70, 72], [85, 90, 121], [95, 96, 107]]

Есть ли какой-нибудь (элегантный / лучший) способ добиться этого?

0 ответов

Другие вопросы по тегам