Как получить доступ только к определенным переменным в проблеме PuLP? - PullRequest
0 голосов
/ 09 сентября 2018

В модели LP, которую я решаю с помощью PuLP в python, у меня есть два набора переменных решения, например

#Variables x 
x = LpVariable.dicts("Decision_x",(range(3),range(3)),0,1,LpInteger)
#Variables y 
y = LpVariable.dicts("Decision_y",(range(3),range(3)),0,1,LpInteger)

После решения модели меня интересуют только те переменные, где x [i] [j] принимает значение 1. Я знаю, что с

for v in prob.variables():
    if v.varValue == 1:
        print(v)

Я могу напечатать все переменные с их значением, равным единице. Следовательно, все переменные x и все y с их значением, равным 1, печатаются. Как мне получить доступ только к переменным x, чтобы переменные y не печатались? Я пробовал prob.variables(x) или prob.variables()[x], но пока ничего не получалось.

Затем на следующем шаге я хотел бы извлечь индексы переменных x, для которых x равен 1. Например, если x[1][3] == 1, то я хочу найти эти индексы 1 и 3. Является ли их какой-нибудь разумный способ в PuLP чего добиться?

1 Ответ

0 голосов
/ 09 сентября 2018

x - это диктат. С учетом двух индексов i,j на x[i][j] у вас есть pulp.LpVariable.
Вы заранее знаете индексы вашей переменной x, поэтому одним из способов является, например, следующее

for i,j in itertools.product(range(3),range(3)):
    if x[i][j].varValue > 0:
        print((i,j), x[i][j].name, x[i][j].varValue)

или, если вы предпочитаете сохранить индексы:

x_vars_indices = [(i,j) for i,j in itertools.product(range(3),range(3)) if x[i][j].varValue > 0]

Другим способом является итерация вложенного словаря x и получение переменных, которые являются значениями в последних слоях dict.

x = {0: {0: Decision_x_0_0, 1: Decision_x_0_1, 2: Decision_x_0_2},...
                ^                  ^                   ^
                |                  |                   |
                              LpVariable
...