Python3.5遗传算法循环

2024-05-23 15:16:32 发布

您现在位置:Python中文网/ 问答频道 /正文

from pylab import *
import numpy as np
import sys
def initial():
    generation = [0,0,1,1,1,1,1,1,1,0,0,0,0,0]
    generation = generation
    return generation
def fitness(flag):
    global transfer
    transfer = []
    newgeneration1 = pairing()
    scores = [1,2,3,7,6,5,3]
    if flag < 1:
        generation = initial()
    else:
        generation = newgeneration1
    transfer.append(generation)
    transfer.append(scores)
    print(transfer)
    return transfer
def pairing():
    transfer = fitness(i)
    scores = transfer[1]
    generation1 = transfer[0]
    newgeneration = [1,0,1,0,0,0,0,0,1,0,1,1,1,1]
    return newgeneration

initial()
for i in range(3):
   fitness(i)
   pairing()
   if i == 3:
      scores = fitness(i)
      print("The following is the final generation: ")
      print(pairing(i-1))
      print("Here are the scores: ")
      print(scores)
      sys.exit()

上面是我在Python3.5中的遗传算法代码的简化版本,当我运行这个时,我得到一个错误,说:超过了最大递归深度,我试图让它做一次初始函数,然后在适应度和配对之间循环一定次数的迭代,问题是,pairing()创建新一代,fitness需要获取新一代并确定其适合度,然后它将其发送到pairing,然后创建另一个新一代..等等。你明白了。提前感谢您的帮助!你知道吗


Tags: importreturnifdefsysinitialgenerationtransfer
1条回答
网友
1楼 · 发布于 2024-05-23 15:16:32

问题是:

让我们来看看你的程序。。。你知道吗

  • 首先调用initial()
  • 下一步调用fitness(i)
  • fitness函数中调用paring
  • paring函数中调用fitness
  • fitness函数中调用paring。。。。你知道吗

这里有一个无限循环,因为fitnessparing一直在互相调用

解决方案如下:

def pairing():
    global transfer # transfer is a global variable, you don't need to call a function to get it
    #transfer = fitness(i)
    #scores = transfer[1] # you've already defined these variables, no need to define them again
    #generation1 = transfer[0]
    newgeneration = [1,0,1,0,0,0,0,0,1,0,1,1,1,1]
    return newgeneration

我已经从你的paring函数中删除了一些不必要的行,程序现在正常工作了

输出如下:

[[0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], [1, 2, 3, 7, 6, 5, 3]]
[[1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1], [1, 2, 3, 7, 6, 5, 3]]
[[1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1], [1, 2, 3, 7, 6, 5, 3]]

相关问题 更多 >