如何重复调用Python函数直至其返回值与上一次返回值相等
解决方案
情况1:函数返回新种群+最优值(推荐,逻辑更清晰)
首先调整population_gen函数,同时返回迭代后的新种群和当前最优值:
def population_gen(P): # 此处保留你原有生成新种群、计算fittest的逻辑 ... return new_P, fittest
循环实现代码:
previous_fittest = None current_pop = Pop # 你的初始种群 gen_count = 0 max_gen_limit = 1000 # 建议保留最大迭代上限,避免不收敛时程序卡死 while True: current_pop, current_fittest = population_gen(current_pop) gen_count += 1 # 首次迭代无历史值,直接存储后进入下一轮 if previous_fittest is None: previous_fittest = current_fittest continue # 两次最优值相等时停止循环 if current_fittest == previous_fittest: print(f"迭代终止,共运行{gen_count}代,最终最优值:{current_fittest}") break # 更新历史最优值用于下一轮对比 previous_fittest = current_fittest # 触发最大迭代上限时强制停止 if gen_count >= max_gen_limit: print(f"已达到最大迭代次数{max_gen_limit},强制停止") break
情况2:函数直接修改传入的种群对象
如果你的population_gen已经是直接修改传入的种群(比如种群是列表类可变对象,函数内修改会同步到外部),不需要返回新种群,可使用以下版本:
函数保持原有返回逻辑即可:
def population_gen(P): # 原有逻辑,直接修改P的内容,计算fittest ... return fittest
循环实现代码:
previous_fittest = None current_pop = Pop # 若需保留初始种群可替换为Pop.copy() gen_count = 0 max_gen_limit = 1000 while True: current_fittest = population_gen(current_pop) gen_count += 1 if previous_fittest is None: previous_fittest = current_fittest continue if current_fittest == previous_fittest: print(f"迭代终止,共运行{gen_count}代,最终最优值:{current_fittest}") break previous_fittest = current_fittest if gen_count >= max_gen_limit: print(f"已达到最大迭代次数{max_gen_limit},强制停止") break
注意事项
如果你的fittest是自定义类的实例对象,需要确保类实现了__eq__方法,否则==比较可能无法正确判断值是否相等;如果是数值、字符串等内置类型则无需额外处理。
内容的提问来源于stack exchange,提问作者Sayanta Seth
相关产品推荐
相关产品推荐

