Преобразование ‘senses’ и ‘rhs’ из CPLEX в CVXPY

#cplex #cvxpy

#cplex #cvxpy

Вопрос:

Я пытаюсь преобразовать некоторый код из чистого CPLEX в CVXPY с помощью решателя CPLEX. Исходный код выглядит следующим образом:

     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:

Документация CPLEX Python API для Cplex.linear_constraints.add гласит:

значения должны быть либо списком односимвольных строк, либо строкой, содержащей значения линейных ограничений. Каждая запись должна быть одной из ‘G’, ‘L’, ‘E’ и ‘R’, указывая на ограничения больше, меньше, равенство и диапазон соответственно.

rhs — это список с плавающей запятой, указывающий правую сторону каждого линейного ограничения.

CVXPY — это язык моделирования, поэтому вместо указания смысла как ‘G’, ‘L’, ‘E’ вы должны использовать >= , <= , и == (т. Е. Операторы сравнения Python). В правой части ограничений будет число для отдельного ограничения (например, Python float или int ) или, возможно, массив numpy для группы ограничений.

Примеры CVXPY должны дать вам хорошее представление о том, как это делается.