将“ senses”和“ rhs”从CPLEX转换为CVXPY

时间:2019-04-17 19:35:56

标签: cplex cvxpy

我正在尝试使用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'的方式让我非常困惑。这些应该是什么?

1 个答案:

答案 0 :(得分:1)

Cplex.linear_constraints.add的CPLEX Python API文档说:

  

感觉必须是单字符字符串或字符串的列表   包含线性约束的意义。每个条目必须是   “ G”,“ L”,“ E”和“ R”之一,表示大于,小于,   相等和范围约束。

     

rhs是浮点列表,指定每个线性的右侧   约束。

CVXPY是一种建模语言,因此,您可以使用>=<===(而不是将含义指定为“ G”,“ L”,“ E”)(即Python比较运算符)。约束的右侧将是单个约束的数字(例如,Python floatint),或者是一组约束的numpy数组。

CVXPY examples应该使您对如何做事有个好主意。