【发布时间】:2021-05-06 05:46:39
【问题描述】:
我尝试使用 google-OR 工具为流游戏制作求解器。
我为角落制定了一些规则,只包含角落管道,但除此之外,我不知道如何使管道相互连接,也不知道如何告诉模型制作连接到的管道彼此。
几个sn-p
pipe_types = {
0: " ",
1: "-",
2: "|",
3: "┗" ,
4: "┛" ,
5: "┓",
6: "┏",
7: "●"
}
model = cp_model.CpModel()
filled_map = [[0,0,0,0],
[0,0,7,0],
[0,0,0,0],
[0,7,0,0]]
mesh_size = int(np.sqrt(len(np.array(filled_map).flatten())))
target_map = [[model.NewIntVar(1, 6, 'column: %i' % i) for i in range(mesh_size)] for j in range(mesh_size)]
flow_map = init_map(model, target_map, filled_map)
for i in range(len(flow_map)):
for j in range(len(flow_map[0])):
# check if top or bottom side
if (i == 0) or (i == len(flow_map)-1):
model.Add(flow_map[i][j] != 2)
# check if left or right side
if (j == 0) or (j == len(flow_map[0])-1):
model.Add(flow_map[i][j] != 1)
# left up corner
if (i == 0) & (j == 0):
model.Add(flow_map[i][j] != 3)
model.Add(flow_map[i][j] != 4)
model.Add(flow_map[i][j] != 5)
# right up corner
if (i == 0) & (j == len(flow_map[0])-1):
model.Add(flow_map[i][j] != 3)
model.Add(flow_map[i][j] != 4)
model.Add(flow_map[i][j] != 6)
# left bottom corner
if (i == len(flow_map)-1) & (j == 0):
model.Add(flow_map[i][j] != 4)
model.Add(flow_map[i][j] != 5)
model.Add(flow_map[i][j] != 6)
# right bottom corner
if (i == len(flow_map)-1) & (j == len(flow_map[0])-1):
model.Add(flow_map[i][j] != 3)
model.Add(flow_map[i][j] != 5)
model.Add(flow_map[i][j] != 6)
# Solving
status = solver.Solve(model)
res = []
if status == cp_model.OPTIMAL or status == cp_model.FEASIBLE:
for i in range(len(flow_map)):
for j in range(len(flow_map[0])):
res.append(solver.Value(flow_map[i][j]))
print(solver.Value(flow_map[i][j]), end=" ")
print()
这将导致网格中心的水平管道。稍后,我也必须弄清楚如何在此上添加颜色等。
是否有任何关于如何在 OR 工具上进行此操作的指针?
编辑 1:
根据 David Eisenstat 的回答,我可以找到解决方案。根据 JohanC 的回答可视化这个解决方案,我得到了这个结果。
我可以通过 google-OR 工具获取路径吗?
编辑 2:
使用来自"Hamiltonian" path using Python 的汉密尔顿路径 我可以生成一些正确的路径。
但是感觉很奇怪,因为 OR 工具已经计算了路径,我必须重新计算路径。从"Hamiltonian" path using Python 生成的路径并未显示所有可能的组合。如果我可以从 OR 工具中走出来,我认为这将是我的最大兴趣。
【问题讨论】:
-
请注意,我的着色代码假定路径中没有任何不必要的折叠(求解器仅生成该类型的路径,并允许空单元格)。如果需要额外的折叠,不仅每个单元格需要颜色,而且连接需要由数据结构表示。