2016-05-22 2 views
0

На самом деле, я пытаюсь реализовать очень простую формулировку модели:Настройка модели в 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]) 

ответ

1

Питон API ближе к отзывной библиотеке C в природе, чем ++/Concert API C. Переменные индексируются от 0 до model.variables.get_num() - 1 и могут упоминаться индексом, например, при создании ограничений. Их также можно назвать по имени (метод add имеет необязательный аргумент names). См. Документацию для VariablesInterface here (это для версии 12.5.1, которую, я считаю, вы используете, учитывая предыдущий пост).

Это может помочь начать поиск самых простых примеров, таких как lpex1.py (и прочитать комментарии). Наконец, я настоятельно рекомендую играть с Python API из интерактивной подсказки Python (иначе REPL). Вы можете прочитать там помощь и ввести что-то, чтобы посмотреть, что они делают.

Вы также можете ознакомиться с пакетом docplex. Это слой моделирования, построенный поверх API-интерфейса CPLEX Python (или который может быть разрешен в облаке, если у вас нет локальной установки CPLEX).

+0

Я добавил ограничение из файла. Можете ли вы рассказать мне, как сюда включены переменные? Документация мне очень мало рассказывает об этом – steph

+0

В цикле 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

+0

О, интересный образ мыслей. Я понял это сейчас. Где я все еще борется, как я могу поместить индексы двух разных наборов переменных в одно ограничение? См. Обновление – steph

Смежные вопросы