Python 在目标函数中加入主变量和辅助变量的乘积

Python 在目标函数中加入主变量和辅助变量的乘积,python,cvxpy,integer-programming,Python,Cvxpy,Integer Programming,这是一篇文章的后续问题 我试图解决的问题是,在公司和类别的交叉点找到平均值高于某个阈值的最大单元格组合。此外,如果我为某家公司包括3个类别,那么为了包括另一家公司,该公司的所有3个类别也必须包括在内 我将析取推理融入到我的优化问题中。我设置了一个约束,其中3个公司(列)和所有三个类别(行)中至少有2个必须为非零。我为此创建了零补偿变量和零cat变量。为了使优化包含这一点,我想将决策变量矩阵乘以这些,但按元素计算(例如,如果zero_comp_vars为[1,0,0]我们将决策变量矩阵的第一列乘以

这是一篇文章的后续问题

我试图解决的问题是,在公司和类别的交叉点找到平均值高于某个阈值的最大单元格组合。此外,如果我为某家公司包括3个类别,那么为了包括另一家公司,该公司的所有3个类别也必须包括在内

我将析取推理融入到我的优化问题中。我设置了一个约束,其中3个公司(列)和所有三个类别(行)中至少有2个必须为非零。我为此创建了零补偿变量和零cat变量。为了使优化包含这一点,我想将决策变量矩阵乘以这些,但按元素计算(例如,如果zero_comp_vars为[1,0,0]我们将决策变量矩阵的第一列乘以1作为标量,第二列和第三列乘以0作为标量。然而,我相信这样做会使函数非线性

我可以使用vstack和hstack将zero_comp_vars和zero_cat_vars转换为矩阵,但随后会遇到DCP冲突

import numpy as np
import cvxpy as cp
import cvxopt 

util = np.array([[0.7, 0.95, 0.3], [2, 1.05, 2.2], [4, 1, 3]])

# The variable we are solving for
dec_vars = cp.Variable(util.shape, boolean = True)

zero_comp_vars = cp.Variable(util.shape[1], boolean = True)
zero_cat_vars = cp.Variable(util.shape[0], boolean = True)

# define constraints
zero_comp_constr = cp.sum(dec_vars, axis=0) >= 2 * zero_comp_vars
zero_cat_constr = cp.sum(dec_vars, axis=1) >= 3 * zero_cat_vars
# need the following two constraints, otherwise all the values in the zero_comp_constr and zero_cat_constr vectors can be 0
above_one_non_zero_comp = cp.sum(zero_comp_vars) >= 1
above_one_non_zero_cat = cp.sum(zero_cat_vars) >= 1

# min tin array
min_comp_array=np.empty(dec_vars.shape[0])
min_comp_array.fill(2)

min_comp_constr = cp.sum(dec_vars, axis=1) >= min_comp_array
tot_avg_constr = tot_util >= 2.0 * cp.sum(dec_vars)

temp = cp.multiply(util, dec_vars)
# realize as it's written, it's trying to do element-wise multiplication, and dec_vars has shape (3,)
temp2 = cp.multiply(temp, zero_comp_vars)
temp3 = cp.multiply(temp2, zero_cat_vars)

tot_util = cp.sum(temp3)

cluster_problem = cp.Problem(cp.Maximize(tot_util), [zero_comp_constr, zero_cat_constr, 
                                                     above_one_non_zero_comp, above_one_non_zero_cat,
                                                     min_comp_constr, tot_avg_constr])

cluster_problem.solve()