收藏本站 关于我们

配色设计:交互式遗传算法源代码

发布时间:2018-01-08 16:30:47   来源:   人气:0

前言:第027号插件,一个交互式遗传算法(IGA)的开源程序。基于CorelDraw平台,以图案配色为载体。

代码内嵌在CorelDraw的cdr文档中,在在附件内。


这是作者发布的第027号插件,提供了一个供学习使用的交互式遗传算法(IGA)源码。可以对这段不长的代码进行各种改造,完成自己感兴趣的任务。

这个IGA原型跟很多开源算法代码不太一样的是,它可以完成一个真实的任务,即配色设计——你可以把它当成一个“秘密花园”填色游戏的自动版。如果对CorelDraw的VBA足够熟悉的话,可以把配色改成图形设计或更复杂的设计任务,甚至把代码移植到其他支持VBA的平台上,如Solidworks。

选择配色作为任务载体是因为配色实施起来最简单。实际上,这个IGA原型最初是在Solidworks上针对3D参数模型编写的。3D版的 IGA代码我会另找时间整理共享,它比色彩设计要复杂得多,对初始模型的定义有特殊要求,并且需要借助外部数据文档来保存产品模型的进化数据。这些规范化的准备工作可以统称为“编码”——诸般法门做齐后程序才会同意干活。

这个开源插件主要面向编程学习者(特别是设计研究者),所以本文的讲解会啰嗦一些,不像以前只是简单的使用说明了。由于简化了很多内容,这个插件实际上效果不是很好。它只是展示一下IGA是如何运行的,有兴趣研究的人可以继续修改完善。

1.交互式遗传算法简介

交互式遗传算法(Interactive Genetic Algorithms,IGA)是进化算法大家族的一个比较边缘化的小分支。

遗传算法的基本原理是模拟生物种群的优胜劣汰,通过个体的交配繁衍代代演化直至产生最优个体。对设计问题而言,这里的“个体”就是指设计方案了;“交配繁衍”则是指设计方案的参数重组或参数调整(变异),直到出现最佳的参数组合。设计方案的“参数”是个统称,它包含所有可被设计师操作的设计要素,如尺寸、形态、色彩、材质、零部件等等。

本文的IGA代码案例中,设计参数只有一种,即色彩。

说IGA边缘化,是因为自动生成的设计方案的优劣需要人来交互评价(所以叫交互式遗传算法)。一般的遗传算法都是使用某个标准自动计算,不需要人参与,如解方程:评价标准就是方程的等号左右两边差多少,差的越少越好,一点不差就表示等号成立,方程成功解出。但是对设计问题,让程序来判断哪个方案更好很困难,尤其是牵涉到美学之类的主观评价标准。所以需要人的介入。

人进行评价效率自然不会高,所不能像一般的遗传算法进化个成千上万代才出结果。十几代已经够多了,所以效果会打折。因此IGA在某些情况下就是一种不得已退而求其次的选择,效率低就低吧,人的角色不能少。至于效率问题,就得研究其他方法来弥补了。所以IGA的学术论文大部分在讨论如何提高进化效率和进化效果,以及搜索的全面性,以免收敛太快错过了潜在的更好的方案。

IGA的研究文献很多,这里就不多扯了,看懂了这个插件再学会修改,就可以做些自己的东西了。

插件的核心部分约200行。后来为了形成一个完整的插件又补充了一些增加程序稳健性的语句(如判断输入合法性),现在这个程序有500多行。

2.案例简介

插件的工作任务是为CorelDraw的一个图案配色。图案的线稿已经画好,同色区域已合并或群组为一个对象,整个图案是对各色对象再一次群组而成。以下是案例图案(一个图案两种配色):

 

 

 

以下是对配色对象的要求:

1)配色对象必须是一个群组对象,每个子对象一种不同的色彩。所以需要事先把配色方案中的同色子对象群组在一起。以下对象是合法的:

 

   

 

2)群组中不能包含无色对象(即填充模式为No Fill)、位图对象和非单色填充对象(渐变填充、纹样填充等),否则会出错。

3)群组里可填充色彩的子对象数至少应有2个,否则会出错。

4)子对象如果是群组,则里面的子对象应为同色,否则会出错。

其实程序完全可以判断和处理各种非法对象(主要是无法上色的),由于本程序重点关注算法,尽量缩短代码,因此未编写这些处理模块。

3.基本思路

就本文的图案配色任务而言,IGA的具体运行过程如下:

第一步:把用户选择的图案复制若干份,对其中的每一个图案进行随机配色,形成一个方案“种群”;

第二步:用户对种群中的每一个方案打分评价;

第三步:程序根据方案的得分情况进行遗传操作,具体来说,就是得分高的方案有更强的生存时间,而得分低的方案则会死亡,即被清除出种群,但出局之前有一定机会留下自己的后代,这个机会也是根据得分高低来分配的;种群的规模(方案数)维持不变;

第四步:形成新种群,并重复第二步;如此循环,直至找到满意的方案,结束。

4.程序的安装、运行和代码查看

插件程序内嵌在CorelDraw的L06-IGA08.cdr文档中,打开时会自动跳出,如果没有,可查看作者发布的旧文章。

查看和编辑代码可以从宏工具条里的“查看代码”按钮进入宏编辑器。宏工具条如果没在界面上,可以右击按钮区空白处,选中它并显示出来。以下是X3的宏工具条,“查看代码”是左数第二个按钮。

 

 

有些版本的CorelDraw如果没有查看代码按钮或该按钮不可用,可以通过Alt+F11直接调出宏编辑器。

以下是VBA宏编辑器的界面:

 

 

所有可见的程序都列在左侧的边栏里。“可见”是指当前打开的文档中所附的宏代码,或放在指定路径下的.gms程序文档。

我们当前运行的程序是这个:

 

 

上图中L06-IGA08是当前cdr文档的文件名。下面的树形条目即文档中内嵌的宏代码,双击即可打开,代码显示在右侧编辑区。如果宏被加密,则双击时弹出对话框要求输入密码。本程序未加密。

VBA宏编辑器的用法这里就不开班讲课了,可以参考Excel的VBA教程,有很多。插件界面上的按钮、输入框等控件的内容可以自行修改(在右边的编辑区修改),以实现自己的任务目标。

5.流程详解

打开L06-IGA08.cdr自动跳出的界面如图所示。

 

 

IGA的运行流程基本是从上到下,以下按流程顺序逐一介绍各控件(按钮、输入框)的作用:

1) 获取编码按钮

点这个按钮前需要先选中一个设计对象,如果忘记选,会有提示对话框跳出来。设计对象的要求见前面案例简介部分。

这个按钮首先统计需要几种色彩,然后显示在右侧的色彩数显示框里。统计方法很简单,就是查看一下所选对象的群组里有几个子对象。核心代码是这两句:



色彩数显示框里的字体是灰色的,用户不能修改。但这个数字也不是只给用户看看而已,后面一系列操作都会用到它,到时那些程序就会从这个显示框里获取色彩数。

“编码”指的是代表一个方案的所有参数的集合。对于配色方案,假如有7种颜色,它的编码就是7组数据,每组数据中包含一个RGB数组,指示某个区域的色彩。

2) 建立初始种群按钮:Go

这个按钮在执行完获取编码按钮后才变得可用,它的功能是创建一个新页面,然后在上面生成一系列随机的配色方案。方案的数量为“行数×列数”——行列数均由用户输入指定,默认数字都是4,即生成16款新方案。

Go!按钮每次执行产生的配色方案都是不同的,完全随机。下图是一个生成的4×4的初始种群的全貌:



3) 初始得分输入框

这个输入框是在生成初始种群的同时,给每个方案统一赋一个默认的得分值,10分制。程序设置的默认得分是5分,中值,用户可以任意修改这个数字。

初始得分的设置主要是为了减轻用户评价的工作量,因为用户可能只有兴趣给最好的和最差的打分,剩下的懒得再管,就用默认值好了。

4) 方案评价按钮:Go

选中要评价的方案(可以多选),然后设置右侧选中方案得分输入框的值,然后按下按钮Go!,备选方案就会被赋予新的得分值,随后整个种群的得分值就会被显示在一个弹出的对话框中,如下图所示:



评价过程可以持续进行,每次评一个或多个。没被评价的方案得分保持生成时赋予的默认得分值(这里是5分)。

这个得分值在遗传算法中称为“适应度”,即“适者生存”中的适者的评判指标。

5) 种群换代按钮

种群换代和变异是同时进行的。种群换代按钮在方案评价后变为可用状态。



淘汰输入框是给出一个淘汰分值,得分高于该值的方案将进入下一轮,得分低于该值的方案则全部淘汰。淘汰后产生的空缺由新生成的子代填补。比如按照上面的评分结果,6号和12号方案将活到下一代,剩下的14个方案全部清除掉。但是在他们被清除之前,还有机会形成子代。子代形成的机制如下:

首先按得分高低使用轮盘赌选择法选出两个方案作为父本和母本。轮盘赌是一种概率选择算法,相当于每个方案用自己的得分作为筹码在轮盘上押格子,得分越高筹码就越多,押的格子数就越多,获胜的概率也就越大。

以下是轮盘赌选择法的代码,非常简单,只有十几行。作者发布过的几个插件都用到了它,比如019号插件“毛线”。以后会写一篇文章专门讨论它的各种有趣的用法。



然后让父本和母本进行交叉重组,具体方式是:构建子代的编码(如前例,生成7种RGB色彩),对每一种色彩,随机选择从父本还是母本中获取,如此凑足7色,完成子代编码的生成。

重复上述过程,直到所需子代(14)全部生成完毕。代码如下:

 

 

然后是变异过程。变异输入框的值表示产生变异的方案的比例,默认值0.3表示有30%的方案会发生变异。具体做法是随机挑选30%的方案,然后按最大变化20%的比例修改其RGB值。注意,这里30%的变异个体是针对整个种群,其中也有可能包含上一代存活下来的旧方案。

种群换代只是产生新种群的编码(也就是16组数据),这时我们还看不到新种群的方案是什么样子。如果要看新种群的方案,需要点展示新种群按钮。

6) 展示新种群按钮

点击后会创建一个新页面,新种群的所有方案将会展示在这里,这个过程叫“解码”。

注意,新种群中的方案得分会被全部初始化为5分(默认的初始种群得分),包括从旧种群中延续下来的方案,它们的适应度没有继承下来,被清零了。

新种群生成后,可以从方案评价开始重复循环进行,直到产生满意的配色方案。

7) 色彩洗牌按钮

该按钮对选中的方案(只能选一个)的色彩进行“洗牌”,即各色区的色彩随机互换。这个按钮为用户人工干预进化过程提供了操作入口。以下是通过洗牌得到的四款配色方案,它们的7种色彩完全一样,只是赋色区域不同。



当然,纯粹手工操作修改方案色彩也是完全可以的。但是色彩模式必须是RGB,否则会出错。如果需要在各种色彩模式之间进行灵活的识别和转换,就需要对程序做一些修改了。

6.一些说明

这个程序只是一个IGA的最基本的雏形,需要改进完善的地方还有很多,当然bug也不少。如果在运行过程中发现结果不满意,建议在看懂算法原理的基础上思考一下到底是什么原因导致的,以及如何改进。很多学术研究课题都是从这些“不爽”的地方开始的,而不是简单的扔出一句话——这玩意不管用!

还可以衍生出很多其他的玩法,比如我的一个硕士生正在把这个IGA代码改成粒子群算法(PSO),她进展的不错,虽然我还没告诉她什么是PSO。

初始种群也可以不是随机的,而是基于从某幅图片出来的系列特征色彩进行赋色,如下图所示:



▲上图出自作者的文章《好色之徒的500色图》

 

新年快乐!



本文来自PS教程网www.46PS.com,转载请注明!关键词:配色设计:交互式遗传算法源代码教程


PS教程