首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在or-tools中建模方差-协方差矩阵计算

在or-tools中建模方差-协方差矩阵计算
EN

Stack Overflow用户
提问于 2020-06-30 08:26:58
回答 1查看 153关注 0票数 0

我的任务是将Excel Solver解决方案自动化到我们的应用程序中。我偶然发现了or-tools,它看起来和我想要的很接近--尽管我不确定,因为这是我第一次尝试与SAT相关的问题空间。

我有大约30个约束和一个目标。幸运的是,我能够将所有约束都建模到or-tools中,但是添加目标会一直返回Not an integer linear expression错误。我试图最小化的计算是方差-协方差矩阵:

代码语言:javascript
复制
#!/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

运行此程序时,将抛出以下代码:

代码语言:javascript
复制
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的一个不同功能?

任何指导/帮助都将不胜感激!

我尝试过的其他变体和错误输出:

代码语言:javascript
复制
# 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))
代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2020-07-01 05:50:54

多亏了Erwin的评论,事实证明or-tools并不是使用scipy.optimize.minimize成功找到工作的正确工具。不幸的是,CVXPY不喜欢输入-猜测的值不再使其成为凸优化问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62648547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档