Python中的Gurobi:阅读csv文件的最佳方式

时间:2017-06-07 19:58:54

标签: python python-2.7 csv gurobi

我正在学习如何使用Python解决Gurobi中的组合优化问题。我想知道读取csv文件以将数据用作模型参数的最佳选项是什么。我正在使用'genfromtxt'来读取csv文件,但是我在使用它进行约束构建时遇到了困难(Gurobi不支持这种类型 - 请参阅错误)。

这里是我的代码和错误消息,my_data由4列组成:节点索引,x坐标,y坐标和最大度数。

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

前两行数据

1,19.007,35.75,1
2,4.4447,6.0735,2

2 个答案:

答案 0 :(得分:1)

实际上这是索引而不是数据类型的问题。在代码中:

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

应使用vars.sum('*',i)代替vars.sum('*',j)my_data[i,3]代替my_data[:,3]

答案 1 :(得分:0)

即使回答了这个问题,对于正在寻找阅读csv文件的好方法的未来访问者,必须提到大熊猫:

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