Python调用minizinc包出现KeyError: 'w'报错该如何解决?
问题原因
- 取值对象错误:你在
model1.mzn中定义的w参数,以及通过ins-1.dzn加载的输入参数,都无法通过instance[key]直接读取。instance的键值存储仅对通过Python代码主动赋值的参数生效,通过文件加载的参数不会存入该存储结构,因此触发KeyError。所有模型定义的输入参数、求解得到的输出变量,都可以在调用instance.solve()得到的result对象中获取。 - 潜在类型错误:MiniZinc返回的整型参数在Python中为int类型,直接和字符串拼接会触发类型错误,需要手动转换为字符串类型。
- 潜在循环逻辑错误:
num_circuits为整数,直接用for i in num_circuits遍历会触发报错,需要改为遍历对应范围的序列,同时注意MiniZinc数组默认下标从1开始,Python侧取值要做好下标适配。
修正后代码
from minizinc import Instance, Model, Solver MODEL = "model1.mzn" DATA = "ins-1.dzn" # 加载模型 model = Model(MODEL) model.add_file(DATA) # 查找Gecode对应的MiniZinc求解器配置 gecode = Solver.lookup("gecode") # 为Gecode创建模型实例 instance = Instance(gecode,model) # 求解并生成输出文件 result = instance.solve() # 将解决方案写入输出文件 with open(DATA[:-4] + "_output.txt","w") as file: # 所有参数从result中读取,转成字符串再拼接 file.write(str(result["w"]) + " " + str(result["l"]) + "\n") num_circuits = result["n"] file.write(str(num_circuits) + "\n") # 调整循环逻辑,适配MiniZinc默认从1开始的下标规则 for i in range(1, num_circuits + 1): file.write(str(result["x"][i]) + " " + str(result["y"][i]) + " ") file.write(str(result["p"][i][0]) + " " + str(result["p"][i][1]) + "\n")
如果你的MiniZinc模型中x、p等数组下标设置为从0开始,把循环范围改为range(num_circuits)即可。
内容的提问来源于stack exchange,提问作者Giuseppe Boezio
相关产品推荐
相关产品推荐

