看知乎看到可以用python做哪些有趣的事情,有一个是用python实现遗传算法,将N个三角形组合成为一张图片 参考(
http://www.zhihu.com/question/21395276)我现在想自己实现一个,看了看遗传算法怎么回事,也没去看那个回答里的人的代码是怎么实现的
自己这几天从装PIL到写了点东西(
https://github.com/pikeszfish/GA_engine)但现在好像效果不是那么好,不知道有没有人愿意能够去看看。
算法思路:
1、初始化种群,设M个,然后每个有N个基因
2、将N个基因全部合成到一张图片上,分别计算M个个体与待匹配的图片的相似度。
3、自然选择,除去相似度最低的a个,将相似度最高的2*a个随机复制。(模拟适者生存,基因好的容易将基因遗传给后代)(这里a自己定,2*a也只是我的设想)
4、交叉,两两匹配(随机),进行基因组互换。(因为是三角形,则每个基因是由三个点,还有RGBA的颜色组成,(x1,y1,x2,y2,x3,y3,g,b,a,r),所以随机选择10个基因点)
5、变异,按照固定每代遗传变异数或者比率进行变异
6、重复2,直到一定数量的遗传代数
下面是我的疑惑点:
1、各个参数选择是否有更好的?
2、交叉过程,因为基因是(x1,y1,x2,y2,x3,y3,g,b,a,r),目前我选择的交叉是每一个点都进行交叉,而其实(x1,y1)对应的其实是A点,我在想是否还是根据 (A点,B点,C点,颜色)进行交叉来的更好?还是直接(基因)交叉
3、透明度是否需要固定住? 因为有的时候合成到最后,如果有一张图片透明度过低,就完全覆盖了下面 (这我自己解决去)
4、变异的概率,无论控制具体数目还是概率,还是不好把握变异数量多少才好
5、生成的三角形,在(255, 255)大小的图片里面,直线会有锯齿,感觉是不是图片画大一点会好一些?还是PIL or pillow有更好的API?or args?
6、效率,目前一代需要0.8秒~0.9秒,太慢了。。。
7、写python一直以来的疑惑,我如果就这么个想法,需要写成OOP么? 现在一堆function,都不是method。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/128060
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.