Как обеспечить соблюдение '!=' в Gekko (Написание решателя судоку) ⇐ Python
Как обеспечить соблюдение '!=' в Gekko (Написание решателя судоку)
Я пишу решатель судоку в Gekko (в основном для развлечения, я знаю, что для этого есть инструменты получше). Я хотел бы выразить ограничения, от которых переменные в каждой строке, столбце и квадрате больше всего отличаются. друг друга. Вот код:
импортировать инструменты itertools из импорта GEKKO GEKKO КВАДРАТЫ = [ ( (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), ( 2, 2) ), ( (0, 3), (0, 4), (0, 5), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), ( 2, 5) ), ( (0, 6), (0, 7), (0, 8), (1, 6), (1, 7), (1, 8), (2, 6), (2, 7), ( 2, 8) ), ( (3, 0), (3, 1), (3, 2), (4, 0), (4, 1), (4, 2), (5, 0), (5, 1), ( 5, 2) ), ( (3, 3), (3, 4), (3, 5), (4, 3), (4, 4), (4, 5), (5, 3), (5, 4), ( 5, 5) ), ( (3, 6), (3, 7), (3, 8), (4, 6), (4, 7), (4, 8), (5, 6), (5, 7), ( 5, 8) ), ( (6, 0), (6, 1), (6, 2), (7, 0), (7, 1), (7, 2), (8, 0), (8, 1), ( 8, 2) ), ( (6, 3), (6, 4), (6, 5), (7, 3), (7, 4), (7, 5), (8, 3), (8, 4), ( 8, 5) ), ( (6, 6), (6, 7), (6, 8), (7, 6), (7, 7), (7, 8), (8, 6), (8, 7), ( 8, 8) ) ] BOARD_DIMS = (9, 9) PRE_FILLED_SQUARES = [ (0, 1, 2), (0, 3, 5), (0, 5, 1), (0, 7, 9), (1, 0, 8), (1, 3, 2), (1, 3, 2), (1, 5, 3), (1, 8, 6), (2, 1, 3), (2, 4, 6), (2, 7, 7), (3, 2, 1), (3, 6, 6), (4, 0, 5), (4, 1, 4), (4, 7, 1), (4, 8, 9), (5, 2, 2), (5, 6, 7), (6, 1, 9), (6, 4, 3), (6, 7, 8), (7, 0, 2), (7, 3, 8), (7, 5, 4), (7, 8, 7), (8, 1, 1), (8, 3, 9), (8, 5, 7), (8, 7, 6) ] м = ГЕККО() m.options.SOLVER = 1 доска = m.Array(m.Var, BOARD_DIMS, lb=1, ub=9, целое число=True, значение=1) для i, j, val в PRE_FILLED_SQUARES: доска[i,j].value = значение m.Equation(board[i,j]==val) для строки в диапазоне (BOARD_DIMS[0]): для i, j в itertools.combinations(range(BOARD_DIMS[1]), r=2): diff = m.if3(доска[строка, i] - доска[строка, j], -1, 1) diff_prime = m.if3(доска[строка, j] - доска[строка, i], -1, 1) m.Equation(diff + diff_prime == 0) для столбца в диапазоне (BOARD_DIMS[1]): для i, j в itertools.combinations(range(BOARD_DIMS[0]), r=2): diff = m.if3(board[i, col] - board[j, col], -1, 1) diff_prime = m.if3(доска[j, столбец] - доска[i, столбец], -1, 1) m.Equation(diff + diff_prime == 0) для квадрата в SQUARES: для (y, x), (y_prime, x_prime) в itertools.combinations(square, r=2): diff = m.if3(board[y, x] - board[y_prime, x_prime], -1, 1) diff_prime = m.if3(board[y_prime, x_prime] - доска[y, x], -1, 1) m.Equation(diff + diff_prime == 0) m.solve(disp=True) печать (доска) В настоящее время решатели учитывают предварительно заполненные мной квадраты, но заполняют все остальные квадраты 1.0. Текущее выражение неравенства с двойным вычитанием связано с тем, что попытка чего-то вроде m.Equation(board[row,j] != board[row,i]) привела к ошибке эффект того, что объекты типа "int" не имеют длины.
Я пишу решатель судоку в Gekko (в основном для развлечения, я знаю, что для этого есть инструменты получше). Я хотел бы выразить ограничения, от которых переменные в каждой строке, столбце и квадрате больше всего отличаются. друг друга. Вот код:
импортировать инструменты itertools из импорта GEKKO GEKKO КВАДРАТЫ = [ ( (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), ( 2, 2) ), ( (0, 3), (0, 4), (0, 5), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), ( 2, 5) ), ( (0, 6), (0, 7), (0, 8), (1, 6), (1, 7), (1, 8), (2, 6), (2, 7), ( 2, 8) ), ( (3, 0), (3, 1), (3, 2), (4, 0), (4, 1), (4, 2), (5, 0), (5, 1), ( 5, 2) ), ( (3, 3), (3, 4), (3, 5), (4, 3), (4, 4), (4, 5), (5, 3), (5, 4), ( 5, 5) ), ( (3, 6), (3, 7), (3, 8), (4, 6), (4, 7), (4, 8), (5, 6), (5, 7), ( 5, 8) ), ( (6, 0), (6, 1), (6, 2), (7, 0), (7, 1), (7, 2), (8, 0), (8, 1), ( 8, 2) ), ( (6, 3), (6, 4), (6, 5), (7, 3), (7, 4), (7, 5), (8, 3), (8, 4), ( 8, 5) ), ( (6, 6), (6, 7), (6, 8), (7, 6), (7, 7), (7, 8), (8, 6), (8, 7), ( 8, 8) ) ] BOARD_DIMS = (9, 9) PRE_FILLED_SQUARES = [ (0, 1, 2), (0, 3, 5), (0, 5, 1), (0, 7, 9), (1, 0, 8), (1, 3, 2), (1, 3, 2), (1, 5, 3), (1, 8, 6), (2, 1, 3), (2, 4, 6), (2, 7, 7), (3, 2, 1), (3, 6, 6), (4, 0, 5), (4, 1, 4), (4, 7, 1), (4, 8, 9), (5, 2, 2), (5, 6, 7), (6, 1, 9), (6, 4, 3), (6, 7, 8), (7, 0, 2), (7, 3, 8), (7, 5, 4), (7, 8, 7), (8, 1, 1), (8, 3, 9), (8, 5, 7), (8, 7, 6) ] м = ГЕККО() m.options.SOLVER = 1 доска = m.Array(m.Var, BOARD_DIMS, lb=1, ub=9, целое число=True, значение=1) для i, j, val в PRE_FILLED_SQUARES: доска[i,j].value = значение m.Equation(board[i,j]==val) для строки в диапазоне (BOARD_DIMS[0]): для i, j в itertools.combinations(range(BOARD_DIMS[1]), r=2): diff = m.if3(доска[строка, i] - доска[строка, j], -1, 1) diff_prime = m.if3(доска[строка, j] - доска[строка, i], -1, 1) m.Equation(diff + diff_prime == 0) для столбца в диапазоне (BOARD_DIMS[1]): для i, j в itertools.combinations(range(BOARD_DIMS[0]), r=2): diff = m.if3(board[i, col] - board[j, col], -1, 1) diff_prime = m.if3(доска[j, столбец] - доска[i, столбец], -1, 1) m.Equation(diff + diff_prime == 0) для квадрата в SQUARES: для (y, x), (y_prime, x_prime) в itertools.combinations(square, r=2): diff = m.if3(board[y, x] - board[y_prime, x_prime], -1, 1) diff_prime = m.if3(board[y_prime, x_prime] - доска[y, x], -1, 1) m.Equation(diff + diff_prime == 0) m.solve(disp=True) печать (доска) В настоящее время решатели учитывают предварительно заполненные мной квадраты, но заполняют все остальные квадраты 1.0. Текущее выражение неравенства с двойным вычитанием связано с тем, что попытка чего-то вроде m.Equation(board[row,j] != board[row,i]) привела к ошибке эффект того, что объекты типа "int" не имеют длины.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение