2017-06-07 6 views
0

Ich lerne, wie kombinatorische Optimierungsprobleme in Gurobi mit Python lösen. Ich würde gerne wissen, was die beste Möglichkeit ist, eine CSV-Datei zu lesen, um die Daten als Modellparameter zu verwenden. Ich benutze 'genfromtxt', um die CSV-Datei zu lesen, aber ich habe Schwierigkeiten, sie für die Constraint-Konstruktion zu verwenden (Gurobi unterstützt diesen Typ nicht - siehe Fehler).Gurobi in Python: beste Möglichkeit, CSV-Datei zu lesen

Hier mein Code und Fehlermeldung, my_data besteht aus 4 Spalten: Knotenindex, x-Koordinate, y-Koordinate und maximalen Grad.

from gurobipy import * 
from numpy import genfromtxt 
import math 

# Read data from csv file 
my_data = genfromtxt('prob25.csv', delimiter=',') 

# Number of vertices 
n = len(my_data) 

# Function to calculate euclidean distancces 
dist = {(i,j) : 
    math.sqrt(sum((my_data[i][k]-my_data[j][k])**2 for k in [1,2])) 
    for i in range(n) for j in range(i)} 

# Create a new model 
m = Model("dcstNarula") 

# Create variables 

vars = m.addVars(dist.keys(), obj=dist, vtype=GRB.BINARY, name='e') 
for i,j in vars.keys(): 
    vars[j,i] = vars[i,j] # edge in opposite direction 

m.update() 

# Add degree-b constraint 
m.addConstrs((vars.sum('*',j) <= my_data[:,3] 
      for i in range(n)), name='degree') 

GurobiError: Unsupported type (<type 'numpy.ndarray'>) for LinExpr addition argument 

Die ersten zwei Zeilen von Daten

1,19.007,35.75,1 
2,4.4447,6.0735,2 
+0

Zeigen Sie die ersten beiden Zeilen von '' 'my_data'''. – sascha

+0

1,19.007,35.75,1 2,4,4447,6,0735,2 –

+0

Fügen Sie diese beiden Zeilen im Code-Modus zu Ihrer Frage hinzu. Es ist weniger nützlich mit gebrochenem Format innerhalb eines Kommentars. ** Edit: ** also keine Überschrift, nehme ich an? – sascha

Antwort

1

Eigentlich war es ein Problem der Indizierung statt Datentyp. Im Code:

# Add degree-b constraint 
m.addConstrs((vars.sum('*',j) <= my_data[:,3] 
     for i in range(n)), name='degree') 

Es sollte für zukünftige Besucher, die auf der Suche nach guten Möglichkeiten vars.sum('*',i) statt vars.sum('*',j) und my_data[i,3] statt my_data[:,3]

0

Auch wenn diese Frage beantwortet wird, verwendet werden, um eine CSV-Datei zu lesen, Pandas müssen erwähnt werden:

import pandas as pd 
df = pd.read_csv('prob25.csv', header=None, index_col=0, names=['x', 'y', 'idx']) 
df 
     x  y idx 
1 19.0070 35.7500 1 
2 4.4447 6.0735 2 
Verwandte Themen