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);


  • 相关阅读:
    DEV控件GridControl常用属性设置(转)
    【649】shapely strtree STRtree 构建 RTree
    【648】计算直线间的夹角
    【646】灰度图array转为RGB三通道array
    【645】OpenCV 相关函数说明
    【644】二值图去掉面积小的部分 cv2.threshold
    Makefile中include、-include、sinclude
    openssh交叉编译
    四元数插值
    循环求余法
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3170448.html
Copyright © 2011-2022 走看看