我的任务是将Excel Solver解决方案自动化到我们的应用程序中。我偶然发现了or-tools,它看起来和我想要的很接近--尽管我不确定,因为这是我第一次尝试与SAT相关的问题空间。
我有大约30个约束和一个目标。幸运的是,我能够将所有约束都建模到or-tools中,但是添加目标会一直返回Not an integer linear expression错误。我试图最小化的计算是方差-协方差矩阵:
#!/usr/bin/env python3
from __future__ import print_function
from ortools.sat.python import cp_model
model = cp_model.CpModel()
weights = [0] * 14 # 14 different weights optimize on
values = [...] # Values corresponding to the weights
varcovmat = [[...],[...],[...], ...] # Square Matrix, 14x14
for i in range(0, len(weights)):
weights[i] = model.NewIntVar(0, 10000, 'w'+str(i))
# Add some constraints
model.Add(cp_model.LinearExpr.Sum(weights) == 10000)
model.Add(cp_model.LinearExpr.ScalProd(weights, values) == 2000000)
# Add the Objective
expressions = [0]*len(cov)
for i in range(0, len(cov)):
expressions[i] = sum([y*x for x,y in zip(weights, [int(x[i]*100) for x in cov])])
model.Minimize(sum([weights[i] * expressions[i] for i in range(0, len(cov))])) # Here is where the error is thrown运行此程序时,将抛出以下代码:
TypeError: Not an integer linear expression: (((((((((((((((100 * w0)) + (36 * w1)) + (5 * w2)) + (30 * w3)) + (-14 * w4)) + (12 * w5)) + (-8 * w6)) + (10 * w7)) + -w8) + (-15 * w9)) + (-13 * w10)) + (-13 * w11)) + (-11 * w12)) + (-6 * w13))这是一种我可以使用或工具来解决的问题类型吗?我知道如果我忽略了目标,我可以搜索所有的解决方案并选择获胜的解决方案,但这是一个相当长/繁琐的方法。
有没有办法将这个问题正确地建模到or-tools中,或者是我应该关注的or-tools的一个不同功能?
任何指导/帮助都将不胜感激!
我尝试过的其他变体和错误输出:
# Add the Objective
expressions = [0]*len(cov)
for i in range(0, len(cov)):
expressions[i] = cp_model.LinearExpr.ScalProd(weights, [int(x[i]*100) for x in cov])
model.Minimize(cp_model.LinearExpr.ScalProd(weights, expressions))TypeError: Not an integer: 100 * w0 + 36 * w1 + 5 * w2 + 30 * w3 - 14 * w4 + 12 * w5 - 8 * w6 + 10 * w7 - w8 - 15 * w9 - 13 * w10 - 13 * w11 - 11 * w12 - 6 * w13发布于 2020-07-01 05:50:54
多亏了Erwin的评论,事实证明or-tools并不是使用scipy.optimize.minimize成功找到工作的正确工具。不幸的是,CVXPY不喜欢输入-猜测的值不再使其成为凸优化问题。
https://stackoverflow.com/questions/62648547
复制相似问题