遗传算法在很多领域都得到应用;从神经网络研究的角度上考虑,最关心的是遗传算法在神经网络的应用。在遗传算法应用中,应先明确其特点和关键问题,才能对这种算法深入了解,灵活应用,以及进一步研究开发。
一、遗传算法的特点
1.遗传算法从问题解的中集开始嫂索,而不是从单个解开始。
这是遗传算法与传统优化算法的极大区别。传统优化算法是从单个初始值迭代求最优解的;容易误入局部最优解。遗传算法从串集开始搜索,复盖面大,利于全局择优。
2.遗传算法求解时使用特定问题的信息极少,容易形成通用算法程序。
由于遗传算法使用适应值这一信息进行搜索,并不需要问题导数等与问题直接相关的信息。遗传算法只需适应值和串编码等通用信息,故几乎可处理任何问题。
3.遗传算法有极强的容错能力
遗传算法的初始串集本身就带有大量与最优解甚远的信息;通过选择、交叉、变异 *** 作能迅速排除与最优解相差极大的串;这是一个强烈的滤波过程;并且是一个并行滤波机制。故而,遗传算法有很高的容错能力。
4.遗传算法中的选择、交叉和变异都是随机 *** 作,而不是确定的精确规则。
这说明遗传算法是采用随机方法进行最优解搜索,选择体现了向最优解迫近,交叉体现了最优解的产生,变异体现了全局最优解的复盖。
5.遗传算法具有隐含的并行性
遗传算法的基础理论是图式定理。它的有关内容如下:
(1)图式(Schema)概念
一个基因串用符号集{0,1,}表示,则称为一个因式;其中可以是0或1。例如:H=1x x 0 x x是一个图式。
(2)图式的阶和长度
图式中0和1的个数称为图式的阶,并用0(H)表示。图式中第1位数字和最后位数字间的距离称为图式的长度,并用δ(H)表示。对于图式H=1x x0x x,有0(H)=2,δ(H)=4。
(3)Holland图式定理
低阶,短长度的图式在群体遗传过程中将会按指数规律增加。当群体的大小为n时,每代处理的图式数目为0(n3)。
遗传算法这种处理能力称为隐含并行性(Implicit Parallelism)。它说明遗传算法其内在具有并行处理的特质。
二、遗传算法的应用关键
遗传算法在应用中最关键的问题有如下3个
1.串的编码方式
这本质是问题编码。一般把问题的各种参数用二进制编码,构成子串;然后把子串拼接构成“染色体”串。串长度及编码形式对算法收敛影响极大。
2.适应函数的确定
适应函数(fitness function)也称对象函数(object function),这是问题求解品质的测量函数;往往也称为问题的“环境”。一般可以把问题的模型函数作为对象函数;但有时需要另行构造。
3.遗传算法自身参数设定
遗传算法自身参数有3个,即群体大小n、交叉概率Pc和变异概率Pm。
群体大小n太小时难以求出最优解,太大则增长收敛时间。一般n=30-160。交叉概率Pc太小时难以向前搜索,太大则容易破坏高适应值的结构。一般取Pc=025-075。变异概率Pm太小时难以产生新的基因结构,太大使遗传算法成了单纯的随机搜索。一般取Pm=0.01—0.2。
三、遗传算法在神经网络中的应用
遗传算法在神经网络中的应用主要反映在3个方面:网络的学习,网络的结构设计,网络的分析。
1.遗传算法在网络学习中的应用
在神经网络中,遗传算法可用于网络的学习。这时,它在两个方面起作用
(1)学习规则的优化
用遗传算法对神经网络学习规则实现自动优化,从而提高学习速率。
(2)网络权系数的优化
用遗传算法的全局优化及隐含并行性的特点提高权系数优化速度。
2.遗传算法在网络设计中的应用
用遗传算法设计一个优秀的神经网络结构,首先是要解决网络结构的编码问题;然后才能以选择、交叉、变异 *** 作得出最优结构。编码方法主要有下列3种:
(1)直接编码法
这是把神经网络结构直接用二进制串表示,在遗传算法中,“染色体”实质上和神经网络是一种映射关系。通过对“染色体”的优化就实现了对网络的优化。
(2)参数化编码法
参数化编码采用的编码较为抽象,编码包括网络层数、每层神经元数、各层互连方式等信息。一般对进化后的优化“染色体”进行分析,然后产生网络的结构。
(3)繁衍生长法
这种方法不是在“染色体”中直接编码神经网络的结构,而是把一些简单的生长语法规则编码入“染色体”中;然后,由遗传算法对这些生长语法规则不断进行改变,最后生成适合所解的问题的神经网络。这种方法与自然界生物地生长进化相一致。
3.遗传算法在网络分析中的应用
遗传算法可用于分析神经网络。神经网络由于有分布存储等特点,一般难以从其拓扑结构直接理解其功能。遗传算法可对神经网络进行功能分析,性质分析,状态分析。
遗传算法虽然可以在多种领域都有实际应用,并且也展示了它潜力和宽广前景;但是,遗传算法还有大量的问题需要研究,目前也还有各种不足。首先,在变量多,取值范围大或无给定范围时,收敛速度下降;其次,可找到最优解附近,但无法精确确定最扰解位置;最后,遗传算法的参数选择尚未有定量方法。对遗传算法,还需要进一步研究其数学基础理论;还需要在理论上证明它与其它优化技术的优劣及原因;还需研究硬件化的遗传算法;以及遗传算法的通用编程和形式等。
分类: 教育/科学 >> 科学技术
问题描述:
最好再介绍一下免疫算法
解析:
遗传算法(Geic Algorithm, GA)是近几年发展起来的一种崭新的全局优化算法,它借
用了生物遗传学的观点,通过自然选择、遗传、变异等作用机制,实现各个个体的适应性
的提高。这一点体现了自然界中"物竞天择、适者生存"进化过程。1962年Holland教授首次
提出了GA算法的思想,从而吸引了大批的研究者,迅速推广到优化、搜索、机器学习等方
面,并奠定了坚实的理论基础。 用遗传算法解决问题时,首先要对待解决问题的模型结构
和参数进行编码,一般用字符串表示,这个过程就将问题符号化、离散化了。也有在连续
空间定义的GA(Geic Algorithm in Continuous Space, GACS),暂不讨论。
一个串行运算的遗传算法(Seguential Geic Algoritm, SGA)按如下过程进行:
(1) 对待解决问题进行编码;
(2) 随机初始化群体X(0):=(x1, x2, … xn);
(3) 对当前群体X(t)中每个个体xi计算其适应度F(xi),适应度表示了该个体的性能好
坏;
(4) 应用选择算子产生中间代Xr(t);
(5) 对Xr(t)应用其它的算子,产生新一代群体X(t+1),这些算子的目的在于扩展有限
个体的覆盖面,体现全局搜索的思想;
(6) t:=t+1;如果不满足终止条件继续(3)。
GA中最常用的算子有如下几种:
(1) 选择算子(selection/reproduction): 选择算子从群体中按某一概率成对选择个
体,某个体xi被选择的概率Pi与其适应度值成正比。最通常的实现方法是轮盘赌(roulett
e wheel)模型。
(2) 交叉算子(Crossover): 交叉算子将被选中的两个个体的基因链按概率pc进行交叉
,生成两个新的个体,交叉位置是随机的。其中Pc是一个系统参数。
(3) 变异算子(Mutation): 变异算子将新个体的基因链的各位按概率pm进行变异,对
二值基因链(0,1编码)来说即是取反。
上述各种算子的实现是多种多样的,而且许多新的算子正在不断地提出,以改进GA的
某些性能。系统参数(个体数n,基因链长度l,交叉概率Pc,变异概率Pm等)对算法的收敛速度
及结果有很大的影响,应视具体问题选取不同的值。
GA的程序设计应考虑到通用性,而且要有较强的适应新的算子的能力。OOP中的类的继
承为我们提供了这一可能。
定义两个基本结构:基因(ALLELE)和个体(INDIVIDUAL),以个体的 作为群体类TP
opulation的数据成员,而TSGA类则由群体派生出来,定义GA的基本 *** 作。对任一个应用实
例,可以在TSGA类上派生,并定义新的 *** 作。
TPopulation类包含两个重要过程:
FillFitness: 评价函数,对每个个体进行解码(decode)并计算出其适应度值,具体 ***
作在用户类中实现。
Statistic: 对当前群体进行统计,如求总适应度sumfitness、平均适应度average、最好
个体fmax、最坏个体fmin等。
TSGA类在TPopulation类的基础上派生,以GA的系统参数为构造函数的参数,它有4个
重要的成员函数:
Select: 选择算子,基本的选择策略采用轮盘赌模型(如图2)。轮盘经任意旋转停止
后指针所指向区域被选中,所以fi值大的被选中的概率就大。
Crossover: 交叉算子,以概率Pc在两基因链上的随机位置交换子串。
Mutation: 变异算子,以概率Pm对基因链上每一个基因进行随机干扰(取反)。
Generate: 产生下代,包括了评价、统计、选择、交叉、变异等全部过程,每运行一
次,产生新的一代。
SGA的结构及类定义如下(用C++编写):
typedef char ALLELE ;
基因类型
typedef struct
{
ALLELE chrom ;
float fitness ;
fitness of Chromosome
}INDIVIDUAL ;
个体定义
class TPopulation
{
群体类定义
public : int size ;
Size of population: n
int lchrom ;
Length of chromosome: l
float sumfitness , average ;
INDIVIDUAL fmin , fmax ;
INDIVIDUAL pop ;
TPopulation (int popsize , int strlength );
~TPopulation ();
inline INDIVIDUAL &Individual (int i )
{
return pop [i ];
}
;
void FillFitness ();
评价函数
virtual void Statistics ();
统计函数
};
class TSGA : public TPopulation
{
TSGA类派生于群体类
public : float pcross ;
Probability of Crossover
float pmutation ;
Probability of Mutation
int gen ;
Counter of generation
TSGA (int size , int strlength , float pm =003 , float pc =06 ): TPopulation (size , strlength )
{
gen =0 ;
pcross =pc ;
pmutation =pm ;
} ;
virtual INDIVIDUAL& Select ();
virtual void Crossover (INDIVIDUAL &parent1 , INDIVIDUAL &parent2 , INDIVIDUAL &child1 , INDIVIDUAL &child2 );
&child1 , INDIVIDUAL &child2 );
virtual ALLELE Mutation (ALLELE alleleval );
virtual void Generate ();
产生新的一代
};
用户GA类定义如下: class TSGAfit : public TSGA
{
public : TSGAfit (int size ,float pm =00333 ,float pc =06 ) :TSGA (size ,24 ,pm ,pc )
{
}
;
void print ();
};
由于GA是一个概率过程,所以每次迭代的情况是不一样的;系统参数不同,迭代情况
也不同。在实验中参数一般选取如下:个体数n=50-200,变异概率Pm=003, 交叉概率Pc=
06。变异概率太大,会导致不稳定。
参考文献
● Goldberg D E Geic Algorithm in Search, Optimization, and machine
Learning Addison-Wesley, Reading, MA, 1989
● 陈根社、陈新海,"遗传算法的研究与进展",《信息与控制》,Vol23,
NO4, 1994, PP215-222
● Vittorio Maniezzo, "Geic Evolution of the Topology and Weight Distri
bution of the Neural Neorks", IEEE, Trans on Neural Neorks, Vol5, NO
1, 1994, PP39-53
● Xiaofeng Qi, Francesco Palmieri, "Theoretical Analysis of Evolutionary
Algorithms with an Infinite Population Size in Continuous Space Part Ⅰ
l Neorks, Vol5, NO1, 1994, PP102-119
● Xiaofeng Qi, Francesco Palmieri, "Theoretical Analysis of Evolutionary
Algorithms with an Infinite Population Size in Continuous Space Part Ⅱ
al Neorks, Vol5, NO1, 1994, PP102-119
● Gunter Rudolph, Convergence Analysis of Canonical Geic Algorithms, I
EEE, Trans on Neural Neorks, Vol5, NO1, 1994, PP96-101
● A E Eiben, E H L Aarts, K M Van Hee Gloable convergence of geic alg
orithms: A Markov chain ysis in Parallel Problem Solving from Nat
ure H-PSchwefel, RManner, Eds Berlin and Heidelberg: Springer, 1991
, PP4-12
● Wirt Atmar, "Notes on the Simulation of Evolution", IEEE, Trans on Neu
ral Neorks, Vol5, NO1, 1994, PP130-147
● Anthony V Sebald, Jennifer Schlenzig, "Minimax Design of Neural Net Co
ntrollers for Highly Uncertain Plants", IEEE, Trans on Neural Neorks, V
ol5, NO1, 1994, PP73-81
● 方建安、邵世煌,"采用遗传算法自学习模型控制规则",《自动化理论、技术与应
用》,中国自动化学会 第九届青年学术年会论文集,1993, PP233-238
● 方建安、邵世煌,"采用遗传算法学习的神经网络控制器",《控制与决策》,199
3,8(3), PP208-212
● 苏素珍、土屋喜一,"使用遗传算法的迷宫学习",《机器人》,Vol16,NO5,199
4, PP286-289
● MSrinivas, LMPatnaik, "Adaptive Probabilities of Crossover and Mutat
ion", IEEE Trans on SMC, Vol24, NO4, 1994 of Crossover and Mutation",
IEEE Trans on SMC, Vol24, NO4, 1994
● Daihee Park, Abraham Kandel, Gideon Langholz, "Geic-Based New Fuzzy
Reasoning Models with Application to Fuzzy Control", IEEE Trans S M C,
Vol24, NO1, PP39-47, 1994
● Alen Varsek, Tanja Urbancic, Bodgan Filipic, "Geic Algorithms in Con
troller Design and Tuning", IEEE Trans S M C, Vol23, NO5, PP1330-13
39, 1993
随着科学的发展和技术的进步,系统科学从20世纪年代开始兴起,人们逐渐认识到系统大于其组成部分之和,系统具有层次结构和功能结构,系统处于不断的发展变化之中,系统经常与其环境(外界)有物质、能量和信息的交换,系统在远离平衡的状态下也可以稳定(自组织),确定性的系统有其内在的随机性(混沌),而随机性的系统却又有其内在的确定性(突现)。这些新的发现不断地冲击着经典科学的传统观念。系统论、信息论、控制论、相变论(主要研究平衡结构的形成与演化)、耗散结构论(主要研究非平衡相变与自组织)、突变论(主要研究连续过程引起的不连续结果)、协同论(主要研究系统演化与自组织)、混沌论(主要研究确定性系统的内在随机性)、超循环论(主要研究在生命系统演化行为基础上的自组织理论)等新科学理论也相继诞生。这种趋势使许多科学家感到困惑,也促使一些有远见的科学家开始思考并探索新的道路。复杂系统和系统的复杂性这两个科学概念就是在这样的背景下提出的。复杂科学(complexity science)是国外在80年代提出的范畴,主要是研究复杂性和复杂系统的科学。它目前虽还处于萌芽状态,但已被有些科学家誉为“21世纪的科学”。
1984年,一批从事物理、经济、理论生物、计算机等学科的研究人员,在诺贝尔奖获得者盖尔曼(M Gell-Mann)、安德森(P Anderson)、阿罗(K Arrow)等人的支持下,聚集在一起组织了圣菲研究所(Santa Fe Institute, SFI,又译圣达菲),专门从事复杂科学的研究,试图由此找到一条通过学科间的融合来解决复杂性问题的道路。与此同时,乔治·梅森大学(George Mason University)的沃菲尔德(J Warfield),麻省理工学院的森格(P Senge),以及普里戈金(I Prigogine)、哈肯(H Haken)等人也在探索复杂性问题,我国学者钱学森也于1990年提出了开放的复杂巨系统的概念。
笔者多年来从事软科学和管理科学的研究,也一直在思考科学的未来。近年来开始致力于复杂科学的探索,并从国家自然科学基金委员会管理科学部的角度尽力推进复杂科学的研究。本文拟就复杂科学的内涵、基本方法与主要工具,以及其在组织管理方面的应用前景作一些初步的探讨。
复杂性与复杂系统
根据笔者的理解,可以认为系统的复杂性主要表现在以下几个方面。
1系统各单元之间的联系广泛而紧密,构成一个网络。因此每一单元的变化都会受到其他单元变化的影响,并会引起其他单元的变化。
2系统具有多层次、多功能的结构,每一层次均成为构筑其上一层次的单元,同时也有助于系统的某一功能的实现。
3系统在发展过程中能够不断地学习并对其层次结构与功能结构进行重组及完善。
4系统是开放的,它与环境有密切的联系,能与环境相互作用,并能不断向更好地适应环境的方向发展变化。
5系统是动态的,它处于不断的发展变化之中,而且系统本身对未来的发展变化有一定的预测能力。
笔者认为,系统的复杂性可以分为三个层次。
1机械(物理)复杂性:即在无生命系统中存在的复杂性,例如在物质形态、结构、语言、计算、气象、天文等方面表现的复杂性。
2生物复杂性:即在有生命系统中存在的复杂性,例如在生命起源、胚胎发育、疾病与免疫、生物进化等方面表现的复杂性。
3社会复杂性:即在有人参与的系统中存在的复杂性,例如在群体决策、股票市场、企业运行、经济发展、社会进步、战争等方面表现的复杂性。
关于复杂系统,许多科学家提出了种种不同的定义,有人认为是组分众多、具有层次结构的系统,有人认为是具有多样性的系统,也有人认为是耦合度高的系统,还有人认为是有人参与的系统,等等。笔者认为,复杂系统最本质的特征是其组分具有某种程度的智能,即具有了解其所处的环境,预测其变化并按预定目标采取行动的能力。这也就是生物进化、技术革新、经济发展、社会进步的内在原因。
根据上述理解,笔者认为复杂科学有以下三个主要特点。
1其研究对象是复杂系统,例如植物、动物、人体、生命、生态、企业、市场、经济、社会、政治等等方面的系统。还可以包括物理、化学、天文、气象等方面具有复杂性的系统。
2其研究方法是定性判断与定量计算相结合、微观分析与宏观综合相结合、还原论与整体论相结合、科学推理与哲学思辨相结合的方法。其所用的工具包括数学、计算机模拟、形式逻辑、后现代主义分析、语义学、符号学,等等。
3其研究深度不限于对客观事物的描述,而是更着重于揭示客观事物构成的原因及其演化的历程,并力图尽可能准确地预测其未来的发展。例如,为什么一个受精卵能演化成具有脑、眼、口、鼻、心、肺、肝、肾等器官的人体为什么处于大体相同的客观环境中的企业有成有败为什么世界各国之间贫富相差悬殊这种差距将来会有所缩小,还是会继续扩大等等。
笔者认为,人类文明从工业—机械文明向信息—生态文明的大转变必然伴随着科学的大转折。而以还原论、经验论及“纯科学”为基础的经典科学正在吸收系统论、理性论和人文精神而发展成为新的科学——复杂科学。
复杂科学的基本方法与主要工具
笔者认为,研究复杂系统的基本方法应当是在唯物辩证法指导下的系统科学方法。它包括以下四个方面的结合。
定性判断与定量计算相结合 通过定性判断建立系统总体及各子系统的概念模型,并尽可能将它们转化为数学模型,经求解或模拟后得出定量的结论,再对这些结论进行定性归纳,以取得认识上的飞跃,形成解决问题的建议。
微观分析与宏观综合相结合 微观分析的目的是了解系统的组元及其层次结构,而宏观综合的目的则是了解系统的功能结构及其形成过程。
还原论与整体论相结合 还原论强调从局部机制和微观结构中寻求对宏观现象的说明,例如用物理—化学规律来说明生物学现象,这显然是片面的。而整体论则强调系统内部各部分之间的相互联系和作用决定着系统的宏观性质,但如果没有对局部机制和微观结构的深刻了解,对系统整体的把握也难以具体化。复杂科学正是在深入了解系统个体的性质和行为的基础上,从个体之间的相互联系和作用中发现系统的整体性质和行为。
科学推理与哲学思辨相结合 科学理论是具有某种逻辑结构并经过一定实验检验的概念系统,科学家在表述科学理论时总是力求达到符号化和形式化,使之成为严密的公理化体系。但是科学的发展往往证明任何理论都不是天衣无缝的,总有一些“反常”的现象和事件出现。这时就必须运用哲学思辨的力量,从个别和一般、必然性和偶然性等范畴,以及对立统一、否定之否定等规律来加以解释。
目前复杂科学研究中所用的理论工具主要是微分方程和形式逻辑,今后似应努力掌握以下一些工具。
在不确定条件下的决策技术 包括定性变量的量化(多维尺度、广义量化等)、经验概率的确定(数据挖掘、数据库中的知识发现、智能挖掘等)、主观概率的改进、案例研究与先验信息的集成等。
综合集成技术 包括系统的结构化、系统与环境的集成(全局和局部)、人的经验与数据的集成、通过模型的集成、从定性到定量的综合集成等。
整体优化技术 包括目标群及其优先顺序的确定、巨系统的优化策略(分隔断裂法、面向方程法、多层迭代法、并行搜索法等)、优化算法(线性规划、目标规划等)、离线优化与在线优化、最优解与满意解的取得等。
计算智能 包括演化计算(例如遗传算法、演化策略、演化规划、遗传程序设计等)、人工神经网络(例如EBP型、竞争型、自适应共振型、联想记忆型等)、模糊系统等。
非线性科学 目前非线性科学已由传统的动力系统理论(稳定性和分叉理论、混沌、孤子)和统计力学(分形、标度)延伸到多尺度、多体,以及非平衡系统中的复杂和随机现象的研究。而对非线性科学的压倒一切的挑战就是:对远离平衡的多体系统中的自组织结构的形成和功能确认其关键的范式。
数理逻辑 即数学化的形式逻辑,包括经典谓词逻辑、广义数理逻辑(例如模型论、公理集合论、证明论、递归论等)、多值逻辑、模态逻辑、归纳逻辑等。
计算机模拟 它是十分重要的手段,目前已广泛用于复杂科学的研究。其中比较著名的有人工生命(artificial life)、元胞自动机(cellular automata)、竞争与合作(co-opetition)、大群模拟工具(swarm simulation toolkit)等。
复杂科学在组织管理中的应用前景
复杂系统的范围很广,涉及工程、生物、经济、管理、军事、政治、社会等各个方面。对复杂系统的研究将有助于人们了解其发展规律及动因,以便更好地进行适应与调控。例如运用复杂科学的原理研究组织管理问题,将组织的形成与进化看成是系统内部各组元相互作用及系统与环境相互作用的结果,就可以得出一些颇有新意的观点,现举例概述如下。
1群体决策
在社会、经济、科技迅速发展的今天,决策者面临着错综复杂、瞬息万变的环境,有些决策的后果还影响深远,要想尽可能作出正确的决策,除了改进决策技术之外,还必须依靠群体的智慧。这方面需要依靠具有不同知识和经验的人们所组成的群体来辅助决策,另一方面则需要与决策后果有关的各方参与决策。但是由于决策群体中各人的知识、经验、胆略、利益、价值观等方面都有所不同,以及局部利益与全局中利益的矛盾,还需要用适当的方法进行协调与妥协,同时应注意使群体中的各成员充分了解该决策的价值体系及有关的各种信息。
通常可以将群体决策分为两种类型。一类是协同决策,这时参加决策者的目标一致,彼此之间并没有利益冲突,但因各人的知识和经验不同而有不同的意见,需要通过相互交流和启发来逐步求得最优的决策。为此需要研究如何将分散的意见逐步集中起来,形成集体的最优决策。这就是群体决策的效果优于任一成员个人决策,也往往优于各成员个人决策的简单线性叠加。
另一类是协调决策,这时参加者的目标并不一致,彼此之间存在着利益冲突,但又希望能作出一个能为各方所接受的决策,即求出合作对策的妥协值。但妥协值的形成是群体中各成员之间反复斗争与妥协的结果,为此需要研究如何运用合作对策理论来求出妥协点,例如沙普利值、纳什议价解等。
在群体决策中还应考虑到各个参与者之间信息不对称的影响,以及他们在决策群体中的行为,防止因权威效应或从众效应而造成最优决策点的漂移。此外,在通过群体决策实现综合集成时,应当进一步探索研究如何具体贯彻“在民主基础上的集中,在集中指导下的民主”这一民主集中制的原则,使其成为有中国特色的决策体制。
2管理创新
在从工业社会向信息社会转变的过程中,企业没有创新就难以生存。复杂科学将创新看作是已有的知识和组元重新组合而造成的突现现象。复杂科学反映着在科学和商务上做事方法的根本转变,企业必须把开发知识和智能放在首位。复杂科学家研究了如何通过企业职工(组元)之间的相互作用而产生知识、创新、创造性和智能,发现创新的产生主要取决于组织与激励,创造让全体职工通过联系与交流使其关心企业全局的条件,而不取决于个别职工突出的聪明才智。正如中国谚语所说的“三个臭皮匠,赛过诸葛亮”,创新并不是个别天才人物的灵机一动,而是系统为适应环境变化所作出的调整。
3企业组织
根据现代组织管理理论,组织结构并不仅仅是按照企业领导的权威“设计”而形成的,其背后有组织文化的因素,而更重要的因素是,企业内部各个成员或小团体之间,就有关权力的分配、相互作用及影响,最终达到妥协的结果。这和复杂科学中的观点是不谋而合的。
随着技术进步及经济发展,更加强调组织的进化性和应变能力。一个组织要想在错综复杂、瞬息万变的环境下生存和发展,就必须能够从外部准确而及时地获取信息,迅速调整自己的内部结构以适应环境的变化。特别是在高技术企业中,拥有所需的专门知识及相应的技能、目标明确、自主管理、能不断学习和创新、注重工作质量、强调自愿择业的知识工人将发挥越来越重要的作用。因此在组织方式上提出了无固定边界的非正规组织、层次很少的扁平型组织、成员之间能有效沟通的网络状组织、有利于鼓励内部创新的半自治式组织,等等。
中国国家自然科学基金委员会管理科学部已经在北京大学建立了“复杂科学虚拟研究中心”,拨出专款支持对复杂科学进行自由的学术探索。同时还拟针对中国改革与发展中的重大问题,逐步建设定性与定量相结合的综合集成政策研讨厅。同时,我国还在推进复杂科学研究方面的国际合作,希望能通过各国多学科的科学家们的共同努力,使复杂科学在解决人类面临的重大问题方面发挥应有的作用。/
1楼的不是遗传算法吧!
刚好做过这个遗传算法解背包问题的论文,给你回答啦~~独家哦,分数要给偶~~
1、程序开发环境
开发环境:Visual C++60 (把Fortran程序改为VC)
*** 作系统:Windows 2003 Professional
2、程序性能对比
运行时间与加速比(如表1所示)
进程数p(个) 1 2 4
运行时间t(秒) 129s 78s 38s
加速比s 165 338
表1、运行时间与加速比
3、程序运行结果:
实例数据:
假设物体的重量Weight、物体的收益Profit和背包的容量Contain 分别为:
Weight={ 80,82,85,70,72, 70,66,50,55,25 ,
50,55,40,48,50, 32,22,60,30,32 ,
40,38,35,32,25, 28,30,22,50,30 ,
45,30,60,50,20 , 65,20,25,30,10 ,
20,25,15,10,10 , 10,4, 4, 2, 1 }
Profit={ 220,208,198,192,180, 180,165,162,160,158,
155,130,125,122,120 , 118,115,110,105,101,
100,100,98, 96, 95, 90, 88, 82, 80, 77 ,
75, 73, 72, 70, 69, 66, 65, 63, 60, 58,
56, 50, 30, 20, 15, 10, 8, 5, 3, 1}
Contain=1000,
如何选择哪些物品装入该背包可使得在背包的容量约束限制之内所装物品的总价值最大
传统的算法(动态规划、递归回溯法和贪心算法所得结果:
总价值为3077 , 总重量为999。
2001年张铃,张钹教授在计算机学报上发表的《佳点集遗传算法》所得结果
总价值为3103, 总重量为1000。
我们算法所得结果: 总价值为3103, 总重量为1000。
我们所求得最优解的个体分配情况为:
11010 10111 10110 11011 01111 11101 00001 01001 10000
01000
算法 最大迭代次数 总价值为 总重量为
传统的算法 400 3077 999
佳点集算法 70 3103 1000
遗传算法 75 3103 1000
// knapsackcpp : Defines the entry point for the console application
//
#include "stdafxh"
#include <AfxWinh>
#include <stdlibh>
#include <mathh>
#include <timeh>
#include <conioh>
#include <stdioh>
// 重要常量参数
#define popsize 200 //种群的规模
#define pc 0618 //杂交概率
#define pm 003 //变异概率
#define lchrom 50 //染色体长度
#define maxgen 1000 //最大进化代数
struct population
{
unsigned int chrom[lchrom]; //染色体
double weight; //背包重量
double fitness; //适应度
unsigned int parent1,parent2,cross; //双亲、交叉点
};
//新生代种群、父代种群
struct population oldpop[popsize],newpop[popsize];
//背包问题中物体重量、收益、背包容量
int weight[lchrom],profit[lchrom],contain;
//种群的总适应度、最小、最大、平均适应度
double sumfitness,minfitness,maxfitness,avgfitness;
//计算适应度时使用的 惩罚函数系数
double alpha;
//一个种群中最大和最小适应度的个体
int minpop,maxpop;
/ 读入背包信息,并且计算惩罚函数系数 /
void read_infor()
{
FILE fp;
int j;
//获取背包问题信息文件
if ((fp=fopen("knapsacktxt","r"))==NULL)
{
//读取文件失败
AfxMessageBox("The file is not found",MB_OK,NULL);
return;
}
//读入物体收益信息
for (j=0;j<lchrom;j++)
{
fscanf(fp,"%d",&profit[j]);
}
//读入物体重量信息
for (j=0;j<lchrom;j++)
{
fscanf(fp,"%d",&weight[j]);
}
//读入背包容量
fscanf(fp,"%d",&contain);
fclose(fp);
}
//根据计算的个体重量,判断此个体是否该留在群体中
double cal_weight(unsigned int chr)
{
int j;
double pop_weight;//背包重量
pop_weight=0;
for (j=0;j<lchrom;j++)
{
pop_weight=pop_weight+(chr)weight[j];
chr++;
}
return pop_weight;
}
/ 种群中个体适应度计算/
double cal_fit(unsigned int chr)
{
int j;
double pop_profit;//适应度
pop_profit=0;
// pop_weight=0;
for (j=0;j<lchrom;j++)
{
pop_profit=pop_profit+(chr)profit[j];
// pop_weight=pop_weight+(chr)weight[j];
chr++;
}
return pop_profit;
}
/ 群体适应度的最大最小值以及其他信息 /
void statistics(struct population pop)
{
int i;
double tmp_fit;
sumfitness=pop[0]fitness;
minfitness=pop[0]fitness;
minpop=0;
maxfitness=pop[0]fitness;
maxpop=0;
for (i=1;i<popsize;i++)
{
//计算种群的总适应度
sumfitness=sumfitness+pop[i]fitness;
tmp_fit=pop[i]fitness;
//选择种群中最大适应度的个体
if ((tmp_fit>maxfitness)&&((int)(tmp_fit10)%10==0))
{
maxfitness=pop[i]fitness;
maxpop=i;
}
//选择种群中最小适应度的个体
if (tmp_fit<minfitness)
{
minfitness=pop[i]fitness;
minpop=i;
}
//计算平均适应度
avgfitness=sumfitness/(float)popsize;
}
// printf("\nthe max pop = %d;",maxpop);
// printf("\nthe min pop = %d;",minpop);
// printf("\nthe sumfitness = %f\n",sumfitness);
}
//报告种群信息
void report(struct population pop,int gen)
{
int j;
int pop_weight=0;
printf("the generation is %d\n",gen); //输出种群的代数
//输出种群中最大适应度个体的染色体信息
printf("The population's chrom is: \n");
for (j=0;j<lchrom;j++)
{
if (j%5==0)
{ printf(" ");}
printf("%1d",pop[maxpop]chrom[j]);
}
//输出群体中最大适应度
printf("\nThe population's max fitness is %d",(int)pop[maxpop]fitness);
printf("\nThe knapsack weight is %d\n\n",(int)pop[maxpop]weight);
}
/ 生成初始种群 /
void initpop()
{
int i,j,ispop;
double tmpWeight;
//变量用于判断是否为满足条件的个体
ispop=false;
//生成popsize个种群个体
for(i=0;i<popsize;i++)
{
while (!ispop)
{
for(j=0;j<lchrom;j++)
{
oldpop[i]chrom[j]=rand()%2; //随机生成个体的染色体
oldpop[i]parent1=0; //双亲
oldpop[i]parent2=0;
oldpop[i]cross=0; //交叉点
}
//选择重量小于背包容量的个体,即满足条件
tmpWeight=cal_weight(oldpop[i]chrom);
if (tmpWeight<=contain)
{
oldpop[i]fitness=cal_fit(oldpop[i]chrom);
oldpop[i]weight=tmpWeight;
oldpop[i]parent1=0;
oldpop[i]parent2=0;
oldpop[i]cross=0;
ispop=true;
}
}
//此个体可以加入到种群中
ispop=false;
}
}
/ 遗传 *** 作 /
//概率选择试验
int execise(double probability)
{
double pp;
//如果生成随机数大于相应的概率则返回真,否则试验不成功
pp=(double)(rand()%20001/200000);
if (pp<=probability) return 1;
return 0;
}
// 选择进行交叉 *** 作的个体
int selection(int pop)
{
double wheel_pos,rand_Number,partsum;
int parent;
//赌轮法选择
rand_Number=(rand()%2001)/20000;
wheel_pos=rand_Numbersumfitness; //赌轮大小
partsum=0;
parent=0;
do{
partsum=partsum+oldpop[parent]fitness;
parent=parent+1;
} while (partsum<wheel_pos && parent<popsize);
return parent-1;
}
/ 交叉 *** 作 /
int crossover(unsigned int parent1,unsigned int parent2,int i)
{
int j,cross_pos;
if (execise(pc))
{
//生成交叉位置0,1,(lchrom-2)
cross_pos=rand()%(lchrom-1);
}
else cross_pos=lchrom-1;
for (j=0;j<=cross_pos;j++)
{ //保留复制;
//包括在概率选择不成功时,父体完全保留
newpop[i]chrom[j]=parent1[j];
}
for(j=cross_pos+1;j<=(lchrom-1);j++)
{
//从交叉点开始交叉
newpop[i]chrom[j]=parent2[j];
}
//记录交叉位置
newpop[i]cross=cross_pos;
return 1;
}
/ 变异 *** 作 /
int mutation(unsigned int alleles)
{
if (execise(pm))
{
if (alleles)
alleles=0;
else alleles=1;
}
//返回变异值,或者返回原值
return alleles;
}
/ 群体更新 /
void generation()
{
unsigned int i,j,mate1,mate2;
double tmpWeight;
int ispop;//记录是否是符合条件的个体
i=0;
while (i<popsize)
{
ispop=false;
while (!ispop)
{
//选择
mate1=selection(i);
mate2=selection(i+1);
//交叉
crossover(oldpop[mate1]chrom,oldpop[mate2]chrom,i);
//变异
for (j=0;j<lchrom;j++)
{
newpop[i]chrom[j]=mutation(newpop[i]chrom[j]);
}
//选择重量小于背包容量的个体,即满足条件
tmpWeight=cal_weight(newpop[i]chrom);
if (tmpWeight<=contain)
{
newpop[i]fitness=cal_fit(newpop[i]chrom);
newpop[i]weight=tmpWeight;
newpop[i]parent1=mate1;
newpop[i]parent2=mate2;
ispop=true;
}
}
//此个体可以加入到种群中
i=i+1;
}
}
void main(int argc, char argv[])
{
int gen,oldmaxpop,k;
double oldmax;
read_infor();//读入背包信息
gen=0;
srand( (unsigned)time( NULL ) );//置随机种子
initpop();
memcpy(&newpop,&oldpop,popsizesizeof(struct population));
statistics(newpop);//统计新生种群的信息
report(newpop,gen);
while(gen<maxgen)
{
gen=gen+1;
if (gen%100==0)
{
srand( (unsigned)time( NULL ) );//置随机种子
}
oldmax=maxfitness;
oldmaxpop=maxpop;
generation();
statistics(newpop); //统计新生代种群信息
//如果新生代种群中个体的最大适应度小于老一代种群
//个体的最大适应度,则保存老一代种群个体的最大适应度
//否则报告新生代的最大适应度
if (maxfitness<oldmax)
{
for(k=0;k<lchrom;k++)
newpop[minpop]chrom[k]=oldpop[oldmaxpop]chrom[k];
newpop[minpop]fitness=oldpop[oldmaxpop]fitness;
newpop[minpop]parent1=oldpop[oldmaxpop]parent1;
newpop[minpop]parent2=oldpop[oldmaxpop]parent2;
newpop[minpop]cross=oldpop[oldmaxpop]cross;
statistics(newpop);
}
else if (maxfitness>oldmax)
{
report(newpop,gen);
}
//保存新生代种群的信息到老一代种群信息空间
memcpy(&oldpop,&newpop,popsizesizeof(struct population));
}
printf("It is over");
getch();
}
ASD 是Microsoft Word的自动保存文件;Microsoft高级流媒体格式(microsoft advanced streaming format,ASF)的描述文件;可用NSREX打开 Velvet Studio例子文件。恢复文件的后缀名为asd 。 GT:在Nvidia的显卡中。GT表示的是加强版的意思。8600GT就是8600的加强版 GS:General Synthesizer 的缩写,中文称为“通用合成器”,是Roland公司创立的一种MIDI标准,此标准定义了我们最常用的128种乐器,音效和控制器的排列。 GSO:是指比GT高(但是由于是特别显卡,显存没GT大,在大屏幕下吃亏) :MB:计算机中的一种储存单位 读作兆,1024MB=1GB MB或MiB可以是: Mebibyte MB =Mother Board/Main Board,主板 HD指的是ATi最新DX10显卡的正式发行代号,这一系列都属于高端产品,现在都比较贵 IDE:IDE = Integrated Device Electronics,集成设备电路,一般叫做IDE总线,更准确地称为是ATA。一种 磁 盘驱动器接口类型,控制器电路就驻留在驱动器中,不再需要单独的适配器卡。 IDE = Integrated Development Environment,集成开发环境,可以辅助开发程式的应用软件 SATA: SATA的全称是Serial Advanced Technology Attachment(串行高级技术附件,一种基于行业标准的串行硬件驱动器接口),是由Intel、IBM、Dell、APT、Maxtor和Seagate公司共同提出的硬盘接口规范 PCI: (Peripheral Component Interconnect) 一种由英特尔(Intel)公司1991年推出的用于定义局部总线的标准。 GP:Koza在1989年提出利用层次化的计算机程序来表达和解决问题,而解决问题的最佳方法(程序)可以借助遗传算法思想寻得,这也就是遗传程序设计 FPS:是图像领域中的一个术语,Frames Per Second更确切的解释是“每秒钟填充图像的帧数(帧/秒)
我这里给出了一个简单的模板如果需要编代码填代码的地方已经有提示了
/package otherFile;
import javautilRandom;
import tGraphTdcppGraph;
import shuffP;
/
/
@author vaqeteart
这里是遗传算法的核心框架遗传算法的步骤:
遗传算法核心部分的算法描述
算法步骤:
1、初始化
11、生成初始种群编码
12、计算每个个体的适配值。
13、记录当前最优适配值和最优个体
2、选择和遗传,
20、若当前最优适配值多次小于已有的最优适配值(或相差不大)很多次,或者进化的次数超过设定的限制,转4。
21、按照与每个个体的适配值成正比的概率选择个体并复制,复制之后个体的数目和原始种群数目一样。
22、(最好先打乱复制后种群的个体次序)对复制后个体进行两两配对交叉,生成相同数目的的下一代种群。
23、对下一代种群按照一定的概率进行变异
24、计算每个个体的适配值。
25、记录当前最优适配值和最优个体
26、转2
3、返回当前最优适配值以及其对应的编码,结束。
注意:
1这里的内容相当于一个模板,编写具体的遗传算法的时候,可以按照这个模板的形式编写。
2应该填写代码的地方都有提示的标记。
/
public class GAKernel
{
//number of population
int popNum;//set the number to 20 in constructor
//current evolution times
int evolutionTim;
//limit of the evolution times
int evolutionLim;//set the number to 20 in constructor
//unaccepted times
//int eliminTim;
//limit of unaccepted times
//int eliminLim;
//current best euler code
//int curBestCode[];
//current best fitness
int curBestFitness;
//fitness of every individual
int iFitness[];
//fator of compute the fitness
int factor;
//other members
//the graph
//public TdcppGraph tpGraph;
//the eula code group
//int codes[][];
//every population
//
//constructor
GAKernel(TdcppGraph tG,int eulerCode[])
{
popNum = 32;//22222
//factor = IntegerMAX_VALUE / popNum;//to avoid overflow when select,for every fitness
evolutionTim = 0;/////
evolutionLim = 15;///////
//thistpGraph=new TdcppGraph(tG);
//eliminTim = 0;
//eliminLim
curBestFitness = 0;
//curBestCode = new int[eulerCodelength];
//for(int i = 0; i < curBestCodelength; ++i)
//{
// curBestCode[i] = eulerCode[i];
//}
//curBestFitness
iFitness = new int[popNum];
//codes = new int[popNum][];//lines
for(int i = 0; i < popNum; ++i)
{
//codes[i] = new int[eulerCodelength];
iFitness[i] = 0;
}
Systemoutprintln("构造函数,需要填入代码");
}
//initialize the originalpopulation
void initPopulation()
{
//初始化种群
//int tmpCode[] = new int[curBestCodelength];
//get the initial individual
//for(int i = 0; i < curBestCodelength; ++i)
//{
// tmpCode[i] = curBestCode[i];
// codes[0][i] = tmpCode[i];
//}
//ShuffEP s = new ShuffEP(thistpGraph);
//for(int i = 1; i < popNum; ++i)
//{
// sshuff(tmpCode);
// for(int j = 0; j < tmpCodelength; ++j)
// {
// codes[i][j] = tmpCode[j];
// }
//}
Systemoutprintln("初始化种群,需要填入代码");
//get the initial fitness to the member iFitness
computeFitness();
//get the initial best individual and fitness
recordBest();
}
//compute the fitness of every individual in current population
void computeFitness()
{
//计算每个个体适应度
//int time = 0;
//for(int i = 0; i < popNum; ++i)
//{
// time = 0;
// for(int j = 0; j < codes[i]length - 1; ++j)
// {
// time += tpGraphEdge(codes[i][j], codes[i][j + 1])getCost(time);
// }
// iFitness[i] = factor - time;
// if(iFitness[i] < 0)
// {
// Systemoutprintln("错误,某个个体适应度过小使得适配值出现负数");//lkdebug
// Systemexit(1);
// }
//}
Systemoutprintln("计算每个个体适应度,需要填入代码");
}
//record the current best fitness and the according individual
void recordBest()
{
int bestIndex = -1;
for(int i = 0; i < popNum; ++i)
{
if(curBestFitness < iFitness[i])
{
curBestFitness = iFitness[i];
bestIndex = i;
}
}
//记录最优个体
if(bestIndex > -1)
{
// for(int i = 0; i < curBestCodelength; ++i)
// {
// curBestCode[i] = codes[bestIndex][i];
// }
}
Systemoutprintln("记录最优个体,需要填入代码");
}
//selection and reproduce individual in population
void selIndividual()
{
int tmpiFitness[] = new int[iFitnesslength];
tmpiFitness[0] = iFitness[0];
//建立临时群体用于选择交换
//复制个体
//清除原来的群体
//int tmpCode[][] = new int[popNum][];
//for(int i = 0; i < codeslength; ++i)
//{
// tmpCode[i] = new int[codes[i]length];//
// for(int j = 0; j < codes[i]length; ++j)
// {//copy to tmpCode and reset codes
// tmpCode[i][j] = codes[i][j];
// codes[i][j] = -1;
// }
//}
Systemoutprintln("复制个体,需要填入代码");
for(int i = 1; i < tmpiFitnesslength; ++i)
{
tmpiFitness[i] = tmpiFitness[i - 1] + iFitness[i];
//iFitness[i] = 0;
}
//轮盘赌选择个体
for(int i = 0; i < popNum; ++i)
{
int rFit = new Random()nextInt(tmpiFitness[tmpiFitnesslength - 1]);
for(int j = 0; j < tmpiFitnesslength; ++j)
{
if(rFit < tmpiFitness[j])
{
rFit = j;//record the index of the individual
break;
}
}
if(rFit == 0)
{
iFitness[i] = tmpiFitness[rFit];
}
else
{
iFitness[i] = tmpiFitness[rFit] - tmpiFitness[rFit - 1];//copy fitness
}
//选择个体
//for(int j = 0; j < tmpCode[rFit]length; ++j)
//{
// codes[i][j] =tmpCode[rFit][j];
//}
Systemoutprintln("选择个体,需要填入代码");
}
//get the copied fitness in iFitness
}
//match every two individual and cross the code
void matchCross()
{
//需要填入代码
Systemoutprintln("配对交叉,需要填入代码");
}
//mutate by a specifical probability
void mutate()
{
//按照一定的概率进行变异
Systemoutprintln("按照一定的概率进行变异,需要填入代码");
}
//evolve current population
void evolve()
{
selIndividual();
matchCross();
mutate();
}
//compute the approximative best value by GA
//find approximative best solution by GA
public void compute()
{
initPopulation();
//while((evolutionTim < evolutionLim) && (eliminTim < eliminLim))
while(evolutionTim < evolutionLim)
{
evolve();
//get the initial fitness to the member iFitness
computeFitness();
//get the initial best individual and fitness
recordBest();
++evolutionTim;
}
}
}
以上就是关于遗传算法求解全部的内容,包括:遗传算法求解、请问什么是遗传算法,并给两个例子、为什么环境的复杂性会导致组织的复杂性请给予解释。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)