【问题标题】:Gurobi in Python: best way to read csv filePython 中的 Gurobi:读取 csv 文件的最佳方法
【发布时间】:2017-07-05 05:36:29
【问题描述】:

我正在学习如何使用 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

【问题讨论】:

  • 显示my_data的前两行。
  • 1,19.007,35.75,1 2,4.4447,6.0735,2
  • 以代码模式将这两行添加到您的问题中。在评论中使用损坏的格式不太有用。 编辑: 所以我想没有标题?
  • 不(我是新手,正在学习如何使用 stackoverflow,抱歉)
  • 仔细检查您的添加度-b约束。这对我来说没有任何意义! i from loop 未使用,因此您正在执行相同的操作 n 次。 j 可能未定义...

标签: python python-2.7 csv gurobi


【解决方案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]

【讨论】:

    【解决方案2】:

    尽管这个问题得到了解答,但对于正在寻找读取 csv 文件的好方法的未来访问者来说,必须提到 pandas:

    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
    

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多