当前位置:文档之家› 人工智能实验。遗传算法的实现

人工智能实验。遗传算法的实现

crossoverRate=Float.parseFloat(JOptionPane.showInputDialog("请输入交叉率0-0.2)"));
mutationRate=Float.parseFloat(JOptionPane.showInputDialog("请输入突变率0-0.2)"));
lefttb=(float)(Math.floor(geneY[sjintdata]/0.01));
middtb=(float)(Math.floor(10*Math.random()));
righttb=(float)((geneY[sjintdata]%0.01)%0.1);
geneY[sjintdata]=(float)(lefttb*0.01+middtb*0.1+righttb);
Thread threadc=new Thread(threada);
threadc.start();
}
static class gbck extends WindowAdapter
right1=geneX[sjintdata1]%10;
left2=(float)(Math.floor(geneX[sjintdata2]/10));
right2=geneX[sjintdata2]%10;
geneX[sjintdata1]=left1*10+right2;
geneX[sjintdata2]=left2*10+right1;
【实验环境】
Windows 7
Jdk 1.7
myeclise
【实验过程与结果】(附主要源码及运行结果截图)
1、源代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import ng.Math.*;
lefttb=(float)(Math.floor(geneX[sjintdata]/0.01));
middtb=(float)(Math.floor(10*Math.random()));
righttb=(float)((geneX[sjintdata]%0.01)%0.1);
geneX[sjintdata]=(float)(lefttb*0.01+middtb*0.1+righttb);
//种群初始化
geneX=new float [geneNumber];
geneY=new float [geneNumber];
fit=new float [geneNumber];
fitness=new float [geneNumber];
cumulativeProbability=new float [geneNumber+1];
if(k>generation-2)
{
System.exit(0);
}
Thread.sleep((int)(1000));
}
catch(InterruptedException e)
{
System.out.println(e.toString());
}
repaint();
}
public static void ycsf()
private static int sjintdata;
private static int sjintdata1;
private static int sjintdata2;
private static float left1;
private static float right1;
private static float left2;
private static int geneNumber;
private static int generation;
private static float crossoverRate;
private static float mutationRate;
private static float sjdata;
for(int j=0;j<geneNumber;j++)
{
if ((sjdata<cumulativeProbability[j+1])&&(sjdata>cumulativeProbability[j]))
{
geneX[i]=geneXX[j];
geneY[i]=geneYY[j];
}
}
}
//基因的交叉
ycsf();
gapid threada=new gapid();
threada.setTitle("用遗传算法优化PID参数");
threada.setSize(800,600);
threada.addWindowListener(new gbck());
threada.setVisible(true);
left1=(float)(Math.floor(geneY[sjintdata1]/10));
right1=geneY[sjintdata1]%10;
left2=(float)(Math.floor(geneY[sjintdata2]/10));
right2=geneY[sjintdata2]%10;
private static float h;
private static int k=0;
public void run()
{
repaint();
}
public void paint(Graphics g)
{
g.setColor(new Color(0,0,0));
for(int i=0;i<geneNumber;i++)
private static float right2;
private static float lefttb;
private static float middtb;
private static float righttb;
private static float min=10000;
private static float s;
人工智能
实 验 报 告
实验名称__遗传算法的设计与实现_
学 院数计学院
班 级计科21202
学 号**********
姓 名许 小 刚
学 号
1261081068
姓名
许小刚
实验日期
2015 5 13
实验名称
遗传算法的设计与实现
【实验目的】
通过人工智能课程的学习,熟悉遗传算法的简单应用
【实验内容】
用遗传算法求解f (x) = x2的最大值,x∈[0,31],x取整数。
for(int i=0;i<geneNumber;i++)
{
geneX[i]=(float)(1000*Math.random());
geneY[i]=(float)(600*Math.random());
}
cumulativeProbability[0]=0;
//基因开始演化直到满足所需精度为止。
{
for(int i=0;i<geneNumber;i++)
{
//计算每个基因的适应度。
s = (float)(-0.5+Math.sin(Math.sqrt(Math.pow(geneX[i],2)+Math.pow(geneY[i],2))));
h = (float)(Math.pow((1+0.001*(Math.pow(geneX[i],2)+Math.pow(geneY[i],2))),2));
可以看出该函数比较简单,只要是为了体现遗传算法的思想,在问题选择上,选了一个比较容易实现的,把主要精力放在遗传算法的实现,以及核心思想体会上。
【实验原理】遗传算法:遗传算法是借鉴生物界自然选择和群体进化机制形成的一种全局寻优算法。与传统的优化算法相比,遗传算法具有如下优点:不是从单个点,而是从多个点构成的群体开始搜索;在搜索最优解过程中,只需要由目标函数值转换得来的适应值信息,而不需要导数等其它辅助信息;搜索过程不易陷入局部最优点。目前,该算法已渗透到许多领域,并成为解决各领域复杂问题的有力工具。在遗传算法中,将问题空间中的决策变量通过一定编码方法表示成遗传空间的一个个体,它是一个基因型串结构数据;同时,将目标函数值转换成适应值,它用来评价个体的优劣,并作为遗传操作的依据。遗传操作包括三个算子:选择、交叉和变异。选择用来实施适者生存的原则,即把当前群体中的个体按与适应值成比例的概率复制到新的群体中,构成交配池(当前代与下一代之间的中间群体)。选择算子的作用效果是提高了群体的平均适应值。由于选择算子没有产生新个体,所以群体中最好个体的适应值不会因选择操作而有所改进。交叉算子可以产生新的个体,它首先使从交配池中的个体随机配对,然后将两两配对的个体按某种方式相互交换部分基因。变异是对个体的某一个或某一些基因值按某一较小概率进行改变。从产生新个体的能力方面来说,交叉算子是产生新个体的主要方法,它决定了遗传算法的全局搜索能力;而变异算子只是产生新个体的辅助方法,但也必不可少,因为它决定了遗传算法的局部搜索能力。交叉和变异相配合,共同完成对搜索空间的全局和局部搜索
fit[i]= (float)(Math.abs(-0.5+(s / h)));
sump=sump+fit[i];
if(min>fit[i])
相关主题