Python调用MiniZinc的Gecode求解器报错,Chuffed可正常运行
Python调用MiniZinc时Gecode求解器报错,Chuffed正常运行
问题现象
通过Python运行MiniZinc模型,使用Gecode求解器时即使是简单测试模型也报错,切换为Chuffed求解器则能正常执行。
测试代码
import minizinc model = minizinc.Model() model.add_string(""" var -100..100: x; int: a; int: b; int: c; constraint a*(x`*`x) + b`*`x = c; solve satisfy; """) gecode = minizinc.Solver.lookup("gecode") inst = minizinc.Instance(gecode, model) inst["a"] = 1 inst["b"] = 4 inst["c"] = 0 result = inst.solve(all_solutions=True) for i in range(len(result)): print("x = {}".format(result[i, "x"]))
报错信息
result = inst.solve() File "C:\Users\acer\AppData\Local\Programs\Python\Python310\lib\site-packages\minizinc\instance.py", line 183, in solve return asyncio.run(coroutine) File "C:\Users\acer\AppData\Local\Programs\Python\Python310\lib\asyncio\runners.py", line 44, in run return loop.run_until_complete(main) File "C:\Users\acer\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 646, in run_until_complete return future.result() File "C:\Users\acer\AppData\Local\Programs\Python\Python310\lib\site-packages\minizinc\instance.py", line 235, in solve_async async for result in self.solutions() File "C:\Users\acer\AppData\Local\Programs\Python\Python310\lib\site-packages\minizinc\instance.py", line 450, in solutions raise parse_error(stderr) minizinc.error.MiniZincError: MiniZinc stopped with a non-zero exit code, but did not output an error message.
解决方法
- 修正MiniZinc模型语法错误:模型中的乘法表达式被错误地用反引号包裹,将
xx改为x*x,bx改为b*x。 - 修正Python代码缩进:
for循环内的print语句缺少缩进,需添加4个空格。
修正后的完整代码:
import minizinc model = minizinc.Model() model.add_string(""" var -100..100: x; int: a; int: b; int: c; constraint a*(x*x) + b*x = c; solve satisfy; """) gecode = minizinc.Solver.lookup("gecode") inst = minizinc.Instance(gecode, model) inst["a"] = 1 inst["b"] = 4 inst["c"] = 0 result = inst.solve(all_solutions=True) for i in range(len(result)): print("x = {}".format(result[i, "x"]))
原因说明
Gecode求解器对MiniZinc语法的严格性更高,错误的反引号语法会导致模型解析失败;而Chuffed求解器对这类语法错误有一定容错能力,所以能正常运行。修正语法错误后,Gecode即可正常执行求解。
内容的提问来源于stack exchange,提问作者Giacomo Gaiani
相关产品推荐
相关产品推荐

