当我将函数作为参数传递时,函数不会采用列表的所有值
A function does not take all values of a list when I pass it as a parameter
我有两个列表 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)。我想使用这个列表来迭代,但是当我 运行 它时,我可以正确地将这个列表作为参数传递。当我手动传递列表并将自身求解到最优解时,模型 运行 是正确的,但这不是我的想法。我认为我的问题在于我用来将列表作为参数传递的方式。如果有人可以帮助我,那就太好了。谢谢并提前。
顺便说一句,我已经尝试过更改列表的名称,以及我在网上找到的所有技巧。请帮我。 :(
我想你在这里拼错了
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 个参数你只传递了一个
我有两个列表 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)。我想使用这个列表来迭代,但是当我 运行 它时,我可以正确地将这个列表作为参数传递。当我手动传递列表并将自身求解到最优解时,模型 运行 是正确的,但这不是我的想法。我认为我的问题在于我用来将列表作为参数传递的方式。如果有人可以帮助我,那就太好了。谢谢并提前。
顺便说一句,我已经尝试过更改列表的名称,以及我在网上找到的所有技巧。请帮我。 :(
我想你在这里拼错了
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 个参数你只传递了一个