微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python或工具可最大程度减少平方差之和

如何解决Python或工具可最大程度减少平方差之和

我是google ortools的新手,并且尝试使用cp_model解决此问题:

我有一个尺寸为 dxs (我的决策变量)的矩阵“ agents”,一个过渡尺寸为“ shifts_coverage”尺寸为 sxp 的过渡矩阵和一个尺寸为“ objective”的目标矩阵 dxp 。 我想最小化

enter image description here

其中“ *”表示矩阵乘法。所以我写了

model.Minimize(sum(np.power([np.dot(agents,shifts_coverage) - objetive]),2))

agents是model.NewIntvar,“ shifts_coverage”和“ objetive”是固定的输入矩阵。

但是,如果我删除np.power,则会显示错误消息TypeError: unsupported operand type(s) for ** or pow(): '_SumArray' and 'int'错误is not a valid objective。 因此,我不确定应该如何定义此令人反感的功能,以使ortools具有预期的格式。 我还看过一种名为model.AddAbsEquality的东西,它似乎与之相关,但是我无法在这个令人讨厌的功能中成功实现它

谢谢!

编辑: 我尝试按照建议使用中间变量,但是由于我想最小化平方差,因此尝试了类似的方法

  • 将平方差表示为绝对值的乘积,因为我的矩阵是正数

    enter image description here

  • 对于术语agent * shifts_coverage,我添加了另一个名为shifted_agents as的变量

shifted_agents [d][p] = sum([agents[d][s] * shifts_coverage[s][p] for s in range(num_shifts)])

记住shifts_coverage [s] [p]只是一个布尔值,agents [d] [s]是一个模型。NewIntvar(我认为这可能是问题所在)

  • 对于绝对值,请使用中间变量的技巧
abs_difference[d][p] = model.NewIntvar(0,100,f'abs_difference_d{d}p{p}')
model.AddAbsEquality(abs_difference[d][p],shifted_agents[d][p] - objetive[d][p])

此后的想法是使用abs_difference实现AddMultiplicationEquality,但到目前为止,我得到了以下错误

TypeError('NotSupported: model.GetorMakeIndex(' + str(arg) +
TypeError: NotSupported: model.GetorMakeIndex((((agents_d0s2)) + -objetive_d0p0))

注意:我删除了for循环,但保留了索引以了解矩阵尺寸

解决方法

加上AddMultiplicationEquality来创建中间变量。

那是

model.Minimize(a**2 + b**2) 

这不会直接起作用,因为目标以及您添加的方程式必须是线性的。

square_a = model.NewIntVar(0,max_a**2,'square_a')
model.AddMultiplicationEquality(square_a,[a,a])
square_b = model.NewIntVar(0,max_b**2,'square_b')
model.AddMultiplicationEquality(square_b,[b,b])
model.Minimize(square_a + square_b)

可以解决问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。