Я новичок в оптимизации с Python и Gurobi.Я пытался закодировать ограничение
f_{s}^{E}=x_{i}\sum_{1}^{i-1}ALW_{js},\forall s\in S,\forall i={1,2,...,\frac{c(c-1)}{2}}
, где A_ {s} ^ {E} и x_ {i} являются переменными.Чтобы вычислить ALW_ {js}, нам нужно прочитать верхний треугольник матрицы расстояний и затем отсортировать расстояния d_ {ij} для i, j \ inC и j> i по убыванию.Отсортированный результат может быть представлен следующим образом:
d_{1} \geqslant d_{2} \geqslant ... \geqslant d_{\frac{c(c-1)}{2}}
Где d_ {1} = max {d_ {ij}} и d _ {\ frac {c (c-1)} {2} = min{D_ {IJ}}.Каждое отсортированное расстояние выше, означающее d_ {1}, d_ {2}, ..., d _ {\ frac {c (c-1)} {2}}, имеет соответствующее значение в сценарии s
ALN_{ijs}=(1-0.05)(1-0.72) \max \left \{ AN_{is},AN{js} \right \}, \forall s\in S,\forall i,j\in C and j>i
Где AN_ {is} читается из файла.ALN_ {ijs} может быть написано
ALW_{js}, \forall s\in S,\forall i={1,2,...,\frac{c(c-1)}{2}}
Мои коды для этого приведены ниже.Gurobi предлагает решение, но оно говорит, что ограничение
f_{s}^{E}=x_{i}\sum_{1}^{i-1}ALW_{js},\forall s\in S,\forall i={1,2,...,\frac{c(c-1)}{2}}
является квадратичным, что на самом деле не так.Буду признателен, если кто-нибудь поможет мне.
x={}
fE={}
for s in range (S):
fE[s]=Z.addVar(lb=0, vtype=GRB.CONTINUOUS, name='fE%s'%(s))
DtN={}
with open('Distances.csv', 'rU') as file:
table = [row for row in csv.reader(file)]
for i in range (C):
for j in range (C):
if j>i:
DtN[i,j]=round(-1*float(table[i][j]),2)
SortDis=[]
SortDisKey=[]
for key, value in sorted(DtN.iteritems(), key=lambda (k,v): (v,k)):
SortDis.append(abs(value))
SortDisKey.append(key)
for i in range (len(DtN)):
x[i]=Z.addVar(lb=0, vtype=GRB.BINARY, name='x%s'%(i))
with open('Feed1.txt', 'r') as Fee:
for i in range(C):
Feed= round(float(Fee.readline()),3)
for s in L11:
AN[i,s]=round(Feed/10**6,9)
for s in L12:
AN[i,s] = round(Feed*1.28/10**6,9)
for s in L13:
AN[i,s] = round(Feed*0.95/10**6,9)
ALN={}
for s in range (S):
ALN[s]={}
for s in range(S):
for i in range(C):
for j in range(C):
if j>i:
ALN[s][i,j]=max((1-0.05)*(1-0.72)*AN[i,s],(1-0.05)*(1-0.72)*AN[j,s])
ALW={}
for s in range (S):
ALW[s]=[]
for s in range (S):
for j in SortDisKey:
ALW[s].append(ALN[s][j])
for s in range (S):
for i in range (len(DtN)):
Z.addConstr(fE[s]>=(x[i]*(quicksum(ALW[s][j] for j in range (0,i-1)))), name='N3%s%s'%(s,i))