Не отображает вывод 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()
для решения в решениях:
    печать(решение)

Это код. Когда я пытаюсь запустить код, он продолжает выполняться и не показывает никакого вывода или ошибки. Я не уверен, почему.

Я также пробовал несколько простых задач с ограничениями на 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, продолжает выполняться без вывода результата или ошибок, это может быть связано с несколькими факторами, включая количество переменных, наложенные ограничения и эффективность используемого алгоритма. Давайте подробнее разберем вашу ситуацию.

Анализ проблемы

Ваш код создает задачу с множеством переменных и десятками (или даже сотнями) комбинаций возможных решений. В частности:

  1. Количество переменных: У вас имеется 5 клиентов, каждый из которых может принимать 5 различных значений для местоположения, бренда и продолжительности. Это создает большое количество возможных сочетаний.
  2. Наложенные ограничения: Использование AllDifferentConstraint() требует, чтобы все переменные в указанном списке имели уникальные значения. Это добавляет значительные вычислительные затраты, особенно когда количество переменных увеличивается.
  3. Кросс-ограничения: Некоторые дополнительные ограничения, такие как 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))

Заключение

Проблемы, с которыми вы столкнулись, скорее всего, связаны с вычислительной сложностью задачи из-за большого объема данных и ограничений. Оптимизация решения путем уменьшения размера задачи и числа уникальных ограничений должна помочь. Если эффективность вызывает затруднения и при использовании оптимизированного подхода необходимо рассмотреть альтернативные методы решения задач ограничений, такие как использование специализированных библиотек или разработку своего собственного алгоритма.

Оцените материал
Добавить комментарий

Капча загружается...