Я работаю со словарями Python, чтобы определить некоторые переменные и параметры для математического режима.
Фрейм данных выглядит следующим образом:
Service Bill Weight Zone Resi UPS FedEx USPS DHL
1DEA 1 2 N 33.02 9999 9999 9999
2DAM 2 2 N 33.02 9999 9999 9999
Я определил некоторые входные данные и переменную из этого следующим образом:
cost = {}
for carrier in carriers:
for row in df.to_dict('records'):
key = (row['Service'], row['Bill Weight'],
row['Zone'],row['Resi'], carrier)
cost[key] = row[carrier]
services = df['Service'].unique().tolist()
weights = df['Bill Weight'].unique().tolist()
zones = df['Zone'].unique().tolist()
addresses = df['Resi'].unique().tolist()
Мои единственные допустимые комбинации для присвоения и стоимости должны быть:
['1DEA',1,2,'N','UPS']
['1DEA',1,2,'N','FedEx']
['1DEA',1,2,'N','USPS']
['1DEA',1,2,'N','DHL']
['2DAM',2,2,'N','UPS']
['2DAM',2,2,'N','FedEx']
['2DAM',2,2,'N','USPS']
['2DAM',2,2,'N','DHL']
И следующее с gurobi python, но на самом деле меня интересует только построение моих циклов через python, а не синтаксис gurobi:
Подход A:
assign = {}
for carrier in carriers:
for row in df.to_dict('records'):
key = (row['Service'], row['Bill Weight'],
row['Zone'],row['Resi'], carrier)
cost[key] = row[carrier]
obj = quicksum(cost[key]*assign[key] \
for key in assign)
Теперь это прекрасно работает, чтобы убедиться, что переменные и параметры генерируются только из ключей словаря, а не из всех возможных комбинаций служб, весов, зон и адресов. Но это не будет работать, когда у меня есть определенные ограничения, как показано ниже:
m.addConstrs((assign['1DEA', w, z, r, 'UPS']+assign['1DEA', w, z, r, 'USPS']+assign['1DEA', w, z, r, 'USPS 1C']==1\
for i in clients for s in services for w in weights for z in zones for r in addresses),"C02")
Подход 2:
assign = m.addVars(services, weights, zones, addresses, carriers, name = "Assign", vtype=GRB.BINARY)
obj = quicksum(cost[s, w, z, r, l]*assign[ s, w, z, r, l] \
for s in services for w in weights for z in zones for r in addresses for l in carriers)
Таким образом, я легко могу написать все свои ограничения, но он создаст все комбинации услуг, весов, зон, адресов, носителей, что делает мою модель неверной. например, ['2DAM', 1,2, 'N', 'UPS'] не является допустимой комбинацией.
Есть ли способ ограничить этот цикл для служб, весов, зон, адресов, носителей только комбинациями, которые определены в ключах словаря стоимости?