Python或工具可以最小化平方差之和

2024-05-18 09:09:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我是谷歌或谷歌工具的新手,我正在尝试使用cp_模型解决这个问题:

我有一个大小为d x s的矩阵“代理”(我的决策变量),一个大小为s x p的转移矩阵“覆盖率”,以及一个大小为d x p的客观矩阵“目标”。 我想最小化

enter image description here

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

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

代理是一个model.NewIntVar,“移位覆盖”和“目标”是固定的输入矩阵

但是我得到一个错误,如果我删除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

  • 对于术语agents*shifts\u coverage,我添加了另一个变量,称为shifted\u agents,作为

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

请记住,shifts_覆盖率[s][p]只是一个布尔值,而代理[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_差实现AddMultiplicationEquality,但到目前为止,我得到了以下错误:

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

注意:我删除了for循环,但留下了索引来理解矩阵的维度


Tags: 代理目标formodel错误npcoverage矩阵
1条回答
网友
1楼 · 发布于 2024-05-18 09:09:57

加上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)

我会成功的

相关问题 更多 >