我正在尝试使用CPLEX求解器将一些代码从纯CPLEX转换为CVXPY。原始代码如下:
p = cplex.Cplex()
p.objective.set_sense(p.objective.sense.maximize)
obj = np.zeros(numCols)
for i in range(numSamples):
if labels[i] == 0:
for b in range(numBuckets):
obj[zv_ + b*numSamples + i] = C
else:
for b in range(numBuckets):
obj[zv_ + numBuckets*numSamples + b*numSamples + i] = 1
p.linear_constraints.add(rhs=rhs,senses=senses)
p.linear_constraints.set_names(zip(range(constraint_cnt),cnames))
lb = np.zeros(numCols)
ub = np.ones(numCols)
p.variables.add(obj = obj, lb = lb, ub = ub, columns=cols, types=types, names=names)
p.parameters.timelimit.set(maxtime)
p.solve()
sol = p.solution
这是我尝试将其转换为CVXPY语法:
import cvxpy as cp
obj = np.zeros(numCols)
for i in range(numSamples):
if labels[i] == 0:
for b in range(numBuckets):
obj[zv_ + b*numSamples + i] = C
else:
for b in range(numBuckets):
obj[zv_ + numBuckets*numSamples + b*numSamples + i] = 1
objective = cp.Maximize(sum(obj))
CPLEX指定'rhs'和'senses'的方式让我非常困惑。这些应该是什么?
答案 0 :(得分:1)
Cplex.linear_constraints.add的CPLEX Python API文档说:
感觉必须是单字符字符串或字符串的列表 包含线性约束的意义。每个条目必须是 “ G”,“ L”,“ E”和“ R”之一,表示大于,小于, 相等和范围约束。
rhs是浮点列表,指定每个线性的右侧 约束。
CVXPY是一种建模语言,因此,您可以使用>=
,<=
和==
(而不是将含义指定为“ G”,“ L”,“ E”)(即Python比较运算符)。约束的右侧将是单个约束的数字(例如,Python float
或int
),或者是一组约束的numpy数组。
CVXPY examples应该使您对如何做事有个好主意。