我是谷歌或谷歌工具的新手,我正在尝试使用cp_模型解决这个问题:
我有一个大小为d x s的矩阵“代理”(我的决策变量),一个大小为s x p的转移矩阵“覆盖率”,以及一个大小为d x p的客观矩阵“目标”。 我想最小化
其中“*”表示矩阵乘法。所以我写了
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
的东西,它似乎是相关的,但是我没有能够在这个目标函数中成功地实现它
谢谢
编辑: 我尝试过使用建议的中间变量,但由于我想最小化平方差,我尝试了类似的方法
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循环,但留下了索引来理解矩阵的维度
加上AddMultiplicationEquality以创建中间变量
就是
这不会直接起作用,因为目标以及您添加的方程式必须是线性的
我会成功的
相关问题 更多 >
编程相关推荐