Преобразование «чувств» и «правых» из CPLEX в CVXPY - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь преобразовать некоторый код из чистого 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', а также "чувства".Что это должно быть?

1 Ответ

1 голос
/ 19 апреля 2019

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

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

rhs - списокof float, определяя правую часть каждого линейного ограничения.

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

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

...