zoukankan      html  css  js  c++  java
  • matlab遗传算法

    function [xv,fv] = myGA(fitness, a, b, NP, NG, Pc, Pm, eps)
    %	用遗传算法求解一维无约束优化问题
    %
    %	待优化的目标函数 fitness
    %	自变量下界 a 
    %	自变量上界 b 
    %	种群个体数 NP
    %	最大进化代数 NG
    %	杂交概率 Pc
    %	变异概率 Pm
    %	自变量离散精度 eps
    %	目标变量取最大值时自变量的值: xm
    %	目标函数的最大值 fv
    %
    %	Example:
    %		function F = fitness(x)
    %		F = x^3-60*x^2+900*x+100;   
    %   -------------------------------
    %		[xv,fv] = myGA(@fitness,0, 30, 50, 100, 0.9, 0.04, 0.01);
    %	--------------------------------------------------
    %		xv = 10
    %		fv = 4100
    %
    %	本程序在《精通MATLAB最优化计算》页315程序的基础上修改
    
    L = ceil(log2((b-a) / eps + 1));				%编码长度
    x = zeros(NP, L);								%种群
    nx = zeros(size(x));							%滚动数组
    fx = zeros(NP, 1);								%适应度
    for i = 1:NP
    	x(i,:) = Initial(L);
    end
    
    fv = -inf;
    
    for k = 1 : NG
    	for i = 1 : NP
    		fx(i) = fitness(Dec(a, b, x(i, :), L));
    		if (fx(i) > fv)
    			xv = Dec(a, b, x(i, :), L);
    			fv = fx(i);
    		end
    	end
    	
    	sumfx = sum(fx);
    	Px = fx / sumfx;
    	
    	PPx = zeros(NP, 1);
    	PPx(1) = Px(1);									%概率叠加
    	for i = 2 : NP
    		PPx(i) = PPx(i - 1) + Px(i);
    	end
    	
    	selFather = 0;
    	for i = 1 : NP
    		sita = rand();
    		for j = 1 : NP
    			if (sita <= PPx(j))
    				selFather = j;						%使用轮盘赌法进行选择父亲
    				break;
    			end
    		end
    		
    		selMother = floor(rand() * NP) + 1;			%母亲随机选择
    		posCut = floor(rand() * (L - 1)) + 1;		%交叉点
    		
    		r1 = rand();
    		if (r1 <= Pc)
    			nx(i, 1 : posCut) = x(selFather, 1:posCut);
    			nx(i, (posCut + 1) : L) = x(selMother, (posCut + 1) : L);
    			r2 = rand();
    			if (r2 <= Pm)
    				posMut = floor(rand() * L) + 1;
    				nx(i, posMut) = ~nx(i, posMut);
    			end
    		else
    			nx(i, :) = x(selFather, :);
    		end
    	end
    	
    	x = nx;
    end
    
    %--------------------------------------------------------
    %	初始化种群
    function  result = Initial(length)
    result = zeros(size(length()));
    for i = 1 : length
    	r = rand();
    	result(i) = round(r);
    end
    
    %----------------------------------------------------------
    %	编码转换
    function y = Dec(a, b, x, L)
    base = 2 .^ ((L - 1) : -1: 0);
    y = dot(base, x);
    y = a + y * (b - a) / (2 ^ L - 1);


  • 相关阅读:
    20190922 模拟
    poj3417 Network/闇の連鎖[树上差分]
    poj3280 Cheapest Palindrome[区间DP]
    poj3691 DNA repair[DP+AC自动机]
    BZOJ1030 [JSOI2007]文本生成器[DP+AC自动机]
    loj2424 「NOIP2015」子串[字符串DP]
    poj1038 Bugs Integrated, Inc.[状压DP]
    第05组 Beta冲刺 (2/5)(组长)
    第05组 Beta冲刺 (1/5)(组长)
    第05组 Alpha冲刺 总结(组长)
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3170448.html
Copyright © 2011-2022 走看看