提问人:Agus RC 提问时间:11/7/2023 最后编辑:Agus RC 更新时间:11/7/2023 访问量:51
虽然 python 中的条件在 true 时停止循环
While condition in python doest stop the loop when true
问:
我做了一个循环,一旦列表 U 中没有值,它就需要停止。一旦到达该点,循环就不会停止,并且会给出错误,因为有一个值为 0(最后一个循环中的 len(U))
def ATC(instance,K):
pi=[]
U = [i for i in range(instance.jobs)]
t=0
p= sum(instance.pt) / len(U)
while len(U)!=0:
I=[]
for j in U:
I.append((instance.w[j]/instance.pt[j])*exp(-(max(instance.dd[j]-instance.pt[j]-t,0))/(K*p)))
k = np.argmax(I)
pi.append(U[k])
U.pop(k)
print(U,len(U))
t = instance.Cmax(pi)
p = sum([instance.pt[i] for i in U])/len(U) ################################
obj = instance.SumWjTj(pi)
return pi,obj
这里是循环期间 u 和 len(U) 列表的打印,显示它达到 0,但 while 条件不起作用:
[0, 1, 2, 3, 4, 5, 7, 8, 9] 9
[0, 1, 2, 4, 5, 7, 8, 9] 8
[0, 1, 4, 5, 7, 8, 9] 7
[0, 1, 4, 7, 8, 9] 6
[0, 1, 4, 7, 9] 5
[0, 1, 4, 7] 4
[1, 4, 7] 3
[4, 7] 2
[7] 1
[] 0
使用有效,但我不明白为什么 while 还不够If len(U)!=0: p = sum([instance.pt[i] for i in U])/len(U)
答:
2赞
Matt Pitkin
11/7/2023
#1
循环不会在零时立即退出,并将继续完成循环的当前迭代。因此,在您的情况下,一旦为空,它仍将尝试执行以下行:len(U)
U
t = instance.Cmax(pi)
p = sum([instance.pt[i] for i in U])/len(U) ################################
obj = instance.SumWjTj(pi)
在它重新测试并退出之前。所以,在计算时,它会尝试除以零,我认为这是你得到的错误。len(U)!=0
p
相反,您可以在循环中放置一个 break 子句,例如:
while True:
I=[]
for j in U:
I.append((instance.w[j]/instance.pt[j])*exp(-(max(instance.dd[j]-instance.pt[j]-t,0))/(K*p)))
k = np.argmax(I)
pi.append(U[k])
U.pop(k)
print(U,len(U))
# break out the loop here
if len(U) == 0:
break
t = instance.Cmax(pi)
p = sum([instance.pt[i] for i in U])/len(U) ################################
obj = instance.SumWjTj(pi)
评论