Как добавить это ограничение к задаче с помощью python-constraint

#python #arrays #numpy #constraint-programming

#python #массивы #numpy #ограничение-программирование

Вопрос:

Я пытаюсь использовать python-constraint для решения комбинаторной задачи, но, похоже, я не могу добавить ограничение, которое мне нужно для решения проблемы. Моя проблема в том, что у меня есть 9 квадратных плиток, которые необходимо разместить, и каждую плитку можно повернуть в одну из 4 позиций, я закодировал плитки как векторы и нуждаюсь в определенных парах элементов для добавления к нулю.

Использование примера с двумя плитками:

piece_1 = np.array([-1,-3, 4, 2])

piece_2 = np.array([-2, -1, 3, 2])

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

piece_1_set = [np.roll(piece_1, i) for i in range(4)]

piece_2_set = [np.roll(piece_2, i) for i in range(4)]

Я добавил их к проблеме с:

problem.addVariable("1", piece_1_set)

problem.addVariable("2", piece_2_set)

Что я хотел бы сделать, так это найти вектор из каждого набора таким образом, чтобы 2-й элемент из первого вектора и 4-й элемент из второго вектора равнялись 0.

Я перепробовал все виды версий:

problem.addConstraint(lambda i,j: i[1] j[3] == 0, ("1", "2"))

problem.addConstraint(lambda i,j: np.any(i[1]) np.any(j[3]) == 0, ("1", "2"))

Но я всегда возвращаю следующее:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Кто-нибудь знает, как сформулировать это ограничение так, чтобы я мог добавить их, чтобы получить решения проблемы?

Ответ №1:

Проблема, по-видимому, заключается только в том, что вы пытаетесь использовать массивы numpy с библиотекой python-constraint, а не встроенные списки python. Вам нужно преобразовать их обратно, как в приведенном ниже решении.

 import numpy as np
from constraint import *

problem = Problem()

piece_1 = np.array([-1,-3, 4, 2])
piece_2 = np.array([-2, -1, 3, 2])
piece_1_set = [list(np.roll(piece_1, i)) for i in range(4)]
piece_2_set = [list(np.roll(piece_2, i)) for i in range(4)]

problem.addVariable("1", piece_1_set)
problem.addVariable("2", piece_2_set)

problem.addConstraint(lambda i, j: i[0] == j[0], ("1", "2"))
problem.getSolutions()

  

Комментарии:

1. Отлично, спасибо вам за это, я об этом не подумал!