遗传算法解非线性方程
- 格式:doc
- 大小:51.50 KB
- 文档页数:9
智能优化算法 python 解方程智能优化算法在解方程方面的应用是一项非常有意义的研究领域。
通过利用智能算法,我们可以自动地找到方程的解,大大提高了解方程的效率和准确性。
本文将介绍一些常见的智能优化算法在解方程问题中的应用,并通过Python代码示例来说明其实现方法。
我们来介绍一种常用的智能优化算法——遗传算法。
遗传算法是模拟生物进化过程的一种优化算法。
其基本思想是通过模拟生物的遗传、变异和选择等过程,逐步演化出最优解。
在解方程问题中,遗传算法可以用来寻找方程的根。
下面我们以一个简单的一元二次方程为例,来说明遗传算法在解方程中的应用。
假设我们要解方程:x^2 - 3x + 2 = 0。
首先,我们需要定义一个适应度函数,用来评估每个个体的适应度。
在这个例子中,我们可以使用方程的根与0的距离作为适应度函数的值。
接下来,我们需要定义遗传算法的参数,如种群大小、交叉概率、变异概率等。
然后,我们随机生成初始种群,并通过遗传算法的操作(选择、交叉和变异)对种群进行迭代优化,直到找到满足适应度函数要求的最优解。
下面是使用Python实现遗传算法解方程的示例代码:```pythonimport random# 定义适应度函数def fitness_function(x):return abs(x**2 - 3*x + 2)# 定义遗传算法参数population_size = 100crossover_rate = 0.8mutation_rate = 0.01max_generations = 100# 随机生成初始种群population = [random.uniform(-10, 10) for _ in range(population_size)]# 迭代优化for generation in range(max_generations):# 计算适应度值fitness_values = [fitness_function(x) for x in population]# 选择操作selected_population = random.choices(population, weights=[1/fitness for fitness in fitness_values], k=population_size)# 交叉操作offspring_population = []for i in range(0, population_size, 2):parent1 = selected_population[i]parent2 = selected_population[i+1]if random.random() < crossover_rate:offspring1 = (parent1 + parent2) / 2offspring2 = (parent1 - parent2) / 2else:offspring1 = parent1offspring2 = parent2offspring_population.extend([offspring1,offspring2])# 变异操作for i in range(population_size):if random.random() < mutation_rate:offspring_population[i] += random.uniform(-0.1, 0.1)# 更新种群population = offspring_population# 输出最优解best_solution = min(population, key=fitness_function)print("最优解为:", best_solution)```上述代码通过遗传算法迭代优化的方法,最终得到了方程的最优解。
Matlab实验报告一.实验目的利用遗传算法解超越方程二.实验原理遗传算法是一类借鉴生物界的进化规律(适者生存、优胜劣汰遗传机制)演化而来的随机化搜索方法。
遗传算法是一种群体型操作,该操作以群体中的所有个体为对象。
选择、交叉、变异是基本的遗传操作。
遗传算法的主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;有更好的全局搜索能力,采用概率化的方法,自动获取并指导优化搜索空间。
三.实验内容及步骤1.参数设定clcclearglobal BitLength %需要编码的长度global boundsbegin %自变量的起始点global boundsendbounds=[0 60]; %一维自变量的取值范围precision=0.0001; %运算精度boundsbegin=bounds(:,1);boundsend=bounds(:,2);BitLength=ceil(log2((boundsend-boundsbegin)' ./ precision));%ceil 不小于它的最小整数%种群初始化popsize=100; %初始种群大小population=round(rand(popsize,BitLength)); %初始种群,N个%交叉概率pc = 0.8;%变异概率pmutation = 0.06;Generation=1;global GenerationnmaxGenerationnmax =888;设定自变量x范围[0,60]交叉概率0.8 变异概率0.06 运算精度0.0001初始种群大小100 迭代次数8882.迭代过程while Generation<(Generationnmax+1)for j=1:2:popsize%1对1对的群体进行如下操作(交叉,变异)[Fitvalue,cumsump]=fitnessfun(population);%选择操作seln=selection(population,cumsump)%交叉操作scro=crossover(population,seln,pc);scnew(j,:)=scro(1,:);scnew(j+1,:)=scro(2,:);%变异smnew(j,:)=mutation(scnew(j,:),pmutation);smnew(j+1,:)=mutation(scnew(j+1,:),pmutation);end%更新种群population= smnew;%计算新种群的适应度[Fitvalue,cumsump]=fitnessfun(population);%记录当前代最好的适应度和平均适应度[fmax,nmax]=max(Fitvalue);%最好的适应度为fmax(即函数值最大),其对应的个体为nmaxfmean=mean(Fitvalue); %平均适应度为fmeanymax(Generation)=fmax; %每代中最好的适应度ymean(Generation)=fmean; %每代中的平均适应度%记录当前代的最佳染色体个体x=transform2to10(population(nmax,:));%population(nmax,:)为最佳染色体个体xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength)-1);xmax(Generation)=xx;Generation=Generation+1 ;End现分布实验迭代一次的步骤①计算当前种群的函数值及适应度累积和%计算适应度函数function [Fitvalue,cumsump]=fitnessfun(population)popsize=size(population,1);boundsbegin=0;boundsend=60;BitLength=20;for i=1:popsizex=transform2to10(population(i,:)); %将二进制转换为十进制xx(i)=boundsbegin+x*(boundsend-boundsbegin) /(power(2,BitLength));%转化为[0,60]区间的实数Fitvalue(i)=targetfun(xx(i)); %计算即适应值endtotalfit = sum(Fitvalue);p_fitvalue = 1-Fitvalue/totalfit;cumsump(1)=p_fitvalue(1) ;for i=2:popsizecumsump(i)=cumsump(i-1)+p_fitvalue(i) ;%求累计概率endcumsump=cumsump' ; %累计概率end种群初始化时,产生100*20的0-1随机矩阵,若要计算其对应的函数值,首先需要将这100行数据由二进制转为10进制function x=transform2to10(Population);BitLength=size(Population,2); %Population的列,即2进制的长度x=Population(BitLength);for i=1:BitLength-1x=x+Population(BitLength-i)*power(2,i); %从末位加到首位endend按位乘方并相加(行求和),即可将数据由二进制转为十进制自变量下限种群中第个个体数值自变量变化范围染色体长度(字节长度)使转化后得到的十进制种群个体数据落在自变量范围内。
第七章 遗传算法应用举例遗传算法提供了一种求解非线性、多模型、多目标等复杂系统优化问题的通用框架,它不依赖于问题具体的领域。
随着对遗传算法技术的不断研究,人们对遗传算法的实际应用越来越重视,它已经广泛地应用于函数优化、组合优化、自动控制、机器人学、图象处理、人工生命、遗传编码、机器学习等科技领域。
遗传算法已经在求解旅行商问题、背包问题、装箱问题、图形划分问题等多方面的应用取得了成功。
本章通过一些例子,介绍如何利用第五章提供的遗传算法通用函数,编写MATLAB 程序,解决实际问题。
7.1 简单一元函数优化实例利用遗传算法计算下面函数的最大值:()sin(10) 2.0[1,2]f x x x x π=⋅+∈-,选择二进制编码,种群中个体数目为40,每个种群的长度为20,使用代沟为0.9,最大遗传代数为25。
下面为一元函数优化问题的MA TLAB 代码。
figure(1);fplot ('variable.*sin(10*pi*variable)+2.0',[-1,2]); %画出函数曲线% 定义遗传算法参数NIND= 40; % 个体数目(Number of individuals)MAXGEN = 25; % 最大遗传代数(Maximum number of generations)PRECI = 20; % 变量的二进制位数(Precision of variables)GGAP = 0.9; % 代沟(Generation gap)trace=zeros (2, MAXGEN); % 寻优结果的初始值FieldD = [20;-1;2;1;0;1;1]; % 区域描述器(Build field descriptor) Chrom = crtbp(NIND, PRECI); % 初始种群gen = 0; % 代计数器variable=bs2rv(Chrom,FieldD); % 计算初始种群的十进制转换 ObjV = variable.*sin (10*pi*variable)+2.0; % 计算目标函数值while gen < MAXGEN,FitnV = ranking (-ObjV); % 分配适应度值(Assign fitness values) SelCh = select ('sus', Chrom, FitnV , GGAP); % 选择SelCh = recombin ('xovsp',SelCh,0.7); % 重组SelCh = mut(SelCh); % 变异variable=bs2rv(SelCh,FieldD); % 子代个体的十进制转换ObjVSel =variable.*sin(10*pi*variable)+2.0; % 计算子代的目标函数值[Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV ,ObjVSel); % 重插入子代的新种群 gen = gen+1; % 代计数器增加% 输出最优解及其序号,并在目标函数图象中标出,Y 为最优解,I 为种群的序号[Y,I]=max(ObjV),hold on;plot (variable (I),Y, 'bo');trace (1,gen)=max (ObjV); %遗传算法性能跟踪trace (2,gen)=sum (ObjV)/length (ObjV);endvariable=bs2rv (Chrom,FieldD); %最优个体的十进制转换hold on,grid;plot (variable',ObjV','b*');figure (2);plot (trace (1,:)');hold on;plot (trace (2,:)','-.');grid;legend ('解的变化','种群均值的变化')使用基于适应度的重插入确保四个最适应的个体总是被连续传播到下一代。
新方法:
1、拟牛顿法:拟牛顿法是一种基于牛顿法的迭代方法,它使用一个近似的牛顿步骤来求解非线性方程组。
它的优点是可以收敛到全局最优解,而且收敛速度快。
2、模拟退火法:模拟退火法是一种基于模拟退火的迭代方法,它使用一个模拟退火步骤来求解非线性方程组。
它的优点是可以收敛到全局最优解,而且收敛速度快。
3、遗传算法:遗传算法是一种基于遗传算法的迭代方法,它使用一个遗传算法步骤来求解非线性方程组。
它的优点是可以收敛到全局最优解,而且收敛速度快。
4、模糊逻辑算法:模糊逻辑算法是一种基于模糊逻辑的迭代方法,它使用一个模糊逻辑步骤来求解非线性方程组。
它的优点是可以收敛到全局最优解,而且收敛速度快。
河北工业大学硕士学位论文基于遗传算法的微分方程求解问题的研究姓名:王晓翠申请学位级别:硕士专业:计算机应用技术指导教师:武优西20071101河北工业大学硕士学位论文基于遗传算法的微分方程求解问题的研究摘要遗传算法提供了一种求解非线性、多模型、多目标等复杂系统优化问题的通用框架,它不依赖于问题的具体领域,已经广泛应用于函数优化、组合优化、自动控制、机器学习等科技领域。
自然科学和工程技术中的许多问题被归结为微分方程这一数学形式,而微分方程通常难以解析求解。
本文提出了利用最小二乘原理将微分方程的求解问题转化为求函数最小值的最优化问题,然后利用遗传算法进行进化计算求解常微分和偏微分方程,仿真实验验证了该方法的可行性。
本论文首先分析了课题的研究背景及意义,总结了国内外的研究现状,指出了现阶段求解微分方程的几种方法,并在此基础上进一步确立了利用遗传算法来求解微分方程作为本论文的主要研究内容。
其次,阐述了遗传算法的基本实现机理,并对遗传算法的特点及应用进行了比较详细的叙述,同时简要介绍了MATLAB遗传算法工具箱。
再次,在详细论述了遗传算法理论的基础上,研究了遗传算法在求解微分方程中的应用。
分别介绍了常微分方程及偏微分方程求解问题转化为最优化问题的基本过程,针对常微分方程和偏微分方程分别提出了方程解析解的构造方法,利用遗传算法进行进化计算,并通过实例说明了遗传算法中各个参数的设置方法,最终求得方程的近似最优解。
最后通过具体实例分析了该方法的求解过程,对结果进行了相应的误差分析,验证了该方法的可行性。
最后对本课题的研究进行了总结和进一步展望。
关键词:遗传算法,最优化问题,常微分方程,偏微分方程,构造函数基于遗传算法微分方程求解问题的研究GENETIC ALGORITHM FOR SOLVING ORDINARY AND PARTIAL DIFFERENTIAL EQUATIONSABSTRACTGenetic algorithm brings up a common frame to solve complex system problems, such as non-linear, multi-model, multi-objective and so on. It does not depend on the specific areas of problems and has been applied to many technological areas like functional optimization, combination optimization, auto-control, machine learning. Many problems in natural science and engineering technology could be expressed in a form of differential equations, while it is often difficult to solve that. This article presented a method to transform the problem of solving differential equations to the problem of optimization according to least square principle and some examples were solved to prove it feasible.The paper firstly analyzes the background and meanings of the research work and summarizes the research present situations home and abroad. At the same time, several methods solving differential equations now have been pointed out. Based on above, to solve differential equations with genetic algorithm is established as the main research contents.Secondly, the basic of genetic algorithm is elaborated and its characteristics and applications is detailed, meanwhile it also introduces the tools of genetic algorithm in MATLAB.Thirdly, based on above, genetic algorithm applying to solve differential equations is researched. How to transform the solving problem to optimization problem and how to construct analytical solution is proposed. Also it gives a method to set some parameters through the process solving some examples and the feasibility of the method is illustrated by putting it into solving those examples.At last, the research work is summarized and expected.KEY WORDS: genetic algorithm, optimization problem, ordinary differential equation, partial differential equation, constructed function原创性声明本人郑重声明:所呈交的学位论文,是本人在导师指导下,进行研究工作所取得的成果。
线性规划问题中的遗传算法求解研究遗传算法在线性规划问题中的应用研究引言线性规划是一种常见的优化问题,它的目标是在一组线性约束条件下,寻找使得目标函数最大或最小的变量值。
传统的解决线性规划问题的方法包括单纯形法、内点法等。
然而,随着计算机技术的发展,人工智能算法也开始在解决这类问题上发挥作用。
其中,遗传算法作为一种模仿生物进化过程的优化算法,被广泛应用于线性规划问题中。
一、遗传算法的基本原理遗传算法是一种仿生优化算法,它模拟生物进化的过程,通过不断的选择、交叉和变异等操作,逐步优化解空间中的解。
其基本原理包括以下几个步骤:1. 初始化种群:随机生成一组初始解,每个解都代表线性规划问题的一个可能解。
2. 适应度评估:计算每个解的适应度,即目标函数值。
适应度越高,说明解越优。
3. 选择操作:根据适应度对解进行选择,高适应度的解更有可能被选中,从而保留下来。
4. 交叉操作:选取两个解进行基因的交叉,生成新的解。
交叉操作可以保留两个解中优秀的特征,有利于搜索更优解。
5. 变异操作:对新生成的解进行基因突变,引入随机因素,增加搜索的多样性。
变异操作有助于跳出局部最优解,寻找全局最优解。
6. 重复以上步骤,直到满足停止条件。
二、遗传算法在线性规划问题中的求解过程1. 根据线性规划问题的约束条件和目标函数,确定决策变量的范围和约束条件。
2. 初始化种群:随机生成一组初始解作为种群。
3. 计算适应度:对于每个解,计算目标函数的值作为适应度。
4. 选择操作:根据适应度,选择一部分解作为下一代种群,保留适应度较高的解。
5. 交叉操作:选取两个解,通过交叉操作生成新的解。
可以使用单点交叉、多点交叉等不同的交叉方式。
6. 变异操作:对新生成的解进行变异操作,引入随机因素,增加解空间的多样性。
7. 重复进行步骤4至步骤6,直到满足停止条件。
8. 输出最优解:根据迭代过程中的适应度值,选择最优解作为线性规划问题的解。
三、遗传算法在线性规划问题中的优势1. 全局搜索能力:遗传算法能够通过交叉和变异操作进行全局搜索,避免陷入局部最优解。
数学物理方程的数值解法数学物理方程是自然界和科学中描述物体运动、能量转化和相互作用的基本规律。
我们通常使用数值解法来求解这些方程,以得到近似的解析解。
数值解法既可以用于数学问题,也可以用于物理问题。
本文将介绍几种常见的数学物理方程的数值解法。
一、微分方程的数值解法微分方程是描述物体运动和变化的重要工具。
常见的微分方程有常微分方程和偏微分方程。
常见的数值解法包括:1. 欧拉法(Euler's method)欧拉法是最简单的数值解法之一,通过将微分方程离散化为差分方程,在每个小时间步长上近似计算微分方程的导数。
欧拉法易于实现,但精度相对较低。
2. 龙格-库塔法(Runge-Kutta method)龙格-库塔法是一类常用的数值解法,包括二阶、四阶等不同的步长控制方法。
龙格-库塔法通过计算多个离散点上的导数来近似微分方程,精度较高。
3. 有限差分法(Finite difference method)有限差分法是一种常用的数值解法,将微分方程转化为差分方程并在网格上逼近微分方程的导数。
有限差分法适用于边值问题和初值问题,且精度较高。
二、积分方程的数值解法积分方程描述了给定函数的积分和积分变换之间的关系。
常见的数值解法有:1. 数值积分法数值积分法是通过数值逼近求解积分方程,常用的数值积分法包括梯形法则、辛普森法则等。
数值积分法适用于求解一维和多维积分方程。
2. 蒙特卡洛法(Monte Carlo method)蒙特卡洛法通过随机采样和统计分析的方法,将积分方程转化为概率问题,并通过大量的随机样本来估计积分值。
蒙特卡洛法适用于高维空间和复杂积分方程。
三、优化问题的数值解法优化问题是寻找在给定约束条件下使目标函数取得极值的数学问题。
常见的数值解法有:1. 梯度下降法(Gradient descent method)梯度下降法是一种常用的优化算法,通过迭代和梯度方向来寻找目标函数的局部最优解。
梯度下降法适用于连续可导的优化问题。
MATLAB 智能算法30个案例分析(终极版)1 基于遗传算法的TSP算法(王辉)2 基于遗传算法和非线性规划的函数寻优算法(史峰)3 基于遗传算法的BP神经网络优化算法(王辉)4 设菲尔德大学的MATLAB遗传算法工具箱(王辉)5 基于遗传算法的LQR控制优化算法(胡斐)6 遗传算法工具箱详解及应用(胡斐)7 多种群遗传算法的函数优化算法(王辉)8 基于量子遗传算法的函数寻优算法(王辉)9 多目标Pareto最优解搜索算法(胡斐)10 基于多目标Pareto的二维背包搜索算法(史峰)11 基于免疫算法的柔性车间调度算法(史峰)12 基于免疫算法的运输中心规划算法(史峰)13 基于粒子群算法的函数寻优算法(史峰)14 基于粒子群算法的PID控制优化算法(史峰)15 基于混合粒子群算法的TSP寻优算法(史峰)16 基于动态粒子群算法的动态环境寻优算法(史峰)17 粒子群算法工具箱(史峰)18 基于鱼群算法的函数寻优算法(王辉)19 基于模拟退火算法的TSP算法(王辉)20 基于遗传模拟退火算法的聚类算法(王辉)21 基于模拟退火算法的HEV能量管理策略参数优化(胡斐)22 蚁群算法的优化计算——旅行商问题(TSP)优化(郁磊)23 基于蚁群算法的二维路径规划算法(史峰)24 基于蚁群算法的三维路径规划算法(史峰)25 有导师学习神经网络的回归拟合——基于近红外光谱的汽油辛烷值预测(郁磊)26 有导师学习神经网络的分类——鸢尾花种类识别(郁磊)27 无导师学习神经网络的分类——矿井突水水源判别(郁磊)28 支持向量机的分类——基于乳腺组织电阻抗特性的乳腺癌诊断(郁磊)29 支持向量机的回归拟合——混凝土抗压强度预测(郁磊)30 极限学习机的回归拟合及分类——对比实验研究(郁磊)智能算法是我们在学习中经常遇到的算法,主要包括遗传算法,免疫算法,粒子群算法,神经网络等,智能算法对于很多人来说,既爱又恨,爱是因为熟练的掌握几种智能算法,能够很方便的解决我们的论坛问题,恨是因为智能算法感觉比较“玄乎”,很难理解,更难用它来解决问题。
基于KLEE的软件漏洞测试用例自动生成技术黄琦1,2,蔡爱华1,2,吕慧颖3,彭武2,王冬海2,陈君华4【摘要】摘要:为解决KLEE中STP求解器无法对非线性求解约束条件求解的问题,将改进的遗传算法应用于KLEE中自动生成软件漏洞测试用例。
通过改进遗传算法,将其应用于求解非线性方程并编程实现求解模块;通过KLEE 的改进,让其能够调用遗传算法求解模块与STP求解器共同运行;通过接口的对接,完成KLEE中两个求解模块的并行运行,自动生成软件漏洞的测试用例。
对比实验自动生成测试用例数据与原来KLEE的求解数据,对比结果表明了改进的遗传算法可应用于KLEE自动生成测试用例,其具有可行性、正确性、有效性。
【期刊名称】计算机工程与设计【年(卷),期】2016(037)006【总页数】6【关键词】测试用例;软件漏洞挖掘;改进的遗传算法;KLEE;约束求解0 引言测试用例是检测软件漏洞[1]的前提条件,近年来有很多测试用例生成的工具,例如:KLEE[2]、EXE[3]、CUTE[4]、DART[5]等。
KLEE涉及到动态追踪、符号执行、路径约束收集和求解等多方面技术,且当目标程序的规模较大,开销较大,存在不少缺陷问题,且由于动静结合分析技术比较新颖,正处于探索研究阶段,体系并不成熟,还存在不少不足之处。
当生成非线性的约束问题时,KLEE中的STP[6]求解器将无法对其进行求解,导致有些路径无法被测试用例遍历到,所以很多生成的测试软件测试效率较低,因此找到一种方法能够将KLEE改进为求解非线性的约束条件,从而提高测试路径覆盖,对提高测试效率非常有意义。
本文通过解决非线性约束条件的求解问题来提高测试效率,为了更好解决非线性约束条件的求解,对遗传算法进行了改进,将求解结果返回给KLEE自动生成测试用例,使测试用例覆盖被测程序中的更多路径,提高了漏洞挖掘的效率。
1 改进遗传算法对非线性约束条件求解由于传统的遗传算法在对非线性方程组求解方面存在局部搜索能力不强、收敛速度较慢、二进制编码精度较低等缺点。
摘要电力系统的接地网是维护电力系统安全可靠运行、保障运行人员和电气设备安全的重要设备,但往往由于接地网的导体腐蚀、断裂等故障,引起或者扩大事故,带来巨大的经济损失和不良的社会影响。
因此,诊断接地网的断点和腐蚀情况已经成为电力部门的一项重大反事故措施。
根据地网接地引下线之间电阻或者转移电阻的测量值,建立合适的模型,求出地网各段导体的电阻值,进而判断地网是否有断裂或者被腐蚀的导体存在以及它们的位置。
但是受到可及节点数目总是小于地网支路数目的限制,得到的故障诊断方程都是欠定的,而且方程还没有显式的解析表达式,直接求解困难很多。
针对上述问题,本文从模型和求解两方面接地网故障诊断方法做了深入详细的分析和研究。
分析了故障诊断模型的特点,根据矩阵分析的基本理论,考虑用基于遗传算法的最小二乘法来求解诊断方程。
避免了由与简化过程所带来的误差,从而使地网故障诊断方程的以直接求解。
本文建立和求解的数学模型的过程可以分为三步:首先,根据可及节点的数目建立非线性隐式方程;其次,求解非线性约束规划问题,以能量达到最小构造目标函数;最后,将遗传算法引入对非线性故障诊断方程的求解过程中,用遗传算法求出满足目标函数的全局最优解,并收到了良好的效果。
关键词:接地网,故障诊断,遗传算法ABSTRACTThe grounding grids of substations are important equipment to keep stable operation of power system and safety to operator and power apparatus. But the grounding faults due to corrosion of substation grounding grid often take place. The corrosion of these grounding grid and electromotive force of grounding current, can induce grounding grid fault. These grounding grid faults often bring huge economical lost and bad society effect. So how to diagnosis the corrosion condition of grounding grid and its location is a very important measure remained to electric power system to guard against grounding faults.If the relationship between port resistances and conductor resistance is given, conductor resistance can be computed from port resistances through mathematical analysis. Comparing these results with the initial values that they are designed to be, the accurate current corrosion status of all grounding conductors under ground can be known. But the number of those touchable nodes is always fewer than that of the branches, the function we obtain according electric circuit theory is a function which number is fewer than its variable, and they have no explicit analytic expression. To solve the function straightly become very difficult.From above problems, this thesis gives some in-depth and detailed analysis about corrosion of substation grounding grid from its model and solution. After analyzing the characteristics of model, and based on matrix analysis theory, one solution is proposed. That is, we can use implicit function to satisfy all demands from optimization a rithmetics, such as differential coefficient, grids or determinant, which makes sure that simplified errors can be prevent and our model can be solved too. The mathematic models in this thesis can be divided into three parts: part one, to sum up solving the implict equation; part two, to sum up solving a nonlinear constrained optimization problem; part three, bring Genetic Algorithms into solving the model of nonlinear implict equation, and get a good result.KEY WORDS: grounding grid,corrosion diagnosis, Genetic Algorithms目录第1章绪论 (1)1.1 研究问题的工程背景 (1)1.2 国内外研究现状 (2)1.3 本文的主要工作 (3)1.3.1 主要研究内容 (3)1.3.2 论文章节编排 (4)第2章矩阵知识和遗传算法概述 (5)2.1 函数矩阵的基本运算及其性质 (5)2.2 函数矩阵的导数 (7)2.3 遗传算法概述 (9)第3章接地网故障诊断原理及其数学模型 (13)3.1 接地网故障诊断原理 (13)3.2 数学模型 (16)3.2.1 约束规划模型 (16)3.2.2 工程简化模型 (17)3.3 模型分析 (18)3.4 基于遗传算法的非线性最小二乘优化算法 (21)3.4.1 遗传算法的主要实现技术 (22)3.4.2 本文中遗传算法的实现 (24)3.3 本章小结 (25)第4章地网故障诊断实例研究 (27)4.1 算例1 (27)4.2 算例2 (33)4.3 算例3 (36)4.4 本章小结 (39)第5章结论与展望 (41)致谢 (42)参考文献 (43)附录 (45)附录1 (45)附录2 (48)附录3 (53)第1章绪论1.1研究问题的工程背景发电厂、变电站的接地网是保证电力系统安全可靠运行的重要措施。
第二章基本遗传算法及改进Holland创建的遗传算法是一种概率搜索算法,它利用某种编码技术作用于称为染色体的数串,其基本思想是模拟由这些串组成的个体进化过程。
该算法通过有组织地、然而是随机地进行信息交换,重新组合那些适应性好的串。
在每一代中,利用上一代串结构中适应好的位和段来生成一个新的串的群体;作为额外增添,偶尔也要在串结构中尝试用新的位和段来替代原来的部分。
遗传算法是一类随机优化算法,但是它不是简单的随机走动,它可以有效地利用已经有的信息处理来搜索那些有希望改善解质量的串。
类似于自然进化,遗传算法通过作用于染色体上的基因,寻找好的染色体来求解问题。
与自然界相似,遗传算法对待求解问题本身一无所知,它所需要的仅是对算法所产生的每个染色体进行评价,并基于适应度值来改变染色体,使适用性好的染色体比适应性差的染色体有更多的繁殖机会。
2.1 遗传算法的运行过程遗传算法模拟了自然选择和遗传中发生的复制、交叉和变异等现象,从任一初始种群(population)出发,通过随机选择、交叉和变异操作,产生一群更适应环境的个体,使群体进化到搜索空间中越来越好的区域,这样一代一代地不断繁衍进化,最后收敛到一群最适应环境的个体(Individual),求得问题的最优解。
2.1.1 完整的遗传算法运算流程完整的遗传算法运算流程可以用图2.2来描述。
由图2.2可以看出,使用上述三种遗传算子(选择算子、交叉算子、变异算子) 的遗传算法的主要运算过程如下:(1) 编码:解空间中的解数据x,作为遗传算法的表现型形式。
从表现型到基因型的映射称为编码。
遗传算法在进行搜索之前先将解空间的解数据表示成遗传空间的基因型串结构数据,这些串结构数据的不同组合就构成了不同的点。
(2) 初始群体的生成:随机产生N个初始串结构数据,每个串结构数据称为一个个体,N 个个体构成了一个群体。
遗传算法以这N个串结构作为初始点开始迭代。
设置进化代数计数器t←0;设置最大进化代数T;随机生成M个个体作为初始群体P(0) 。
遗传算法解非线性方程组的Matlab程序程序用MATLAB语言编写。
之所以选择MATLB,是因为它简单,但又功能强大。
写1行MATLAB程序,相当于写10行C++程序。
在编写算法阶段,最好用MATLAB语言,算法验证以后,要进入工程阶段,再把它翻译成C++语言。
本程序的算法很简单,只具有示意性,不能用于实战。
非线性方程组的实例在函数(2)nonLinearSumError1(x)中,你可以用这个实例做样子构造你自己待解的非线性方程组。
%注意:标准遗传算法的一个重要概念是,染色体是可能解的2进制顺序号,由这个序号在可能解的集合(解空间)中找到可能解%程序的流程如下:%程序初始化,随机生成一组可能解(第一批染色体)%1: 由可能解的序号寻找解本身(关键步骤)%2:把解代入非线性方程计算误差,如果误差符合要求,停止计算%3:选择最好解对应的最优染色体%4:保留每次迭代产生的最好的染色体,以防最好染色体丢失%5: 把保留的最好的染色体holdBestChromosome加入到染色体群中%6: 为每一条染色体(即可能解的序号)定义一个概率(关键步骤)%7:按照概率筛选染色体(关键步骤)%8:染色体杂交(关键步骤)%9:变异%10:到1%这是遗传算法的主程序,它需要调用的函数如下。
%由染色体(可能解的2进制)顺序号找到可能解:%(1)x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionS um);%把解代入非线性方程组计算误差函数:(2)functionError=nonLinearSumError1(x); %判定程是否得解函数:(3)[solution,isTrue]=isSolution(x,funtionError,solutionSumError);%选择最优染色体函数:%(4)[bestChromosome,leastFunctionError]=best_worstChromosome(fatherC hromosomeGroup,functionError);%误差比较函数:从两个染色体中,选出误差较小的染色体%(5)[holdBestChromosome,holdLeastFunctionError]...%=compareBestChromosome(holdBestChromosome,holdLeastFunctionError,... % bestChromosome,leastFuntionError)%为染色体定义概率函数,好的染色体概率高,坏染色体概率低%(6)p=chromosomeProbability(functionError);%按概率选择染色体函数:%(7)slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p );%父代染色体杂交产生子代染色体函数%(8)sonChrmosomeGroup=crossChromosome(slecteChromosomeGroup,2); %防止染色体超出解空间的函数%(9)chromosomeGroup=checkSequence(chromosomeGroup,solutionSum)%变异函数%(10)fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.8,soluti onN);%通过实验有如下结果:%1。
染色体应当多一些%2。
通过概率选择染色体,在迭代早期会有效选出优秀的染色体,使解的误差迅速降低,%但随着迭代的进行,概率选择也会导致某种染色体在基因池中迅速增加,使染色体趋同,%这就减少了物种的多样性,反而难以逼近解%3。
不用概率选择,仅采用染色体杂交,采用保留优秀染色体,也可以得到解%%%%%%%%%%%%%%%%%%%%%%%%程序开始运行clear,clc;%清理内存,清屏circleN=200;%迭代次数format long%%%%%%%%%%%%%%%构造可能解的空间,确定染色体的个数、长度solutionSum=4;leftBoundary=-10;rightBoundary=10;distance=1;chromosomeSum=500;solutionSumError=0.1;%solutionSum:非线性方程组的元数(待解变量的个数);leftBoundary:可能解的左边界;%rightBoundary:可能解的右边界;distance:可能解的间隔,也是解的精度%chromosomeSum:染色体的个数;solveSumError:解的误差oneDimensionSet=leftBoundary:distance:rightBoundary;%oneDimensionSet:可能解在一个数轴(维)上的集合oneDimensionSetN=size(oneDimensionSet,2);%返回oneDimensionSet中的元素个数solutionN=oneDimensionSetN^solutionSum;%解空间(解集合)中可能解的总数binSolutionN=dec2bin(solutionN);%把可能解的总数转换成二进制数chromosomeLength=size(binSolutionN,2);%由解空间中可能解的总数(二进制数)计算染色体的长度%%%%%%%%%%%%%%%%程序初始化%随机生成初始可能解的顺序号,+1是为了防止出现0顺序号solutionSequence=fix(rand(chromosomeSum,1)*solutionN)+1;for i=1:chromosomeSum%防止解的顺序号超出解的个数if solutionSequence(i)>solutionN;solutionSequence(i)=solutionN;endend%染色体是解集合中的序号,它对应一个可能解%把解的十进制序号转成二进制序号fatherChromosomeGroup=dec2bin(solutionSequence,chromosomeLength); holdLeastFunctionError=Inf;%可能解的最小误差的初值holdBestChromosome=0;%对应最小误差的染色体的初值%%%%%%%%%%%%%%%%%%开始计算circle=0;while circle<circleN%开始迭代求解circle=circle+1;%记录迭代次数%%%%%%%%%%%%%1:由可能解的序号寻找解本身(关键步骤)x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionSum); %%%%%%%%%%%%%2:把解代入非线性方程计算误差functionError=nonLinearSumError1(x);%把解代入方程计算误差[solution,minError,isTrue]=isSolution(x,functionError,solutionSumError);%isSolution函数根据误差functionError判定方程是否已经解开,isTrue=1,方程得解。
solution是方程的解if isTrue==1'方程得解'solutionminErrorcirclereturn%结束程序end%%%%%%%%%%%%%3:选择最好解对应的最优染色体[bestChromosome,leastFunctionError]=best_worstChromosome(fatherChrom osomeGroup,functionError);%%%%%%%%%%%%%4:保留每次迭代产生的最好的染色体%本次最好解与上次最好解进行比较,如果上次最好解优于本次最好解,保留上次最好解;%反之,保留本次最好解。
保留的最好染色体放在holdBestChromosome中[holdBestChromosome,holdLeastFunctionError]...=compareBestChromosome(holdBestChromosome,holdLeastFunctionError,... bestChromosome,leastFunctionError);%circle%minError%solution%holdLeastFunctionError%%%%%%%%%%%%%%5:把保留的最好的染色体holdBestChromosome加入到染色体群中order=round(rand(1)*chromosomeSum);if order==0order=1;endfatherChromosomeGroup(order,:)=holdBestChromosome;functionError(order)=holdLeastFunctionError; %%%%%%%%%%%%%%%6:为每一条染色体(即可能解的序号)定义一个概率(关键步骤)%%%%%%%%%%%%%%%好的染色体概率高,坏的概率低。
依据误差functionError计算概率[p,trueP]=chromosomeProbability(functionError);if trueP =='Fail''可能解严重不适应方程,请重新开始'return%结束程序end%%%%%%%%%%%%%%%7:按照概率筛选染色体(关键步骤)%fa=bin2dec(fatherChromosomeGroup)%显示父染色体%从父染体中选择优秀染色体%selecteChromosomeGroup=selecteChromosome(fatherChromosomeGroup,p );%%%%%%%%%%%%%%%8:染色体杂交(关键步骤)%sle=bin2dec(selecteChromosomeGroup)%显示选择出来的解的序号(染色体)%用概率筛选出的染色体selecteChromosomeGroup进行杂交,产生子代染色体%sonChromosomeGroup=crossChromosome(selecteChromosomeGroup,2);%不用概率筛选出的染色体selecteChromosomeGroup进行杂交,而直接用上一代(父代)的sonChromosomeGroup=crossChromosome(fatherChromosomeGroup,2);%cro=bin2dec(sonChromosomeGroup)%显示杂交后的子代染色体sonChromosomeGroup=checkSequence(sonChromosomeGroup,solutionN);%检查杂交后的染色体是否越界%%%%%%%%%%%%%%%9:变异%不杂交直接变异%fatherChromosomeGroup=varianceCh(fatherChromosomeGroup,0.1,solutio nN);%杂交后变异fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.1,solutionN); fatherChromosomeGroup=checkSequence(fatherChromosomeGroup,solutionN );%检查变异后的染色体是否越界end函数(1):由染色体(可能解的2进制)顺序号找到可能解%这个函数找出染色体(可能解的序号)对应的可能解xfunction x=chromosome_x(chromosomeGroup,oneDimensionSet,solutionSum) %chromosomeGroup:染色体,也是可能解的二进制序号%oneDimensionSet:一维数轴上的可能解%solutionSum:非线性方程组的元数,也就是待解方程中未知变量的个数[row oneDimensionSetN]=size(oneDimensionSet);%oneDimensionSetN:一维数轴上可能解的个数chromosomeSum=size(chromosomeGroup);%chromosomeSum:染色体的个数xSequence=bin2dec(chromosomeGroup);%把可能解的二进制序号(染色体)转换成十进制序号for i=1:chromosomeSum%i:染色体的编号remainder=xSequence(i);for j=1:solutionSumdProduct=oneDimensionSetN^(solutionSum-j);%sNproduct:quotient=remainder/dProduct;remainder=mod(remainder,dProduct);%mod:取余函数if remainder==0oneDimensionSetOrder=quotient;%oneDimensionSetOrder:可能解在数轴上的序号elseoneDimensionSetOrder=fix(quotient)+1;%fix:取整函数endif oneDimensionSetOrder==0oneDimensionSetOrder=oneDimensionSetN;endx(i,j)=oneDimensionSet(oneDimensionSetOrder);endend函数(2):把解代入非线性方程组计算绝对误差函数:function funtionError=nonLinearSumError1(X)%方程的解是-7,5,1,-3 funtionError=...[abs(X(:,1).^2-sin(X(:,2).^3)+X(:,3).^2-exp(X(:,4))-50.566253390821)+... abs(X(:,1).^3+X(:,2).^2-X(:,4).^2+327)+...abs(cos(X(:,1).^4)+X(:,2).^4-X(:,3).^3-624.679868769613)+...abs(X(:,1).^4-X(:,2).^3+2.^X(:,3)-X(:,4).^4-2197)];函数(3):判定程是否得解函数:%判断方程是否解开function [solution,minError,isTrue]=isSolution(x,functionError,precision) [minError,xi]=min(functionError);%找到最小误差,最小误差所对应的行号solution=x(xi,:);if minError<precisionisTrue=1;elseisTrue=0;end%函数(4):选择最优染色体函数:%找出最小误差所对应的最好染色体,最大误差所对应的最坏染色体function[bestChromosome,leastFunctionError]=best_worstChromosome(chromosome Group,functionError)[leastFunctionError minErrorOrder]=min(functionError);%[maxFunctionError maxErrorOrder]=max(functionError); bestChromosome=chromosomeGroup(minErrorOrder,:);%worstChromosome=chromosomeGroup(maxErrorOrder,:);函数(5):误差比较函数:从两个染色体中,选出误差较小的染色体%选择最好的基因保留下来function [newBestChromosome,newLeastFunctionError]...=compareBestChromosome(oldBestChromosome,oldLeastFunctionError,... bestChromosome,leastFunctionError)if oldLeastFunctionError>leastFunctionErrornewLeastFunctionError=leastFunctionError;newBestChromosome=bestChromosome;elsenewLeastFunctionError=oldLeastFunctionError;newBestChromosome=oldBestChromosome;end函数(6):为染色体定义概率函数,好的染色体概率高,坏染色体概率低%根据待解的非线性函数的误差计算染色体的概率function [p,isP]=chromosomeProbability(x_Error)InfN=sum(isinf(x_Error));%估计非线性方程计算的结果NaNN=sum(isnan(x_Error));if InfN>0 || NaNN>0isP='Fail';p=0;returnelseisP='True';errorReciprocal=1./x_Error;sumReciprocal=sum(errorReciprocal);p=errorReciprocal/sumReciprocal;%p:可能解所对应的染色体的概率end函数(7):按概率选择染色体函数:function chromosome=selecteChromosome(chromosomeGroup,p)cumuP=cumsum(p);%累积概率,也就是把每个染色体的概率映射到0~1的区间[chromosomeSum,chromosomeLength]=size(chromosomeGroup);for i=1:chromosomeSum%这个循环产生概率值rN=rand(1);if rN==1chromosome(i,:)=chromosomeGroup(chromosomeSum,:);elseif (0<=rN) && (rN<cumuP(1))chromosome(i,:)=chromosomeGroup(1,:);%第1条染色体被选中for j=2:chromosomeSum%这个循环确定第1条以后的哪一条染色体被选中if (cumuP(j-1)<=rN) && (rN<cumuP(j))chromosome(i,:)=chromosomeGroup(j,:);breakendendendend函数(8):父代染色体杂交产生子代染色体函数function sonChromosome=crossChromosome(fatherChromosome,parameter) [chromosomeSum,chromosomeLength]=size(fatherChromosome);%chromosomeSum:染色体的条数;chromosomeLength:染色体的长度switch parametercase 1%随机选择父染色体进行交叉重组for i=1:chromosomeSum/2crossDot=fix(rand(1)*chromosomeLength);%随机选择染色体的交叉点位randChromosomeSequence1=round(rand(1)*chromosomeSum);%随机产生第1条染色体的序号randChromosomeSequence2=round(rand(1)*chromosomeSum);%随机产生第2条染色体的序号,这两条染色体要进行杂交if randChromosomeSequence1==0%防止产生0序号randChromosomeSequence1=1;endif randChromosomeSequence2==0%防止产生0序号randChromosomeSequence2=1;endif crossDot==0 || crossDot==1sonChromosome(i*2-1,:)=fatherChromosome(randChromosomeSequence1,:); sonChromosome(i*2,:)=fatherChromosome(randChromosomeSequence2,:); else%执行两条染色体的交叉sonChromosome(i*2-1,:)=fatherChromosome(randChromosomeSequence1,:); %把父染色体整条传给子染色体sonChromosome(i*2-1,crossDot:chromosomeLength)=... fatherChromosome(randChromosomeSequence2,crossDot:chromosomeLengt h)%下一条父染色体上交叉点crossDot后的基因传给子染色体,完成前一条染色体的交叉sonChromosome(i*2,:)=fatherChromosome(randChromosomeSequence2,:); sonChromosome(i*2,crossDot:chromosomeLength)...=fatherChromosome(randChromosomeSequence1,crossDot:chromosomeLeng th)endcase 2 %父染色体的第i号与第chromosomeSum+1-i号交叉for i=1:chromosomeSum/2crossDot=fix(rand(1)*chromosomeLength);%随机选择染色体的交叉点位if crossDot==0 || crossDot==1sonChromosome(i*2-1,:)=fatherChromosome(i,:);sonChromosome(i*2,:)=fatherChromosome(chromosomeSum+1-i,:);else%执行两条染色体的交叉sonChromosome(i*2-1,:)=fatherChromosome(i,:);%把父染色体整条传给子染色体sonChromosome(i*2-1,crossDot:chromosomeLength)...=fatherChromosome(chromosomeSum+1-i,crossDot:chromosomeLength); %下一条父染色体上交叉点crossDot后的基因传给子染色体,完成前一条染色体的交叉sonChromosome(i*2,:)=fatherChromosome(chromosomeSum+1-i,:); sonChromosome(i*2,crossDot:chromosomeLength)...=fatherChromosome(i,crossDot:chromosomeLength);endendcase 3 %父染色体的第i号与第i+chromosomeSum/2号交叉for i=1:chromosomeSum/2crossDot=fix(rand(1)*chromosomeLength);%随机选择染色体的交叉点位if crossDot==0 || crossDot==1sonChromosome(i*2-1,:)=fatherChromosome(i,:);sonChromosome(i*2,:)=fatherChromosome(i+chromosomeSum/2,:);else%执行两条染色体的交叉sonChromosome(i*2-1,:)=fatherChromosome(i,:);%把父染色体整条传给子染色体sonChromosome(i*2-1,crossDot:chromosomeLength)...=fatherChromosome(i+chromosomeSum/2,crossDot:chromosomeLength); %下一条父染色体上交叉点crossDot后的基因传给子染色体,完成前一条染色体的交叉sonChromosome(i*2,:)=fatherChromosome(i+chromosomeSum/2,:); sonChromosome(i*2,crossDot:chromosomeLength)...=fatherChromosome(i,crossDot:chromosomeLength);endendend函数(9):防止染色体超出解空间的函数%检测染色体(序号)是否超出解空间的函数function chromosome=checkSequence(chromosomeGroup,solutionSum) [chromosomeSum,chromosomeLength]=size(chromosomeGroup); decimalChromosomeSequence=bin2dec(chromosomeGroup);for i=1:chromosomeSum %检测变异后的染色体是否超出解空间if decimalChromosomeSequence(i)>solutionSumchRs=round(rand(1)*solutionSum);if chRs==0chRs=1;enddecimalChromosomeSequence(i)=chRs;endendchromosome=dec2bin(decimalChromosomeSequence,chromosomeLength); 函数(10):变异函数%基因变异.染色体群中的1/10变异。