问题描述
我正在尝试在 Jupyter 中使用 Minizinc。 我已经安装了所有的包,但是当我运行模型时,它运行了一个错误。我尝试使用 MiniZinc Python pdf 上的示例,但它运行相同的错误。 代码是:
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,0}
result = instance.solve()
print(result["X"]) # range(0,5)
assert isinstance(result["X"],range)
print(result["Y"]) # {0,4}
assert isinstance(result["Y"],set)
然后 Jupyther 返回:
RuntimeError: asyncio.run() cannot be called from a running event loop
解决方法
按照安装步骤操作,正如他们所说,这很神奇! 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 );
最后一个单元格实际上是 minizinc 代码,在单元格内执行,输出将是您的解决方案。
如果您正在寻找所有可能的解决方案,只需将标志 -a
添加到魔法中:%%minizinc -a
您还可以使用标志 -m bind
: %%minizinc -m bind
将输出绑定到 python 变量。在您的情况下,您可以在另一个单元格中检查您的输出变量,如下所示:
arr # => [0,4]
要获得所有可用的标志,请使用魔法:%%minizinc?