代码是:
from minizinc import Instance, Model, Solver
gecode = Solver.lookup("gecode")
model = Model()
model.add_string(
"""
include "all_different.mzn";
set of int: A;
set of int: B;
array[A] of var B: arr;
var set of B: X;
var set of B: Y;
constraint all_different(arr);
constraint forall (i in index_set(arr)) ( arr[i] in X );
constraint forall (i in index_set(arr)) ( (arr[i] mod 2 = 0) <-> arr[i] in Y );
"""
)
instance = Instance(gecode, model)
instance["A"] = range(3, 8) # MiniZinc: 3..8
instance["B"] = {4, 3, 2, 1, 0} # MiniZinc: {4, 3, 2, 1, 0}
result = instance.solve()
print(result["X"]) # range(0, 5)
assert isinstance(result["X"], range)
print(result["Y"]) # {0, 2, 4}
assert isinstance(result["Y"], set)Jupyther回来了:
RuntimeError: asyncio.run() cannot be called from a running event loop发布于 2021-02-09 10:22:47
按照安装步骤,就像他们说的,这是魔术!Using MiniZinc in Jupyter Notebooks。
只需运行pip install -U iminizinc,然后您的细胞将如下所示:
%load_ext iminizinc(^这可能会导致带有奇怪的青色错误的白色输出,以防忽略它。如果您想确保已成功加载了minizinc,请再次运行单元格,应该会出现类似于The iminizinc extension is already loaded.的内容)
# regular python assigments.
# Note that set and range are not JSON serializable, you will need
# always to convert your iterables to list
A = list(range(3, 8))
B = [4, 3, 2, 1, 0]%%minizinc
include "all_different.mzn";
set of int: A;
set of int: B;
array[A] of var B: arr;
var set of B: X;
var set of B: Y;
constraint all_different(arr);
constraint forall (i in index_set(arr)) ( arr[i] in X );
constraint forall (i in index_set(arr))
( (arr[i] mod 2 = 0) <-> arr[i] in Y );最后一个单元格实际上是在单元格中执行的迷你代码,输出将是您的解决方案。
如果您正在寻找所有可能的解决方案,只需在魔术中添加标志-a:%%minizinc -a
您还可以使用标志-m bind:%%minizinc -m bind将输出绑定到python变量。在您的示例中,您可以在另一个单元格中检查输出变量,如下所示:
arr # => [0, 1, 2, 3, 4]要获得所有可能的标志,请使用魔法:%%minizinc?
https://stackoverflow.com/questions/65710868
复制相似问题