首页 > 解决方案 > 错误:“Var”对象在 Groubi 中不可下标。我应该怎么做

问题描述

from gurobipy import *
import pandas as pd
import numpy as np
import csv
"""
P,p=multidict({1:10,2:10,3:10,4:10})
P,s=multidict({1:5,2:4,3:7,4:3})
W,w=multidict({1:1,2:2,3:2,4:1,5:3,6:1,7:1,8:4,9:2,10:2})
d={(1,1):10, (1,2):15, (1,3):30,(1,4):25,(1,5):15,(1,6):20,(1,7):40,(1,8):100,(1,9):250,(1,10):300,
   (2,1):139, (2,2):35, (2,3):65,(2,4):55,(2,5):300,(2,6):500,(2,7):100,(2,8):250,(2,9):30,(2,10):80,
   (3,1):20, (3,2):75, (3,3):25,(3,4):70,(3,5):100,(3,6):45,(3,7):25,(3,8):100,(3,9):250,(3,10):200,
   (4,1):500, (4,2):85, (4,3):75,(4,4):60,(4,5):200,(4,6):50,(4,7):500,(4,8):50,(4,9):100,(4,10):150,
   }
P,p=multidict({1:1,2:1,3:2,4:2,5:2})
P,s=multidict([1:1,2:1,3:2,4:2,5:2])
W,w=multidict({1:2,2:2,3:2,4:2})
d={(1,1):2,(1,2):3,(1,3):3,(1,4):5,
   (2,1):2,(2,2):3,(2,3):3,(2,4):5,
   (3,1):2,(3,2):3,(3,3):3,(3,4):5,
   (4,1):2,(4,2):3,(4,3):3,(4,4):5,
   (5,1):2,(5,2):3,(5,3):3,(5,4):5,
  }
"""
t = {}
with open('d.csv') as f:
    c = csv.DictReader(f)
    for k1, l in enumerate(c, 1):
        for k2 in l:
            t[k1, int(k2)] = int(l[k2])
w_data=pd.read_csv('w.csv',header=None)
p_data=pd.read_csv('p.csv',header=None)
wf=w_data.dropna(how='all', axis=1)
pf=p_data.dropna(how='all', axis=1)
W=wf[:1].values[0]
w=dict(zip(wf[:1].values[0], wf[1:2].values[0]))
P=pf[:1].values[0]
p=dict(zip(pf[:1].values[0], pf[1:2].values[0]))
P=[int(i) for i in P]
W=[int(j) for j in W]
p={int(key):int(value) for key, value in p.items()}
w={int(key):int(value) for key, value in w.items()}
T=45
total_w=sum(w.values())
total_p=sum(p.values())
R= total_w/total_p
#データの読み込みと定義

#データ作成#
model=Model("keibi optimizer")
x={}
y={}
z={}
E={}
M={}
E_abs={}
for i in P:
    y[i]=model.addVar(vtype="C",name="y(%s)"%(i)) #変数を定義する
    E[i]=model.addVar(vtype="C",name="E(%s)"%(i))
    M[i]=model.addVar(vtype="C",name="M(%s)"%(i))
    E_abs[i]=model.addVar(lb=0,vtype="C",name="abs1(%s)"%(i))
    for j in W:
        x[i,j]=model.addVar(vtype="C",name="x(%s,%s)"%(i,j)) #変数を定義する
        z[i,j]=model.addVar(vtype="C",name="z(%s,%s)"%(i,j)) #変数を定義する
model.update()
for j in W:
    model.addConstr(quicksum(x[i,j] for i in P) == w[j],name='Demand(%s)' %j) #警備会社のそれぞれの事業所から契約先に必要な人数派遣される
for i in P:
    z= model.addVar(lb=-GRB.INFINITY)
    model.addConstr(z==y[i]-R*p[i])
    model.addGenConstrAbs(E_abs[i],z,"absConstr")
    model.addConstr(p[i]*p[i]*E[i]==(p[i]-E_abs[i])*(p[i]-E_abs[i]),name='Satisfaction1(%s)' %i)
for i in P:
    model.addConstr(quicksum(x[i,j] for j in W) <= p[i],name='Capacity1(%s)' %i) #警備会社の事業所からそれぞれの契約先に決まった人数以下派遣される
    model.addConstr(quicksum(x[i,j] for j in W) == y[i],name='Capacity2(%s)' %i) #警備会社の事業所からそれぞれの契約先に決まった人数派遣される
    model.addConstr(quicksum(t[i,j]*z[i,j] for j in W) ==(1-M[i])*T,name='Satisfaction2(%s)' %i)
    model.addConstr(y[i]>0,name='binary(%s)' %i)
for i in P:
    for j in W:
        model.addConstr(x[i,j],"==",y[i,j]*z[i,j])
        model.addConstr(t[i,j]*x[i,j],"<=",T*x[i,j]) #移動距離の上限の制約
model.setObjective(quicksum(E[i]*M[i] for i in P)/n,GRB.MAXIMIZE)#目的関数        
model.optimize()
print("Overall satisfacton:",model.ObjVal) #全体の満足度の出力
for i in P:
    S=E[i]
    print("Office %3s business satisfaction %3s"%(i,S)) #それぞれの事業所の満足度の出力
for i in P:
    N=M[i]
    print("Office %3s distance satisfaction %3s"%(i,N))
for(i,j) in x:
    print("sending quantity %10s from office %3s to workplace %3s" %(x[i,j], i, j)) #最適解の出力 
TypeError: 'Var' object is not subscriptable
Error Line model.addConstr(quicksum(t[i,j]*z[i,j] for j in W) ==(1-M[i])*T,name='Satisfaction2(%s)' %i)

python gurobi 9.11 我正在解决一个应用交通规划的问题。但是出现了一个意想不到的问题。我应该如何处理这个错误信息?我不知道这个错误是什么。我不知道该怎么办,因为即使搜索后它也没有出现。我做了

z= model.addVar(lb=-GRB.INFINITY)
    model.addConstr(z==y[i]-R*p[i])
    model.addGenConstrAbs(E_abs[i],z,"absConstr")
    model.addConstr(p[i]*p[i]*E[i]==(p[i]-E_abs[i])*(p[i]-E_abs[i]),name='Satisfaction1(%s)' %i)

之后,发生了这种情况。我认为abs是Var。请帮我。

标签: pythonoptimizationvargurobi

解决方案


推荐阅读