vxpy中基于查找的目标函数



我想定义一个基于查找表的目标函数。例如,我们有一个整数编程问题(二进制),我们可以从一组操作中选择一个或多个操作。我们的cvxpy。变量是:

element_vars = [1, 0, 0, 1](注:element_vars是一个没有值的cvpy占位符,但我在这里放了一些数字以供说明)

选择的动作集合是:

actions = [2, 3, 4, 5]

目标函数取决于"总动作"。(不是单个动作),计算如下:

total_actions = cvxpy.matmul(element_vars, actions.T) = [2+5] = [7]

目标值是从基于"total_action "的查找表中选取的。价值。例如,如果查找表为:

lookup_table = [[2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 6, 8, 3, 4, 8,  9]]

第一行显示"total_action "第二行为对应的目标值。

在本例中,total_actions=7的目标值为4。

因为element_vars是一个占位符,而且它只存在于CVXPy环境中,所以我不能使用Pandas、df或NumPy函数。我尝试了下面的代码

total_actions = cvxpy.matmul(actions, element_vars)
self.objective_terms.append(cvxpy.multiply(lookup_table[np.where(lookup_table[:,0] == total_actions),1], weight))

但是,我得到下面的错误

Error in python process: At line 23: <class 'Exception'>: Cannot evaluate the truth value of a constraint or chain constraints, e.g., 1 >= x >= 0.

我还尝试将lookup_table作为vxpy参数传递,但没有进展。如果您知道如何在CVXPy环境中处理数组(查找数组中的值并返回值或索引),我将不胜感激。

我有机会与CVXPy的开发人员Steve Diamond聊天。正如他在这里提到的,CVXPy不能执行任何索引/查找操作。如果你的目标函数是线性的,你可以使用这里的近似函数。在我的例子中,我改变了问题的结构,以便能够使用CVXPy。

最新更新