遗传算法不仅可作为搜索和优化的一种方法,而且还可作为一种机器学习技术。例如,可以将基于遗传算法的机器学习应用于分类系统。霍勒德等人将分类系统视为一种认知模型,其可在环境中学习一些简单的串规则(string rules)(又称为分类器),以指导系统的行为。
一个分类系统包含以下三个组成部分:
1、执行系统;
2、评价系统;
3、遗传算法(GA)。
执行系统是最低层的与环境直接交互的子系统,它的作用象一个基于产生式规则的专家系统。每条规则称为一个分类器。但这种规则比较简单,其条件和动作部分都是串,起着传递消息的作用。
分类系统的学习是通过系统从环境中获得反馈信息而进行的,即通过评价分类器(规则)的正确性和效率来实现。这种评价行为由评价系统完成。其中一种有名的评价方法叫组桶式(bucket brigade)算法。
处于最高层的是遗传算法子系统。该子系统产生新的规则去替代系统中效率不高的规则。新规则的产生(发现)方法是利用遗传算法, 根据规则的适应度进行选择、组合和替代。
1. 执行系统
执行系统实际上是一个简单的产生式系统,产生式规则形如:
if <条件> then <动作>
在分类系统里,规则的条件和动作都是串(以便于GA处理)。条件部分的串说明了规则所能匹配的消息集合,而动作部分则说明了规则执行时要发送的消息。
为简便起见,设串长为k,由表{0,1,#}中的三种元素组成,其中#表示"不关心"。条件串中的#表示可与0或1匹配,而动作串中的#表示一种消息传递,即该位的值等于与条件串匹配的消息的对应位值。
例如,设k=4,有规则为:
if #10# then 010#
若现有消息1101,与规则匹配后,该规则将发送消息0101。
为方便表示,我们可将规则(分类器)的形式改为:
<条件>:<动作>
在匹配规则时,分类系统采用的是并行激活策略,即所有匹配的规则都执行其动作部分,不存在一般产生式系统中的冲突消解问题。当然,若在实际应用中,已激活规则的应用必须是互斥的,或对输出(作为规则执行的结果)的消息个数有限定,那么可依据规则(分类器)的评价值作出选用决定(见以后说明)。
执行系统基本上重复执行以下步骤:
1、将输入的消息放入消息队列中;
2、将消息队列中的所有消息与所有分类器的条件做比较;
3、将所有能匹配的分类器所产生的消息放入一个新的消息队列中;
4、用新的消息队列取代老的消息队列;
5、将消息队列中的消息加以解释并输出。
其中2-4步可循环进行,直到没有分类器可与消息队列中的消息匹配为止。
下面举一例子来说明这种匹配过程,设输入消息为0111,分类器有四个:
1)01##: 0000
2)00#0: 1100
3)11##: 1000
4)##00: 0001
首先,该消息与分类器1匹配,产生消息0000。消息0000又与分类器2和4匹配,产生两条消息1100和0001。其中1100与分类器3和4匹配,分别产生1000和0001。最后,消息1000与分类器4匹配产生0001,处理过程结束。
在传统的产生式系统中,当有多条规则同时能与当前事实匹配时,往往要决定选用哪条已激活规则,即冲突消解。一般的冲突解决方法是对规则的重要性作出区别,且这种区别往往是事先给定的。在分类系统中,虽然可以并行(全部)地执行已激活规则,但为了引入学习机制以不断完善分类规则,就有必要对规则(分类器)在系统运行时的表现做个评价,以支持对它们的选用。
2. 评价系统--组桶式算法
评价系统的目的是: 给每个分类器在系统运行时对执行结果的贡献作个评价(或打分)。实现评价的方法很多,其中最有名的是组桶式算法(简称BBA)。
BBA可理解为一个进行情报买卖的交易所,交易人是分类器。分类器作为一个中间商只与"上家"(发送消息使该中间商激活的分类器)和"下家"(其条件部分为该中间商所发)作交易。因此,分类器形成了一条从消息"制造者"(系统输入)到消息"消费者"(系统输出)之间的中间商链。
作为中间商,分类器的条件获得匹配时,并不马上发送消息,而是与其它几个同样获得匹配的分类器竞争(并非只有一个获胜)。为了表示分类器的竞争力,我们可给每个分类器分配一个参数值以表示它的价值,不妨称之为"力度"(strength)。力度越大的分类器越有竞争性,亦即越有价值。分类器之间的竞争采用竞价体系。每个获得匹配的分类器根据其力度s按某种比例出个价B。一旦该分类器被激活,其力度将被减去B,同时将所出价B付给提供消息的上家。当然若该分类器能进一步激活其它分类器(下家),它也同样能从中得到补偿。
前面讲过,当有许多分类器能与当前消息匹配时,可并行执行这些激活的分类器。此时,分类器力度的主要作用体现在遗传算法子系统:经遗传操作产生的新的分类器将取代力度最弱的分类器。由于有力度值来衡量分类器的价值,因而也可以不采用并行激活策略。例如,只执行有最强力度的已激活分类器,或根据力度大小决定各分类器的激"程度",然后执行激活程度高的一个(或几个)分类器。
可以证明,经过足够长的时间(n→∝)后,分类器i的力度将收敛于常数Rs/k,即回报值的k分之一。
3. 执行系统
尽管BBA算法提供了一种评价和选取竞争分类器的方法,但还须有一种产生新的更好的分类器的方法,以不断增强分类系统的性能。这种方法就是遗传算法。
由于分类器的条件和动作部分都是固定长度的串,应用遗传算法产生新的分类器就很自然了。设条件和动作串的长度均为L,我们可以将条件和动作串的拼接(代表一个分类器),即长度为2L的串作为GA的操作对象──个体,而当前分类器的集合作为当前群体, 通过GA的三个操作(选择、交换、突变)来产生新的分类器。
但分类系统中的遗传算法与前面讨论的简单遗传算法(SGA)还略有不同,主要表现在:
1) 群体的变化。在SGA中,由于我们是寻求问题的最优解,只要求群体能收敛于最优解,因此产生的新一代群体将完全取代上一代群体。而在分类器系统中,我们的目的是要发现有更高性能的分类器集合,因而有必要保留在上一代群体中已有较好性能(力度值较大)的分类器,亦即只要用近期发现的新分类器取代上一代群体中性能较差(力度值较小)的分类器即可。
2) 个体的适应度。SGA用面向优化的目标函数来评价个体的适应度,而分类系统则用分类器的力度去表示分类器的适应度。对于用交换或变异操作产生的新分类器,力度初始值可有多种计算方法。一种典型的方法是:如果后代从交换中产生,则将两个父代的力度值各减去1/3,同时将被减值之和作为后代的力度值;如果后代从变异中产生,则将父代的力度值减半,并将被减值作为后代力度值。
3) 突变操作。在SGA中,串的元素是0或1,因而突变操作是在0和1之间转换,而分类器的串是由{0,1,#}三种元素组成,因而某一元素的突变是等概率地被转换为其它两个元素, 即{0→1或#, 1→0或#, #→0或1}
在分类系统中,GA仅作为系统的一部分功能,且GA的运行穿插在执行系统的循环中。GA的运行时机可以是确定的(即在执行系统运行t次后,调用一次GA运算)或随机的(即执行系统平均运行t次后,有一次GA调用);也可以是在某些事件发生后再调用GA(如没有分类器可以匹配或系统性能变差)。
转载于:https://www.cnblogs.com/4rthur/archive/2009/12/24/1631550.html