URN Logo
UNIX Resources » Linux » China Linux Forum » Python 编 程 » 2 » 请大家帮我看看这个函数为什么运行以后为什么对参数没有起作用~谢谢
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
请大家帮我看看这个函数为什么运行以后为什么对参数没有起作用~谢谢
Author: yaozijian    Posted: 2006-09-21 14:26    Length: 2,344 byte(s)
[Original] [Print] [Top]
是这样,想写一个类似于遗传算法的code,其中有一个交叉和变异(crossover&mutate)的部分,而个体是二维0,1数组,用下面的makeArray(1,0)生成:

def makeArray(a, b):
ROW = 18
COL = 20
A_PERC = .9
B_PERC = .1
total = ROW * COL
tempList = [a] * int(total * A_PERC) + * int(total * B_PERC)
random.shuffle(tempList)
return [tempList[COL*i:COL*i+COL] for i in range(ROW)]

下面的一段code中,前面三个bit_crossvoer(a,b),chromosome_crossover(a,b)和mutate(a)都是为第四个mate(A)所调用的,其中A是将n个个体(就是由makeArray(1,0)产生的n个二维数组)组成的list(感觉这样比较方便)。但是运行以后,唯一的变化就是将A中的元素颠倒了一个顺序放到了Children中,而并没有进行crossover和mutate,实在想不出来是怎么回事,请大家帮我看看吧~

def bit_crossover(a,b):
crossover_point = random.randint(0,19)
if random.random() <= 0.7:
c = a[:crossover_point]+b[crossover_point:]
d = b[:crossover_point]+a[crossover_point:]
a = c
b = d
return a, b

def chromosome_crossover(a,b):
for i in range(len(a)):
a[i], b[i] = bit_crossover(a[i],b[i])
def mutate(a):
for i in range(len(a)):
for j in range(len(a[i])):
if random.random() <= 0.001:
if a[i][j] == 1:
a[i][j] = 0
else:
a[i][j] = 1
return a

def mate(A):
global Children
Children = []
for i in range(len(A)/2):
B = random.sample(A,2)
for j in range(2):
A.__delitem__(A.index(B[j]))
chromosome_crossover(B[0],B[1])
mutate(B[0])
mutate(B[1])
Children.extend(B)

举个例子:
a1,a2,a3,a4 = GA.makeArray(1,0),GA.makeArray(1,0),GA.makeArray(1,0),GA.makeArray(1,0)
A = [a1,a2,a3,a4]
mate(A)
运行以后,Children[0]总会和a1-a4中的一个相同,Children[1],Children[2],Children[3]也是一样。并没有进行crossover和mutate,实在想不出来为什么了。

对不起,不知道为什么这里发贴code中的空格显示不出,我把code放到附件里面了。
--
Attached file: 626377-GA.rar
[Original] [Print] [Top]
« Previous thread
搞不明白为什么python会这样??
Python 编 程
2
Next thread »
英国软件公司招聘Python和JavaScript程序员
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 04:10:52, cost 0.04905104637146 ms.