遗传算法(Genetic Algorithm)

遗传算法(Genetic Algorithm)
1 原理
遗传算法(Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。它是由美国的J.Holland教授1975年首先提出,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。它是现代有关智能计算中的关键技术之一。
遗传算法是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型。它的思想源于生物遗传学和适者生存的自然规律,是具有“生存+检测”的迭代过程的搜索算法。遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。 作为一种新的全局优化搜索算法,遗传算法以其简单通用、鲁棒性强、适于并行处理以及高效、实用等显著特点,在各个领域得到了广泛应用,取得了良好效果,并逐渐成为重要的智能算法之一。

遗传算法的基本步骤 :
我们习惯上把Holland1975年提出的GA称为传统的GA。它的主要步骤如下:
编码:GA在进行搜索之前先将解空间的解数据表示成遗传空间的基因型串结构数据,这些串结构数据的不同组合便构成了不同的点。
初始群体的生成:随机产生N个初始串结构数据,每个串结构数据称为一个个体, N个个体构成了一个群体。GA以这N个串结构数据作为初始点开始迭代。
适应性值评估检测:适应性函数表明个体或解的优劣性。不同的问题,适应性函数的定义方式也不同。
选择:选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁殖子孙。遗传算法通过选择过程体现这一思想,进行选择的原则是适应性强的个体为下一代贡献一个或多个后代的概率大。选择实现了达尔文的适者生存原则。
交换:交换操作是遗传算法中最主要的遗传操作。通过交换操作可以得到新一代个体,新个体组合了其父辈个体的特性。交换体现了信息交换的思想。
变异:变异首先在群体中随机选择一个个体,对于选中的个体以一定的概率随机地改变串结构数据中某个串的值。同生物界一样,GA中变异发生的概率很低,通常取值在0.001~0.01之间。变异为新个体的产生提供了机会。

GA的计算过程为:
选择编码方式
产生初始群体
计算初始群体的适应性值
如果不满足条件 {
   选择
   交换
   变异
   计算新一代群体的适应性值
}

遗传算法的特点:
遗传算法作为一种快捷、简便、容错性强的算法,在各类结构对象的优化过程中显示出明显的优势。与传统的搜索方法相比,遗传算法具有如下特点:
搜索过程不直接作用在变量上,而是在参数集进行了编码的个体。此编码操作, 使得遗传算法可直接对结构对象(集合、序列、矩阵、树、图、链和表)进行操作。
搜索过程是从一组解迭代到另一组解,采用同时处理群体中多个个体的方法,降 低了陷入局部最优解的可能性,并易于并行化。
采用概率的变迁规则来指导搜索方向,而不采用确定性搜索规则。
对搜索空间没有任何特殊要求(如连通性、凸性等),只利用适应性信息,不需要 导数等其它辅助信息,适应范围更广。

2.实例
求函数-100*(x(1)^2-x(2))^2-(1-x(1))^2的最小值,两个变量的取值范围是from [-2.048;-2.048] to [2.048;2.048].
1)使用ga工具箱
X = ga(@(x) -100*(x(1)^2-x(2))^2-(1-x(1))^2,2,[],[],[],[],[-2.048;-2.048],[2.048;2.048])
2)未使用ga工具箱

None.gif % // Generic Algorithm for function f(x1,x2) optimum
None.gif
clear all;
None.gifclose all;
None.gif
None.gif
% // Parameters
None.gif
Size = 80 ;
None.gifG
= 100 ;
None.gifCodeL
= 10 ;
None.gif
None.gifumax
= 2.048 ;
None.gifumin
=- 2.048 ;
None.gif
None.gifE
= round(rand(Size, 2 * CodeL));     % // Initial Code 产生初始群体
None.gif

None.gif
% // Main Program
None.gif
for  k = 1 : 1 :G
None.gif    time(k)
= k;
None.gif
None.gif    
% // 选择 % // 计算目标函数    
None.gif
     for  s = 1 : 1 :Size  % // 对每一行
None.gif
        m = E(s,:);
None.gif        y1
= 0 ;y2 = 0 ;
None.gif
None.gif        
% // Uncoding
None.gif
        m1 = m( 1 : 1 :CodeL);
None.gif        
for  i = 1 : 1 :CodeL
None.gif            y1
= y1 + m1(i) * 2 ^ (i - 1 );
None.gif        end
None.gif        x1
= (umax - umin) * y1 / 1023 + umin;  % // 计算参数1
None.gif

None.gif        m2
= m(CodeL + 1 : 1 : 2 * CodeL);
None.gif        
for  i = 1 : 1 :CodeL
None.gif            y2
= y2 + m2(i) * 2 ^ (i - 1 );
None.gif        end
None.gif        x2
= (umax - umin) * y2 / 1023 + umin;  % // 计算参数2
None.gif

None.gif        F(s)
= 100 * (x1 ^ 2 - x2) ^ 2 + ( 1 - x1) ^ 2 % // 计算目标函数 ,F是向量
None.gif
    end
None.gif
None.gif    Ji
= 1 . / F;
None.gif    
% // ****** Step 1 : Evaluate BestJ ******
None.gif
    BestJ(k) = min(Ji);  % // 找到F中最大的一项,保存到向量BestJ
None.gif

None.gif    fi
= F;                           % // Fitness Function
None.gif
    [Oderfi,Indexfi] = sort(fi);      % // Arranging fi small to bigger
None.gif
    Bestfi = Oderfi(Size);            % // Let Bestfi=max(fi)
None.gif
    BestS = E(Indexfi(Size),:);       % // Let BestS=E(m), m is the Indexfi belong to max(fi)
None.gif
    bfi(k) = Bestfi;
None.gif
None.gif    
% // ****** Step 2 : Select and Reproduct Operation******选择F较大的fi项
None.gif
    fi_sum = sum(fi);
None.gif    fi_Size
= (Oderfi / fi_sum) * Size;
None.gif
None.gif    fi_S
= floor(fi_Size);        % // Selecting Bigger fi value ,fi_S为80项的向量,每一项为0或1,1表示该项被选择
None.gif

None.gif    kk
= 1 ;
None.gif    
for  i = 1 : 1 :Size
None.gif        
for  j = 1 : 1 :fi_S(i)         % // Select and Reproduce
None.gif
            TempE(kk,:) = E(Indexfi(i),:);
None.gif            kk
= kk + 1 ;               % // kk is used to reproduce
None.gif
        end
None.gif    end 
% // 选择完毕
None.gif
    fprintf( ' size TempE %//d\n ' ,size(TempE))
None.gif    
None.gif    
% // ************ Step 3 : Crossover Operation ************交换
None.gif
    pc = 0.60 ;
None.gif    n
= ceil( 20 * rand);
None.gif    
for  i = 1 : 2 :(Size - 1 )
None.gif        temp
= rand;
None.gif        
if  pc > temp                   % // Crossover Condition
None.gif
             for  j = n: 1 : 20
None.gif                TempE(i,j)
= E(i + 1 ,j);
None.gif                TempE(i
+ 1 ,j) = E(i,j);
None.gif            end
None.gif        end
None.gif    end
None.gif    TempE(Size,:)
= BestS;
None.gif    E
= TempE;
None.gif    fprintf(
' size E %//d\n ' ,size(E))
None.gif
% //     pause
None.gif
     % // ************ Step 4: Mutation Operation **************
None.gif
     % // pm=0.001;
None.gif
     % // pm=0.001-[1:1:Size]*(0.001)/Size; % // Bigger fi, smaller Pm
None.gif
     % // pm=0.0;    % // No mutation
None.gif
    pm = 0.1 ;      % // Big mutation
None.gif

None.gif    
for  i = 1 : 1 :Size
None.gif        
for  j = 1 : 1 : 2 * CodeL
None.gif            temp
= rand;
None.gif            
if  pm > temp                 % // Mutation Condition
None.gif
                 if  TempE(i,j) == 0
None.gif                    TempE(i,j)
= 1 ;
None.gif                
else
None.gif                    TempE(i,j)
= 0 ;
None.gif                end
None.gif            end
None.gif        end
None.gif    end
None.gif
None.gif    
% // Guarantee TempPop(30,:) is the code belong to the best individual(max(fi))
None.gif
    TempE(Size,:) = BestS;
None.gif    E
= TempE;
None.gifend
None.gif
None.gifMax_Value
= Bestfi
None.gifBestS
None.gifx1
None.gifx2
None.giffigure(
1 );
None.gifplot(time,BestJ);
None.gifxlabel(
' Times ' );ylabel( ' Best J ' );
None.giffigure(
2 );
None.gifplot(time,bfi);
None.gifxlabel(
' times ' );ylabel( ' Best F ' );
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
遗传算法是一种借鉴生物界自然选择和进化机制发展起来的高度并行、随机、自适应搜索算法。由于其具有健壮性,特别适合于处理传统搜索算法解决不好的复杂的和非线性问题。以遗传算法为核心的进化算法已与模糊系统理论、人工神经网络等一起成为计算智能研究中的热点,受到许多学科的共同关注。 本书全面系统地介绍了遗传算法的基本理论,重点介绍了遗传算法的经典应用和国内外的新发展。全书共分11章。第1章概述了遗传算法的产生与发展、基本思想、基本操作以及应用情况;第2章介绍了基本遗传算法;第3章论述了遗传算法的数学基础;第4章分析了遗传算法的多种改进方法;第5章初步介绍了进货计算理论体系;第6章介绍了遗传算法应用于数值优化问题;第7章介绍了遗传算法应用于组合优化问题;第8章介绍了遗传算法应用于机器学习;第9章讨论了遗传算法在智能控制中的应用;第10章讨论了遗传算法与人工生命研究的相关问题;第11章介绍了遗传算法在图像处理、模式识别中的应用。 本书可供从事计算智能、自动控制、图像处理与模式识别、系统工程、优化设计、高性能计算等专业领域的研究人员阅读,也可供研究生及高年级大学生参考。 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
遗传算法是一种模拟自然进化过程的优化算法,主要用于解决复杂的优化问题。在遗传算法中,通过对个体(解)进行基因操作(交叉、变异等),不断地产生新的个体,并通过选择机制,筛选出适应度高的个体,从而逐步优化得到最优解。 下面是一个简单的遗传算法的Python实现代码: ```python import random # 定义适应度函数 def fitness(individual): # 适应度函数为 x^2 的形式,其中 x 为个体的染色体长度 return sum([gene**2 for gene in individual]) # 初始化种群 def init_population(pop_size, gene_size): population = [] for i in range(pop_size): individual = [random.randint(0, 1) for j in range(gene_size)] population.append(individual) return population # 选择操作 def selection(population): # 轮盘赌选择 fitness_values = [fitness(individual) for individual in population] total_fitness = sum(fitness_values) probabilities = [fitness/total_fitness for fitness in fitness_values] selected_population = [] for i in range(len(population)): selected_individual = None while selected_individual is None: for j in range(len(population)): if random.random() < probabilities[j]: selected_individual = population[j] break selected_population.append(selected_individual) return selected_population # 交叉操作 def crossover(parent1, parent2, crossover_rate): # 一点交叉 if random.random() > crossover_rate: return parent1, parent2 crossover_point = random.randint(1, len(parent1)-1) child1 = parent1[:crossover_point] + parent2[crossover_point:] child2 = parent2[:crossover_point] + parent1[crossover_point:] return child1, child2 # 变异操作 def mutation(individual, mutation_rate): # 每个基因以 mutation_rate 的概率发生变异 for i in range(len(individual)): if random.random() < mutation_rate: individual[i] = 1 - individual[i] return individual # 遗传算法 def genetic_algorithm(pop_size, gene_size, max_generation, crossover_rate, mutation_rate): population = init_population(pop_size, gene_size) for i in range(max_generation): population = selection(population) new_population = [] while len(new_population) < pop_size: parent1, parent2 = random.sample(population, 2) child1, child2 = crossover(parent1, parent2, crossover_rate) child1 = mutation(child1, mutation_rate) child2 = mutation(child2, mutation_rate) new_population.append(child1) new_population.append(child2) population = new_population best_individual = min(population, key=lambda individual: fitness(individual)) return best_individual # 测试 best_individual = genetic_algorithm(pop_size=100, gene_size=10, max_generation=1000, crossover_rate=0.8, mutation_rate=0.1) print(best_individual, fitness(best_individual)) ``` 在上面的代码中,定义了适应度函数、初始化种群、选择、交叉、变异等操作,并通过遗传算法不断迭代,最终得到最优解。在测试中,我们设定种群大小为100,染色体长度为10,最大迭代次数为1000,交叉率为0.8,变异率为0.1,得到的最优解为[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],适应度函数的值为0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值