Вопрос или проблема
из ограничения импортировать *
из ограничения импортировать Проблема, AllDifferentConstraint
проблема = Проблема()
клиенты = ["Фреда", "Опал", "Пенни", "Сара", "Вики"]
локации = ["Браунфилд", "Дарем", "Айова Фолс", "Лос-Альтос", "Реддинг"]
бренды = ["Додж", "Фиат", "Хендай", "Джип", "Ниссан"]
длительности = [2, 3, 4, 5, 6]
для i в диапазоне(1, 6):
проблема.добавитьПеременную(f"Клиент_{i}", клиенты)
проблема.добавитьПеременную(f"Локация_{i}", локации)
проблема.добавитьПеременную(f"Бренд_{i}", бренды)
проблема.добавитьПеременную(f"Длительность_{i}", длительности)
для атрибута в ["Клиент", "Локация", "Бренд", "Длительность"]:
проблема.добавитьОграничение(AllDifferentConstraint(), [f"{атрибут}_{i}" для i в диапазоне(1, 6)])
проблема.добавитьОграничение(лаямба c1, c2, c3, c4: len({c1, c2, c3, c4}) == 4,
["Клиент_5", "Локация_4", "Локация_2", "Бренд_2"])
проблема.добавитьОграничение(лаямба бренд, локация: бренд != "Джип" или локация != "Айова Фолс",
["Бренд_3", "Локация_3"])
проблема.добавитьОграничение(лаямба c, d: c != "Пенни" или d != 6, ["Клиент_4", "Длительность_4"])
решения = проблема.getSolutions()
для решения в решениях:
печать(решение)
Это код. Когда я пытаюсь запустить код, он продолжает выполняться и не показывает никакого вывода или ошибки. Я не уверен, почему.
Я также пробовал несколько простых задач с ограничениями на python. Происходит то же самое. Было бы очень полезно, если бы кто-то помог мне с этой проблемой. Спасибо.
- У вас есть переменные для пяти клиентов, каждая из которых имеет пять возможных значений
для Локации, Бренда и Длительности. С этими переменными существует N^y
перестановок на слот, которые растут экспоненциально при добавлении ограничений. - AllDifferentConstraint() требует, чтобы каждая переменная в указанном списке имела уникальное значение. Это может стать вычислительно сложным, так как оно растет экспоненциально. Например, будет 5^4 перестановок на слот.
Попробуйте один раз ниже приведенный код и дайте мне знать, если он работает, в противном случае попробуем другой способ.
Я пробовал ниже приведенный код… заняло около 3 часов в зависимости от возможностей моей системы. и он сработал.
!pip install python-constraint
из ограничения импортировать Проблема, AllDifferentConstraint
проблема = Проблема()
клиенты = ["Фреда", "Опал", "Пенни", "Сара", "Вики"]
локации = ["Браунфилд", "Дарем", "Айова Фолс", "Лос-Альтос", "Реддинг"]
бренды = ["Додж", "Фиат", "Хендай", "Джип", "Ниссан"]
длительности = [2, 3, 4, 5, 6]
для i в диапазоне(1, 6):
проблема.добавитьПеременную(f"Клиент_{i}", клиенты)
проблема.добавитьПеременную(f"Локация_{i}", локации)
проблема.добавитьПеременную(f"Бренд_{i}", бренды)
проблема.добавитьПеременную(f"Длительность_{i}", длительности)
для атрибута в ["Клиент", "Локация", "Бренд", "Длительность"]:
проблема.добавитьОграничение(AllDifferentConstraint(), [f"{атрибут}_{i}" для i в диапазоне(1, 6)])
проблема.добавитьОграничение(лаямба c1, c2, c3, c4: len({c1, c2, c3, c4}) == 4,
["Клиент_5", "Локация_4", "Локация_2", "Бренд_2"])
проблема.добавитьОграничение(лаямба бренд, локация: бренд != "Джип" или локация != "Айова Фолс",
["Бренд_3", "Локация_3"])
проблема.добавитьОграничение(лаямба c, d: c != "Пенни" или d != 6, ["Клиент_4", "Длительность_4"])
решения = проблема.getSolutions()
если решения:
печать("Найдены решения:")
для решения в решениях[:5]: # Отображение только первых 5 решений
печать(решение)
еще:
печать("Решений не найдено.")
Чтобы проверить точность кода, я попробовал с меньшими permutations и это заняло около 30 секунд. Затем я запустил код выше. Это был тестовый код—
из ограничения импортировать Проблема, AllDifferentConstraint
# Базовая настройка с меньшими ограничениями, чтобы проверить, находит ли она решения быстро
проблема = Проблема()
клиенты = ["Фреда", "Опал", "Пенни", "Сара", "Вики"]
для i в диапазоне(1, 6):
проблема.добавитьПеременную(f"Клиент_{i}", клиенты)
проблема.добавитьОграничение(AllDifferentConstraint(), [f"Клиент_{i}" для i в диапазоне(1, 6)])
решения = проблема.getSolutions()
для решения в решениях:
печать(решение)
Ответ или решение
Когда вы сталкиваетесь с проблемой, когда код на Python, использующий библиотеку python-constraint
, продолжает выполняться без вывода результата или ошибок, это может быть связано с несколькими факторами, включая количество переменных, наложенные ограничения и эффективность используемого алгоритма. Давайте подробнее разберем вашу ситуацию.
Анализ проблемы
Ваш код создает задачу с множеством переменных и десятками (или даже сотнями) комбинаций возможных решений. В частности:
- Количество переменных: У вас имеется 5 клиентов, каждый из которых может принимать 5 различных значений для местоположения, бренда и продолжительности. Это создает большое количество возможных сочетаний.
- Наложенные ограничения: Использование
AllDifferentConstraint()
требует, чтобы все переменные в указанном списке имели уникальные значения. Это добавляет значительные вычислительные затраты, особенно когда количество переменных увеличивается. - Кросс-ограничения: Некоторые дополнительные ограничения, такие как
len({c1, c2, c3, c4}) == 4
, могут вызвать дальнейшее усложнение, что может привести к длительным вычислениям.
Оптимизация
Упрощение модели
Для начала стоит рассмотреть возможность упрощения задачи:
- Сокращение переменных: Проверьте, возможно ли уменьшить количество клиентов или других переменных (например, попробовать с 3 клиентами вместо 5).
- Упрощение ограничений: Сократите количество уникальных ограничений и проверьте, работает ли код с меньшим числом условий.
Пример оптимизированного кода
Попробуйте следующий упрощённый код:
from constraint import Problem, AllDifferentConstraint
# Упрощенный набор данных
customers = ["Freda", "Opal", "Penny"]
problem = Problem()
for i in range(1, 4):
problem.addVariable(f"Customer_{i}", customers)
# Упрощение ограничений
problem.addConstraint(AllDifferentConstraint(), [f"Customer_{i}" for i in range(1, 4)])
solutions = problem.getSolutions()
if solutions:
print("Найденные решения:")
for solution in solutions:
print(solution)
else:
print("Решения не найдены.")
Этот код должен выполняться гораздо быстрее и не вызывать проблем с зависанием.
Измерение производительности
- Мониторинг времени выполнения: Если вы хотите узнать, сколько времени занимает выполнение, используйте библиотеку
time
:
import time
start_time = time.time()
# Ваш код здесь
print("Время выполнения: %s секунд" % (time.time() - start_time))
Заключение
Проблемы, с которыми вы столкнулись, скорее всего, связаны с вычислительной сложностью задачи из-за большого объема данных и ограничений. Оптимизация решения путем уменьшения размера задачи и числа уникальных ограничений должна помочь. Если эффективность вызывает затруднения и при использовании оптимизированного подхода необходимо рассмотреть альтернативные методы решения задач ограничений, такие как использование специализированных библиотек или разработку своего собственного алгоритма.