求和NewBoolVars结果时遇报错,是否需切换为intVars?
问题解答
不用非得切换成IntVar,OR-Tools里的BoolVar本身就是取值0/1的IntVar子类,完全可以参与求和计算,你报错大概率是用了Python原生的sum()而不是OR-Tools提供的线性表达式求和方法。
给你两个关键解决点:
- 正确求和方式:别用Python的
sum(buy[i]),改用OR-Tools的cp_model.LinearExpr.Sum(buy[i])来对每行的BoolVar数组求和,这样求解器才能识别并处理这个约束/表达式。 - 提前筛除不满足条件的对象:要只纳入chargeRequest满足的买家和卖家,更高效的方式是直接给变量加约束——如果某个买家的chargeRequest没满足,就强制让对应时间槽的
buy变量全为0,这样求和时自然不会把这些对象算进去。比如:
# 假设charge_request是存储每个买家是否满足条件的列表 for buyer_idx in range(total_buyers): if not charge_request[buyer_idx]: # 该买家所有时间槽的buy变量都设为0 for t in range(time_slots): model.Add(buy[buyer_idx][t] == 0)
用BoolVar比IntVar更合适,因为求解器对0-1变量有专门的优化算法,计算效率更高,没必要换成普通IntVar。
内容的提问来源于stack exchange,提问作者FancyCookie
相关产品推荐
相关产品推荐

