Member 13941108 Ответов: 1

Как создать переменную, в которой один индекс зависит от значения другого индекса?


Привет, ребята. У меня возникла проблема с проблемой Python PulP MILP. Вы можете найти упрощенный код, который воспроизводит эту проблему здесь:
from pulp import *
machines = 2
I = range(machines)
positions = 2
J = range(positions)
years = 10
T = range(years)
age = {0: 5, 1: 7}

IR = 0.06
df = 0.3

costs = {(0,0):300, (0,1):200, (1,0):500, (1,1):350}

factor = {}
finalcosts = {}
for i in I:
    for j in J:
        for t in T:
            for k in range(age[i]):
                factor[t,k] = ((1-df)**k)/((1+IR)**t)
                finalcosts[i,j,t,k] = costs[i,j]*factor[t,k]
                
prob = LpProblem("TrialProb",LpMinimize)


Prob_vars = LpVariable.dicts("probvars", ((Machine, Position,Year, Age) for Machine in I for Position in J for Year in T for Age in range(age[i])),0,None, LpInteger)


Это дает мне переменную finalcosts размером 240, которая является тем, что я хочу, со всеми правильными значениями. Но "Prob_vars" имеют размер 260, считая второй индекс k для первого индекса i также. Это означает, что в то время как в "finalcosts" для i=0, k=0:4 и для i=2, k=0:6 (что я и хочу), для индекса переменной решения Prob_vars k=0:6 для обоих i=1 & i=2.

Я довольно новичок в Python, поэтому не могу понять, в чем заключается проблема.

Что я уже пробовал:

Я перепробовал все комбинации, которые мог придумать для различных выражений "Prob_vars", но ничего не работает должным образом. Например, вынимая выражения индексов из оператора variable:
for i in I:
    for j in J:
        for t in T:
            for Age in range(lifetime[i]):
                Prob_vars = LpVariable.dicts("probvars", ((Machine, Position,Year, 
                Age), 0,None, LpInteger)

Я также искал в интернете все, что мог придумать, но не могу найти ответа на этот вопрос.

1 Ответов

Рейтинг:
12

Gerry Schmitz

Prob_vars = LpVariable.dicts("probvars", ((Machine, Position,Year, Age) for Machine in I for Position in J for Year in T for Age in range(age[i])),0,None, LpInteger)

Вы дважды повторяете "машину" во внутреннем цикле, удерживая индекс "i".


Member 13941108

Спасибо тебе, Джерри!