You need to enable JavaScript to run this app. Python调用minizinc包出现KeyError: 'w'报错该如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 20:03:04