我的问题如下:当我使用某些Gurobi函数时,例如quicksum(),我总是收到这样的警告:“'quicksum'可能是未定义的,或者是从开始导入时定义的:gurobipy。以下代码可以正确解决TSP。



import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
import networkx as nx
from gurobipy import *
from openpyxl import Workbook
import xlrd
import networkx as nx
print("")
print("TRAVELING SALESMAN PROBLEM")
print("---------------------------------------------------------------------")
print("")
wb = Workbook()
ws = wb.active
book = xlrd.open_workbook('TSP.xlsx')            #LECTURA DE PARÁMETROS.
sheet = book.sheet_by_name("C")
C=[[sheet.cell_value(r,c) for c in range(sheet.ncols)] for r in range(sheet.nrows)]
C=np.matrix(C)
print("")
print("MATRIZ DE DISTANCIAS")
print("")
print(C)
def TSP(C):
    nodos=range(len(C))
    nodos1=range(1,len(C),1)                      #CONJUNTOS.

    model=Model('TSP')                           #NOMBRE DEL MODELO.
    model.ModelSense=GRB.MINIMIZE                #SENTIDO DE OPTIMIZACIÓN.
    x,u={},{}                                    #VARIABLES - MATRIZ DE ASIGNACIÓN DE RUTAS.

    for i in nodos:
        for j in nodos:
            x[i,j]=model.addVar(vtype=GRB.BINARY,name="x[%s][%s]"%(i,j))

    for i in nodos1:
        u[i]=model.addVar(vtype=GRB.INTEGER,lb=1.0,ub=len(C)-1,name="u[%s]"%(i))
    model.update()
    costo=quicksum((C[i,j]*x[i,j] for i in nodos for j in nodos))
    model.setObjective(costo)                   #FUNCIÓN OBJETIVO
    model.update()

    for j in nodos:
         model.addConstr(quicksum(x[i,j] for i in nodos)==1.0,name="R1[%s]"%(j))
                                               #CONJUNTO 1 DE RESTRICCIONES.
    for i in nodos:
         model.addConstr(quicksum(x[i,j] for j in nodos)==1.0,name="R2[%s]"%(i))
                                                #CONJUNTO 2 DE RESTRICCIONES.

    for i in nodos1:
        for j in nodos1:
            if i!=j:
                model.addConstr(u[i]-u[j]+(len(C)-1)*x[i,j]<=len(C)-2,name="R3[%s][%s]"%(i,j))




    model.update()
    model.__data=x,u
    return model

model=TSP(C)
model.optimize()
x,u=model.__data
print("")
print("VALOR OPTIMO TSP= ", model.ObjVal)
edges = [(i,j) for (i,j) in x if x[i,j].X == 1]
model.write('ruteo.lp')
print(u)
print("Arcos utilizados:", edges)
print("")
x_solucion=np.zeros((len(C),len(C)))
for a in range(len(C)):
    for b in range(len(C)):
        x_solucion[a,b]=x[a,b].x
print(x_solucion)
print("")





每次我使用quicksum()时,都会收到以下警告:

quicksum() warning
这是我使用求解器Gurobi时经常遇到的问题。但是我总是可以正确地计算和求解模型,但是这困扰着我,我认为这是不正常的。有任何想法吗?。在此先感谢您的帮助。

最佳答案

似乎在警告您这来自from xxx import *语句,这通常是不好的做法。尝试导入您显式使用的功能,我认为这应该消失。

from gurobipy import quicksum

关于python - 某些Gurobi-python函数无法正确识别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52597614/

10-12 22:54