Прямо сейчас у меня есть один предикат выбора, который определяет мое пространство поиска.
#const nRounds = 3.
#const nPlayers = 17.
#const nSeats = nRounds * nPlayers.
#const nRooms = 3.
#const nDecks = 6.
nSeats { seat(1..nPlayers, 1..nRooms, 1..nDecks) } nSeats.
Я хотел бы ограничить это пространство поиска, так как начинаю сталкиваться с проблемами производительности. В моей настройке каждый игрок может появляться только в 4 предикатах места, поэтому я хотел бы что-то вроде:
#for i in 1..nPlayers
nRounds { seat(i, 1..nRooms, 1..nDecks) } nRounds.
#endfor
который в основном превратился бы во что-то вроде этого внутри:
nRounds { seat(1, 1..nRooms, 1..nDecks) } nRounds.
nRounds { seat(2, 1..nRooms, 1..nDecks) } nRounds.
nRounds { seat(3, 1..nRooms, 1..nDecks) } nRounds.
...
Я мог бы, конечно, написать это сам, т. е. использовать другой язык для создания этих строк, но я не понимаю, почему этого не существует в clingo.
Причина, по которой я ищу способ сделать это, в первую очередь заключается в том, что я ожидаю, что (nRooms*nDecks choose nRounds) * nPlayers
будет намного меньше, чем (nRooms*nDecks*nPlayers) choose nRounds*nPlayers
, что, в свою очередь, намного лучше, чем {seat(P, R, D)}
с его 2^(nRooms*nDecks*nPlayers)
, с которого я начал.
Даже с ограничениями в моем коде, которые ограничивают фактические возможные наборы, которые я могу получить, чтобы все три из этих представлений были эквивалентны, все же есть преимущества в производительности, которые можно получить от такого ручного сокращения пространства поиска, верно?