1

Ich benutze Gurobi 7, um meine MIP zu lösen. Ich habe mehrere verschiedene Variablen. Ich interessiere mich jedoch speziell für zwei davon, nämlich "x" und "y". Für den Hinweis, ich meinen Code gebe, das zeigt, wie ich Variablen x und y in den Solver hinzugefügt:Gurobi Optimierung Ergebnis Schreiben in Csv Datei

# Creating Variables 
x = {} 
y = {} 

# Adding Variables 
for i in range(I): 
    x[i+1,P[i]-d[0]] = m.addVar(vtype=GRB.BINARY, name="x%s" % str([i+1,P[i]-d[0]])) 
    x[i+1,P[i]] = m.addVar(vtype=GRB.BINARY, name="x%s" % str([i+1,P[i]])) 
for i in range(I): 
    for k in range(len(rangevalue)): 
     y[i+1, rangevalue[k] - E[i]] = m.addVar(vtype=GRB.BINARY, 
           name="y%s" % str([i+1, rangevalue[k] - E[i]])) 

Auch wenn der obige Code nicht wirklich Sinn machen kann, wollte ich es nur um zu zeigen, falls Sie kann es für mein Problem verwenden.

Nachdem ich das Problem zu lösen, erhalte ich folgende Ergebnisse:

m.printAttr('X')

Variable   X 
------------------------- 
    x[1, 3]   1 
sigmaminus[1]   874 
    x[2, 2]   1 
sigmaminus[2]   1010 
    x[3, 2]   1 
sigmaminus[3]   1945 
    x[4, 4]   1 
sigmaplus[4]   75 
    x[5, 4]   1 
sigmaminus[5]   1153 
    x[6, 5]   1 
sigmaminus[6]   280 
    x[7, 3]   1 
sigmaplus[7]   1138 
    x[8, 2]   1 
sigmaplus[8]   538 
    x[9, 1]   1 
sigmaplus[9]   2432 
    x[10, 5]   1 
sigmaminus[10]   480 
    omega[1]   12 
    OMEGA[1]   12 
    omega[2]   9 
    OMEGA[2]   12 
    omega[3]   8 
    OMEGA[3]   9 
    omega[4]   8 
    OMEGA[4]   8 
    OMEGA[5]   8 
    y[1, 2]   1 
    y[2, 9]   1 
    y[3, 5]   1 
    y[4, 6]   1 
    y[5, 4]   1 
    y[6, 6]   1 
    y[7, 3]   1 
    y[8, 11]   1 
    y[9, 8]   1 
    y[10, 1]   1 
    phiplus[6]   1 
phiminus[7]   1 
phiminus[10]   1 

Ich möchte speziell Variablen x und y mit ihren Indizes angezeigt werden soll. Andere Variablen sind nicht notwendig. Meine Frage ist, wie kann ich diese Ergebnisse in eine CSV-Datei in einer Spalte wie folgt schreiben?

x[1,3] 
x[2,2] 
x[3,2] 
. 
. 
. 
x[10,5] 
y[1,2] 
y[2,9] 
y[3,5] 
. 
. 
. 
y[10,1] 

Ich brauche nicht ihren entsprechenden Wert, der nur "1" sein kann, da sie binäre Variablen sind. Ich muss nur die Variablen schreiben, die den Wert "1" haben.

Antwort

1

Ich würde etwas in dieser Richtung tun:

import csv 

if m.SolCount == 0: 
    print("Model has no solution") 
    exit(1) 

var_names = []  

for var in m.getVars(): 
    # Or use list comprehensions instead 
    if 'x' == str(var.VarName[0]) and var.X > 0.1: 
     var_names.append(var.VarName) 

# Write to csv 
with open('out.csv', 'wb') as myfile: 
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) 
    wr.writerows(var_names) 

Ich hoffe, das hilft. Ich werde diesen Ausschnitt ein wenig später testen.Update: funktioniert wie vorgesehen.

+0

Ich verstehe, was Sie tun, aber es funktioniert wirklich nicht in meinem Fall. Nun, ich überprüfe die Machbarkeit; Das Problem ist machbar und gibt eine Antwort. Sollte ich irgendwas an var.VarName [0] ändern? – user8028576

+0

Ich habe gerade meinen Code überprüft und es scheint, dass ich 'str (var.VarName [0])' verwende. Könntest du es versuchen? Stellen Sie sicher, Sie vergleichen mit einem Kleinbuchstaben "x" – Ioannis

+0

mit diesem: 'wr.writerows (zip (var_names))', es funktioniert perfekt. Vielen Dank! – user8028576