#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. Отлично, спасибо вам за это, я об этом не подумал!