2014-10-07 14 views
-3
def evolve(): 
    global pop,fvals 
    for g in xrange(0,gmax):  
     for i in xrange(0,NP):   
      while 1: 
       r1=random.randint(0,NP-1) 
       if r1!=i:   
        break   
      while 1: 
       r2=random.randint(0,NP-1) 
       if r2!=r1 and r2!=i: 
        break 
      while 1: 
       r3=random.randint(0,NP-1) 
       if r3!=r2 and r3!=r1 and r3!=i: 
        break 
      U=[] 
      V=[] 
      for j in xrange(0,dim):  
        U.insert(j,(pop[r3])[j] + F*((pop[r1])[j]-(pop[r2])[j]))      
      jrand = floor(int(rand1()*dim)) 
      for j in xrange(0,dim): 
     if rand1()<=cr or j==jrand: 
        U.insert(j,(pop[r3])[j] + F*((pop[r1])[j]-(pop[r2])[j])) 
       else: 
        U.insert(j,(pop[i])[j])   
      V.insert(i,U)       
     fvals2.insert(i,fun(U)) 
     x=open("x.out","w")   
     for i in xrange(NP): 
      for j in xrange(dim): 
       print i 
      print j 
       x.write(str((V[i])[j]) + '\t') 
      x.write(str(fvals2[i])) 
      x.write('\n') 

虽然执行此代码块示出了一个错误:在exceuting下面的代码获得以下错误:索引超出范围

x.write(str((V[i])[j]) + '\t') 
IndexError: list index out of range 

在这里,我已经采取gmax=5dim=2NP=5

+0

列表“V”似乎少于'NP'元素。要么在该循环中更改'i'范围,要么找出为什么'V'具有太少的元素。 – chepner 2014-10-07 14:41:45

回答

0

您正在将V设置为[],因为您的每个for n in xrange(0,NP)循环都丢失了以前的任何值。这意味着当你写这个文件时,V只有一个值(最多),这就是为什么当你试图从中读取xrange(NP)值时,你会得到一个IndexError。您可能想要在该循环之外初始化V

你也错过了if rand1()<=cr or j==rand的一些缩进,但是我猜这发生在将代码放入帖子时发生,或者在编写文件时可能没有足够的运行时间来获得IndexError。

这且不说,请考虑以下因素:

  1. 请与实际的名称命名变量 - 所有这些单字母和字母数字组合使代码真的很难看。
  2. 您也可以考虑将这些嵌套操作中的一部分分解为单独的函数,这也可以提高可读性。
  3. 完成写操作后,您并未关闭输出文件 - 您可能希望将x.close()行添加到末尾,或在with open('x.out','w') as x:块中完成所有写入。您还将覆盖每个for g in xrange(0,gmax)的循环上的该文件,因此您可能还想将其移至该循环之外。