Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何控制嵌套if语句中的流?_Python - Fatal编程技术网

Python 如何控制嵌套if语句中的流?

Python 如何控制嵌套if语句中的流?,python,Python,我正在编程Clarke和Wright的储蓄算法来设计从一个仓库到一组客户的车辆路线。现在,如果不满足任何条件,代码就会被卡在最后的嵌套if语句中。我想要的是,如果没有一个条件得到满足,那么代码应该跳出第二个for循环。然后,返回到第一个for循环,找到用于启动新路线的客户对 我试过一些“中断”和“继续”的方法,但都没能奏效 while(不是(所有客户都考虑过(客户服务)): #选择未提供服务的最大储蓄客户 对于客户对中的c: 如果(isServed(c[0])==False,isServed(c

我正在编程Clarke和Wright的储蓄算法来设计从一个仓库到一组客户的车辆路线。现在,如果不满足任何条件,代码就会被卡在最后的嵌套if语句中。我想要的是,如果没有一个条件得到满足,那么代码应该跳出第二个for循环。然后,返回到第一个for循环,找到用于启动新路线的客户对

我试过一些“中断”和“继续”的方法,但都没能奏效

while(不是(所有客户都考虑过(客户服务)):
#选择未提供服务的最大储蓄客户
对于客户对中的c:
如果(isServed(c[0])==False,isServed(c[1])==False)和check1(c[0])和check2(c[0],c[1]):
已服务(c[0])
已服务(c[1])
idx+=1
路由[idx]=([c[0],c[1]])
打印(“首字母”,c[0],c[1])
打破
#查找位于上一个路由的开始或结束处的cust
对于客户对中的c:
res=inPrevious(c[0],路由[idx])
如果res==0且capacityValid(路由[idx],c[1])和(IServed(c[1])==false)并检查(路由[idx],c[1]):
已服务(c[1])
路由[idx]。追加(c[1])
打印(“附加”,c[1])
elif res==1,capacityValid(路由[idx],c[1])和(IServed(c[1])==False),并检查(c[1])和路由[idx]中r的所有(测试(路由[idx],r,c[1]):
已服务(c[1])
路由[idx]。插入(0,c[1])
打印(“插入”,c[1])
elif res==-1:
res=inPrevious(c[1],routes[idx])
如果res==0且capacityValid(路由[idx],c[0])和(IServed(c[0])==False)并检查(路由[idx],c[0]):
已服务(c[0])
路由[idx]。追加(c[0])
打印(“附录2”,c[0])
elif res==1,capacityValid(路由[idx],c[0])和(IServed(c[0])==False),并检查(c[0])和路由[idx]中r的所有(测试(路由[idx],r,c[0]):
已服务(c[0])
路由[idx]。插入(0,c[0])
打印(“插入2”,c[0])

我认为您的实现中存在一些问题。该算法规定,该对中的任何一个节点都不应位于其路由的内部,即它们都应仍然连接到车辆段。但是,在第二个循环的开头,您没有检查这一点。算法的结构在代码中并不明显。下面是一些伪代码,让您开始:

savings = generate_savings(cust_pairs)

for pair in ordered(savings):
    res1 = isMidpoint(pair.cust1)
    res2 = isMidpoint(pair.cust2)
    if res1 or res2:
        continue
    elif satisfies_conditions(pair):
        merge_routes(routes(pair))

只有一个for循环,它只通过一次节省,因为它们不会改变,并且总是积极的。不需要
而需要
,也不需要中断。

当然,您应该在
if
语句中添加
else
条件,以说明错误。如果以上都没有,那么抛出异常(如果适用),或者,在您的情况下,返回到第一个周期。第二个
for
循环将自行结束,返回到在
条件下评估
,并执行第一个
for
循环。我相信,也许你的代码被卡住了,因为你没有满足
标准的情侣了,而
标准也不符合。事实上,关于最后
的事情应该是最好的选择。但是,请编辑您的代码,使其与您使用的代码完全相同,因为当前第一行根本没有标记为代码,因此如果所有缩进都设置正确,则会产生疑问;或者更好:把它全部删减为Yes,我知道在所有if语句下面应该有一个else语句,但我不知道在那里写什么。我认为,当代码在第一个for循环中找到一个初始客户对以开始路由时,代码会被卡住,如果没有满足条件的未服务客户对,则代码会被卡住。因此,我正在寻找一些代码,这些代码会触发使用第一个for循环启动新路由。@Marc我们无法执行您的代码片段,也无法真正解释它。请将其缩减为适当的@Marc,在
中添加一些打印,而
用于
循环。这会让你知道发生了什么。然后,无论如何,提供MRE(这也意味着一个
cust_pairs
和all…)的示例。我不完全明白您的意思,但我使用以下方法检查客户对中的一个节点是否已经存在于现有路由中:
def inPrevious(new,existing):start=existing[0]end=existing[len(existing)-1]如果new==start:return 1 elif new==end:return 0 else:return-1
Yes,我看到您使用了
inPrevious
。但您只检查“上次创建的路由”
路由[idx]
,而不是所有路由,您可以通过这种方式创建分支路由。我已经开始自己实现该算法,并编辑了答案,以反映到目前为止我发现的需要。事实证明,控制流结构非常简单。我不明白你所说的
isMidpoint
。我的目的是寻找具有最高节省的客户对,并在容量和时间窗口约束可行的情况下,迭代地将其他具有高节省的客户对添加到路线中。之后,由于驾驶员不必返回车辆段,因此将添加车辆段作为路线的起点。现在的问题是,在某一点上,当前路由中没有剩余具有重叠节点的客户对。我想防止代码被卡住,并在这种情况下启动一个新的路由。