Написание ограничения оптимизации в Python - PullRequest
0 голосов
/ 24 ноября 2018

Я новичок в оптимизации с 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))
...