当我将函数作为参数传递时,函数不会采用列表的所有值

时间:2018-07-19 08:21:27

标签: python list traveling-salesman gurobi

我有两个列表l = [0,1,7,10]和ll = [1,7,10],我想将此列表用作函数的参数,该函数使用此列表ll和l,在“ for”循环中进行迭代。当我传递列表时,我的函数未采用所有元素,特别是未采用列表“ l”中的0值。我是python的新手,我仍在学习函数。 Cnew只是另一个参数(矩阵),可以正确传递。我的代码是下一个:

import numpy as np
from gurobipy import *

l=[0,1,7,10]
ll=[1,7,10]



def TSP_ruteo(Cnew,l,ll):
    nodos=l
    nodos2=ll                            
    
    model=Model('TSP_ruteo')                           #NOMBRE DEL MODELO.
    model.ModelSense=GRB.MINIMIZE                 OPTIMIZACIÓN.
    x,u={},{}                                    
    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 nodos2:
        u[i]=model.addVar(vtype=GRB.INTEGER,lb=1.0,ub=len(Cnew)-1,name="u[%s]"%(i))
    model.update()
    costo=quicksum((Cnew[i,j]*x[i,j] for i in nodos for j in nodos))
    model.setObjective(costo)                    
    model.update()

    for j in nodos:
         model.addConstr(quicksum(x[i,j] for i in nodos)==1.0,name="R1[%s]"%(j))
                                                
    for i in nodos:
         model.addConstr(quicksum(x[i,j] for j in nodos)==1.0,name="R2[%s]"%(i))
                                                
    for i in nodos2:
        for j in nodos2:
            if i!=j:
                model.addConstr(u[i]-u[j]+(len(Cnew)-1)*x[i,j]<=len(Cnew)-2,name="R3[%s][%s]"%(i,j))
            
         
            
   
    model.update()
    model.__data=x,u
    return model

model=TSP_ruteo(Cnew)
model.optimize()
x,u=model.__data
print("")
print("VALOR OPTIMO TSP= ", model.ObjVal)
edges2 = [(i,j) for (i,j) in x if x[i,j].X == 1]
model.write('lalalalala.lp')
nonzeros=model.printAttr('x')
print("Arcos utilizados:", edges2)
print("")

我的代码使用求解器Gurobi解决了旅行商问题(TSP)。我想使用此列表进行迭代,但是当我运行它时,可以正确地将此列表作为参数传递。当我手动传递列表并将其自身求解为最佳解决方案时,该模型运行正确,但这不是主意。我认为我的问题在于我用来传递列表作为参数的方式。如果有人可以帮助我,那就太好了。谢谢,提前。

顺便说一句,我已经尝试过更改列表的名称,以及所有在网上找到的技巧。请帮我。 :(

1 个答案:

答案 0 :(得分:0)

我认为您在这里拼错了

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

应该是

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

请参阅第一个i循环应具有nodos,但您将它键入为nodos2

您应正确命名变量

您的函数需要3个参数,而您只传递了一个参数