#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 должны дать вам хорошее представление о том, как это делается.