На самом деле, я пытаюсь реализовать очень простую формулировку модели:Настройка модели в CPLEX с помощью Python API
min sum_i(y_i*f_i) + sum_i(sum_j(x_ij*c_ij))
s.t. sum_i(x_ij) = 1 for all j
x_ij <= y_i for all i,j
x_ij, y_i are binary
Но я просто не могу понять, как Python API работает. Они предлагают создать переменные, как это:
model.variables.add(obj = fixedcost,
lb = [0] * num_facilities,
ub = [1] * num_facilities,
types = ["B"] * num_facilities)
# Create one binary variable for each facility/client pair. The variables
# model whether a client is served by a facility.
for c in range(num_clients):
model.variables.add(obj = cost[c],
lb = [0] * num_facilities,
ub = [1] * num_facilities,
types = ["B"] * num_facilities)
# Create corresponding indices for later use
supply = []
for c in range(num_clients):
supply.append([])
for f in range(num_facilities):
supply[c].append((c+1)*(num_facilities)+f)
# Constraint no. 1:
for c in range(num_clients):
assignment_constraint = cplex.SparsePair(ind = [supply[c][f] for f in \
range(num_facilities)],
val = [1] * num_facilities)
model.linear_constraints.add(lin_expr = [assignment_constraint],
senses = ["L"],
rhs = [1])
Для этого ограничения я понятия не имею, как переменные из выше refered к, поскольку он упоминает лишь вспомогательный список списков. Может ли кто-нибудь объяснить мне, как это должно работать? Проблема проста, я также знаю, как это сделать на C++, но API Python - это закрытая книга для меня.
Проблема заключается в uncapacitated задачи размещения и я хочу, чтобы адаптировать файл примера facility.py
EDIT: Одна идея ограничения № 2 является создание одномерных векторов и использовать векторное сложение для создания окончательное ограничение. Но это говорит мне, что это неподдерживаемый операнд SparsePairs
for f in range(num_facilities):
index = [f]
value = [-1.0]
for c in range(num_clients):
open_constraint = cplex.SparsePair(ind = index, val = value) + cplex.SparsePair(ind = [supply[c][f]], val = [1.0])
model.linear_constraints.add(lin_expr=[open_constraint],
senses = ["L"],
rhs = [0])
Я добавил ограничение из файла. Можете ли вы рассказать мне, как сюда включены переменные? Документация мне очень мало рассказывает об этом – steph
В цикле for с комментарием «Ограничение № 1» вы должны попробовать добавить инструкцию печати, которая печатает 'assign_constraint'. Если вы это сделаете, вы должны увидеть несколько строк вывода, например: 'SparsePair (ind = [5, 6, 7, 8, 9], val = [1.0, 1.0, 1.0, 1.0, 1.0])'. Это соответствует одному линейному ограничению, где переменные с индексами 5, 6, 7, 8, 9 имеют коэффициенты 1,0. Когда создается ограничение, смысл ограничения равен «L» (т. Е. <=), А правая сторона равна 1.0. В итоге вы получите ограничение, например: «x5 + x6 + x7 + x8 + x9 <= 1.0». – rkersh
О, интересный образ мыслей. Я понял это сейчас. Где я все еще борется, как я могу поместить индексы двух разных наборов переменных в одно ограничение? См. Обновление – steph