当前位置:首页 » 操作系统 » 遗传算法的应用

遗传算法的应用

发布时间: 2022-01-17 22:47:56

A. 遗传算法 简单程序应用

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

class Best {
public int generations; //最佳适应值代号
public String str; //最佳染色体
public double fitness; //最佳适应值
}

public class SGAFrame extends JFrame {

private JTextArea textArea;
private String str = "";
private Best best = null; //最佳染色体
private String[] ipop = new String[10]; //染色体
private int gernation = 0; //染色体代号
public static final int GENE = 22; //基因数
/**
* Launch the application
* @param args
*/
public static void main(String args[]) {
try {
SGAFrame frame = new SGAFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Create the frame
*/
public SGAFrame() {
super();

this.ipop = inialPops();

getContentPane().setLayout(null);
setBounds(100, 100, 461, 277);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JLabel label = new JLabel();
label.setText("X的区间:");
label.setBounds(23, 10, 88, 15);
getContentPane().add(label);

final JLabel label_1 = new JLabel();
label_1.setText("[-255,255]");
label_1.setBounds(92, 10, 84, 15);
getContentPane().add(label_1);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
SGAFrame s = new SGAFrame();
str = str + s.process() + "\n";
textArea.setText(str);
}
});
button.setText("求最小值");
button.setBounds(323, 27, 99, 23);
getContentPane().add(button);

final JLabel label_2 = new JLabel();
label_2.setText("利用标准遗传算法求解函数f(x)=(x-5)*(x-5)的最小值:");
label_2.setBounds(23, 31, 318, 15);
getContentPane().add(label_2);

final JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBounds(23, 65, 399, 164);
getContentPane().add(panel);

final JScrollPane scrollPane = new JScrollPane();
panel.add(scrollPane, BorderLayout.CENTER);

textArea = new JTextArea();
scrollPane.setViewportView(textArea);
//
}

/**
* 初始化一条染色体(用二进制字符串表示)
* @return 一条染色体
*/
private String inialPop() {
String res = "";
for (int i = 0; i < GENE; i++) {
if (Math.random() > 0.5) {
res += "0";
} else {
res += "1";
}
}
return res;
}

/**
* 初始化一组染色体
* @return 染色体组
*/
private String[] inialPops() {
String[] ipop = new String[10];
for (int i = 0; i < 10; i++) {
ipop[i] = inialPop();
}
return ipop;
}

/**
* 将染色体转换成x的值
* @param str 染色体
* @return 染色体的适应值
*/
private double calculatefitnessvalue(String str) {
int b = Integer.parseInt(str, 2);
//String str1 = "" + "/n";
double x = -255 + b * (255 - (-255)) / (Math.pow(2, GENE) - 1);
//System.out.println("X = " + x);
double fitness = -(x - 5) * (x - 5);
//System.out.println("f(x)=" + fitness);
//str1 = str1 + "X=" + x + "/n"
//+ "f(x)=" + "fitness" + "/n";
//textArea.setText(str1);

return fitness;
}

/**
* 计算群体上每个个体的适应度值;
* 按由个体适应度值所决定的某个规则选择将进入下一代的个体;
*/
private void select() {
double evals[] = new double[10]; // 所有染色体适应值
double p[] = new double[10]; // 各染色体选择概率
double q[] = new double[10]; // 累计概率
double F = 0; // 累计适应值总和
for (int i = 0; i < 10; i++) {
evals[i] = calculatefitnessvalue(ipop[i]);
if (best == null) {
best = new Best();
best.fitness = evals[i];
best.generations = 0;
best.str = ipop[i];
} else {
if (evals[i] > best.fitness) // 最好的记录下来
{
best.fitness = evals[i];
best.generations = gernation;
best.str = ipop[i];
}
}
F = F + evals[i]; // 所有染色体适应值总和

}
for (int i = 0; i < 10; i++) {
p[i] = evals[i] / F;
if (i == 0)
q[i] = p[i];
else {
q[i] = q[i - 1] + p[i];
}
}
for (int i = 0; i < 10; i++) {

double r = Math.random();
if (r <= q[0]) {
ipop[i] = ipop[0];

} else {
for (int j = 1; j < 10; j++) {
if (r < q[j]) {
ipop[i] = ipop[j];
break;
}
}
}
}
}

/**
* 交叉操作
* 交叉率为25%,平均为25%的染色体进行交叉
*/
private void cross() {
String temp1, temp2;
for (int i = 0; i < 10; i++) {
if (Math.random() < 0.25) {
double r = Math.random();
int pos = (int) (Math.round(r * 1000)) % GENE;
if (pos == 0) {
pos = 1;
}
temp1 = ipop[i].substring(0, pos)
+ ipop[(i + 1) % 10].substring(pos);
temp2 = ipop[(i + 1) % 10].substring(0, pos)
+ ipop[i].substring(pos);
ipop[i] = temp1;
ipop[(i + 1) / 10] = temp2;
}
}
}

/**
* 基因突变操作
* 1%基因变异m*pop_size 共180个基因,为了使每个基因都有相同机会发生变异,
* 需要产生[1--180]上均匀分布的
*/
private void mutation() {
for (int i = 0; i < 4; i++) {
int num = (int) (Math.random() * GENE * 10 + 1);
int chromosomeNum = (int) (num / GENE) + 1; // 染色体号

int mutationNum = num - (chromosomeNum - 1) * GENE; // 基因号
if (mutationNum == 0)
mutationNum = 1;
chromosomeNum = chromosomeNum - 1;
if (chromosomeNum >= 10)
chromosomeNum = 9;
//System.out.println("变异前" + ipop[chromosomeNum]);
String temp;
if (ipop[chromosomeNum].charAt(mutationNum - 1) == '0') {
if (mutationNum == 1) {
temp = "1" + ipop[chromosomeNum].substring

(mutationNum);
} else {
if (mutationNum != GENE) {
temp = ipop[chromosomeNum].substring(0, mutationNum -

1) + "1" + ipop

[chromosomeNum].substring(mutationNum);
} else {
temp = ipop[chromosomeNum].substring(0, mutationNum -
1) + "1";
}
}
} else {
if (mutationNum == 1) {
temp = "0" + ipop[chromosomeNum].substring

(mutationNum);
} else {
if (mutationNum != GENE) {
temp = ipop[chromosomeNum].substring(0, mutationNum -

1) + "0" + ipop

[chromosomeNum].substring(mutationNum);
} else {
temp = ipop[chromosomeNum].substring(0, mutationNum -
1) + "1";
}
}
}
ipop[chromosomeNum] = temp;
//System.out.println("变异后" + ipop[chromosomeNum]);
}
}
/**
* 执行遗传算法
*/
public String process() {
String str = "";
for (int i = 0; i < 10000; i++) {
this.select();
this.cross();
this.mutation();
gernation = i;
}
str = "最小值" + best.fitness + ",第" + best.generations + "个染色体";
return str;
}

}

B. 电力系统中关于遗传算法的应用

可以直接将X设为一个母体,每个母体由X1,X2,X3,X4组成。每一组解为一个母体。

种群大小就是你取的母体(X)的个数。

约束条件在函数中可以用if等语句实现。

我也只是用遗传算法做了一下毕业设计,没有深究,够用就行了

欢迎LL单Q我讨论.....

C. 遗传算法有什么经典应用

遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(indivial)组成。每个个体实际上是染色体(chromosome)带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑头发的特征是由染色体中控制这一特征的某种基因组合决定的。因此,在一开始需要实现从表现型到基因型的映射即编码工作。

D. 高分悬赏:遗传算法应用实例

柔性生产计划?我想在这方面,遗传算法应用的例子还是有一些的。比如说人员的安排,机器设备的调度等

E. 遗传算法的程序应用,最好举例说明。

这种很主流的算法能搜到很多。
比如遗传算法合集,包括遗传算法简介、研究热点、着作、站点、参考论文下载等:
http://www.chinaai.org/ai/neural-network/genetic-algorithm.html

看之前记得打开杀毒软件跟防火墙。

F. 遗传算法在数学上的应用

应用遗传算法搜索边坡最小安全系数的研究
陆峰 陈祖煜 李素梅
(中国水利水电科学研究院结构材料所)

提 要
本文简要介绍了滑坡滑裂面搜索问题和遗传算法,并试用遗传进化算法从边坡任意形状滑裂面组合中搜索最有可能的滑裂面,也就是使安全系数最小的滑裂面。作为实例,分析了遗传算法在天生桥二级电站首部枢纽进水口右岸滑坡分析中的应用。

关键词 边坡;安全系数;遗传算法;EMU程序。

1.前言

在应用条分法进行边坡稳定分析的过程中,从可能的滑裂面集合中确定相应最小安全系数的临界滑裂面是很关键的一步。这是一个确定安全系数这个泛函对滑裂面形状这个自变函数的极小值问题。由于实际情况的复杂性,求这一极小值的解析方法很难付诸实施。从实用角度出发,基于最优化原理发展起来的求边坡最小安全系数的方法是比较有效而且便于应用。这些方法有"穷举法"、"黄金分割法"、"鲍威尔法"等,但它们都只能应用于圆弧形滑裂面或圆弧-直线形(改良圆弧法)滑裂面的情形。对于比较符合岩质边坡的具有多个自由度的折线形滑裂面情形,孙君实用复形法取得较好的效果;陈祖煜提出了单纯形法,使最优化方法搜索边坡最危险滑裂面更加有效,且不会漏掉可能的最小值。单纯形法程序已在国内外多家工程、科研和教育单位得到应用,并不断随着应用工程案例数量的增加而不断完善[1]。单纯形法使最优化方法应用于岩质边坡稳定性分析的研究和应用前进了一大步。同为最优化方法,遗传算法是最近发展起来的一种仿生寻优算法。国内外已有一些学者试图将遗传算法应用于搜索安全系数最小的边坡滑裂面,以期获得更优的结果。文献[2]将此算法应用于基于圆弧滑裂面假定的任意形状坡面的非均质土坡情况,搜索的目标是使边坡安全系数最小的圆弧滑裂面圆心和半径。本文将在文献[1]和文献[2]的基础上,应用遗传算法搜索边坡安全系数最小的任意形状滑裂面,根据工程实践经验,主要是折线组合的滑裂面。 2.遗传算法及其应用于岩土工程的基础

如前所述,搜索边坡最危险滑裂面问题是安全系数对滑裂面形状的泛函极值问题。数值方法求解这一问题的主要手段是迭代运算。一般的迭代方法容易陷入局部极小的陷阱而出现"死循环"现象,使迭代无法进行。遗传算法很好地克服了这个缺点,是一种全局优化算法。
生物在漫长的进化过程中,从低等生物一直发展到高等生物,可以说是一个绝妙的优化过程。这是自然环境选择的结果。人们研究生物进化现象,总结出进化过程包括复制、杂交、变异、竞争和选择。一些学者从生物遗传、进化的过程得到启发,提出了遗传算法(GA)。算法中称遗传的生物体为个体(indivial),个体对环境的适应程度用适应值(fitness)表示。适应值取决于个体的染色体(chromosome),在算法中染色体常用一串数字表示,数字串中的一位对应一个基因(gene)。一定数量的个体组成一个群体(population)。对所有个体进行选择、交叉和变异等操作,生成新的群体,称为新一代(new generation)。
遗传算法计算程序的流程可以表示如下[3]:
第一步 准备工作
(1)选择合适的编码方案,将变量(特征)转换为染色体(数字串,串长为m)。通常用二进制编码。
(2)选择合适的参数,包括群体大小(个体数M)、交叉概率PC和变异概率Pm。
(3)确定适应值函数f(x)。f(x)应为正值。
第二步 形成一个初始群体(含M个个体)。在边坡滑裂面搜索问题中,取已分析的可能滑裂面组作为初始群体。
第三步 对每一染色体(串)计算其适应值fi,同时计算群体的总适应值 。
第四步 选择
计算每一串的选择概率Pi=fi/F及累计概率 。选择一般通过模拟旋转滚花轮(roulette,其上按Pi大小分成大小不等的扇形区)的算法进行。旋转M次即可选出M个串来。在计算机上实现的步骤是:产生[0,1]间随机数r,若r<q1,则第一串v1入选,否则选v2,使满足qi-1<r<qi(2≤i≤m)。可见适应值大的入选概率大。
第五步 交叉
(1) 对每串产生[0,1]间随机数,若r>pc,则该串参加交叉操作,如此选出参加交叉的一组后,随机配对。
(2) 对每一对,产生[1,m]间的随机数以确定交叉的位置。
第六步 变异
如变异概率为Pm,则可能变异的位数的期望值为Pm ×m×M,每一位以等概率变异。具体为对每一串中的每一位产生[0,1]间的随机数r,若r<Pm,则该位发生反转,如对染色体二进制编码为数字0变为1,1变为0。
如新个体数达到M个,则已形成一个新群体,转向第三步;否则转向第四步继续遗传操作。直到找到使适应值最大的个体或达到最大进化代数为止。
由于选择概率是由适应值决定的,即适应值大的染色体入选概率也较大,使选择起到"择优汰劣"的作用。交叉使染色体交换信息,结合选择规则,使优秀信息得以保存,不良信息被遗弃。变异是基因中得某一位发生突变,以达到产生确实有实质性差异的新品种。遗传算法虽是一种随机算法,但它是有导向的,它所使用的"按概率随机选择"方法是在有方向的搜索方法中的一种工具。正是这种独特的搜索方法,使遗传算法自然地避开了其它最优化算法常遇到的局部最小陷阱。遗传算法搜索最优结果的效果在数学上还没有严格的证明,但它的有效性已在许多专业的应用的得到体现。对于岩质边坡安全系数对滑裂面形状这样不可微的泛函极值问题,就目前的科学认识水平来讲,遗传算法不失为一种可以信赖的方法。 3.用遗传算法搜索安全系数最小的边坡任意形状滑裂面

在边坡(尤其是岩质边坡)最危险滑裂面搜索问题中,滑裂面的实际形状是很复杂的,起控制作用的是岩体的主要结构面和边坡的体型。从以往实际工程经验看,可以总结出岩质边坡滑裂面在顺滑方向上的剖面形状为折线,由岩体结构面和局部岩土材料的剪切破坏面连接而成。这样,搜索最危险滑裂面的问题就可以简化为从折线滑裂面组合中寻优的问题。本文用遗传进化算法解决这个问题。
(1) 定义遗传算法的目标函数
目标函数定义为边坡的安全系数,用安全系数的大小表示解的适应值。在边坡最危险滑裂面搜索问题中,解的安全系数越小,适应性能越好。
(2) 初始群体的确定
根据边坡的工程地质调查记录,根据经验初步拟定出一批滑裂面形状。如图1所示,滑裂面由点序列Ai(xi,yi)(i=1,?,N)表示。将点序列AI的坐标(xi,yi)依次排列成x1y1x2y2?xNyN的形式,经二进制编码形成一条染色体。对于拟定的滑裂面形状,其对应的安全系数用EMU程序[4]进行计算。
(3) 确定搜索范围
根据经验对每个点Ai,确定其坐标(xi,yi)的可能变化范围。在此范围内搜索导致最小安全系数的边坡滑裂面形状。
(4) 计算
将初始种群的所有拟定滑裂面形状(染色体)交给遗传算法程序进行计算。具体过程参见前文。

4.算例分析[4]

图1 天生桥二级电站首部枢纽进水口右岸滑坡示意图

选用天生桥二级电站首部枢纽进水口右岸滑坡作为算例,图1为其计算简图。滑坡高约30m,总方量为7000余m3,主要为第四系冲坡积物和施工堆碴。物理力学参数见表1。

表1 各土层物理力学性能指标
土层 密度(g/cm3) 抗剪强度指标
内摩擦角 凝聚力(kPa)
① 施工弃碴 1.85 21.8° 19.6
② 坡积土 1.85 21.8° 0.0
③ 砂土 1.85 21.8° 29.4
④ 砂质淤泥 1.85 20.8° 34.3
⑤ 河卵石、砾石 1.90 24.2° 0.0

滑坡发生前,靠近坡脚处因修建挡土墙被开挖而削弱边坡的整体稳定性,可以断定滑坡的滑裂面将从此经过。本例题还将忽略实际工程中坡顶张裂缝的影响。选用5个点的折线来模拟滑裂面形状,初步确定AiBiCiDiE(i=1~4)为可能的滑裂面。滑裂面上端点Ai的y坐标已受限制,下端点E的x、y坐标均已确定,故滑裂面只有7个自由度。按遗传算法的要求将滑裂面表示成如下形式:
xAxByBxCyCxDyD
四个模拟滑裂面的坐标和由EMU程序分析的安全系数列于表2。
表2 模拟滑裂面坐标及安全系数(坐标单位 m)
滑裂面 xA xB yB xC yC xD yD 安全系数
A1B1C1D1E 35.44 27.69 16.82 18.79 9.25 11.39 4.49 0.92
A2B2C2D2E 38.15 30.60 20.69 23.14 14.60 14.12 8.37 0.99
A3B3C3D3E 39.02 34.18 18.47 26.28 10.41 16.07 4.58 1.02
A3B3C4D4E 39.02 34.18 18.47 25.12 11.39 14.70 4.97 1. 03

限制搜索范围为每个自由度可在2.0m范围内变化。将4个排列好的数字串作为输入数据交给遗传算法程序进行编码、计算。经过大量运算,最后在最大种群代数(1000)群体中找到使安全系数最小的坐标数字串,经译码形成如下坐标:
(36.89,30.07)(33.25,21.52)(21.71,9.34)(13.54,5.07)(0.0,0.0)
即为图1中的ABCDE滑裂面。由遗传算法求出其相应的安全系数为0.90。滑裂面形式和安全系数都比较接近实际情况。

5.结语

遗传算法是一种高效的寻优算法,而且能有效地解决局部最小问题、非线性映射关系的表示、非线性映射关系不可微等普通优化算法常遇到的问题。算例的成果证明了这一特点。将遗传算法应用于滑坡滑裂面搜索问题,主要的工作是将工程问题简化成遗传算法需要的形式,简化时需详细参考地质调查资料和工程经验,务使简化的形式接近实际情况。对于简化的搜索样本,其安全系数的计算必须可靠,为此可应用一些比较成熟的计算程序,如EMU等。充分考虑实际工程地质情况和选取切合实际的搜索样本后,遗传算法程序必将能为滑坡搜索出最有可能的滑裂面。

参考文献

1 陈祖煜,邵长明,最优化方法在确定边坡最小安全系数方面的应用,岩土工程学报,Vol.10, No.4, 1998.7。
2 肖专文,张奇志,梁力,林韵梅,遗传进化算法在边坡稳定性分析中的应用,岩土工程学报,Vol.20, No.1, 1998.1。
3 周明,孙树栋,遗传算法原理及应用,国防工业出版社,1999.6。
4 陈祖煜,岩质高边坡稳定分析程序EMU,1995.5。

Research on Searching Least Factor of Safety of Slopes with Genetic Algorithm

Lu Feng Chen Zuyu Li Sumei
(Department of Structure and Material, IWHR)

Abstract

The problem of searching least factor of safety of slopes and the theory of Genetic Algorithm have been introced in this paper. This theory has been employed to solve this problem to find the most possible slide of slopes. As an example, the application of genetic algorithm on the Tianshengqiao Power Station Right Bank Slide has been presented.

Keywords: Slope, Factor of Safety, Genetic Algorithm, EMU Program.

G. 为什么遗传算法能被广泛的应用到各个领域

遗传算法在很多领域都得到应用;从神经网络研究的角度上考虑,最关心的是遗传算法在神经网络的应用。在遗传算法应用中,应先明确其特点和关键问题,才能对这种算法深入了解,灵活应用,以及进一步研究开发。一、遗传算法的特点 1.遗传算法从问题解的中集开始嫂索,而不是从单个解开始。这是遗传算法与传统优化算法的极大区别。传统优化算法是从单个初始值迭代求最优解的;容易误入局部最优解。遗传算法从串集开始搜索,复盖面大,利于全局择优。 2.遗传算法求解时使用特定问题的信息极少,容易形成通用算法程序。由于遗传算法使用适应值这一信息进行搜索,并不需要问题导数等与问题直接相关的信息。遗传算法只需适应值和串编码等通用信息,故几乎可处理任何问题。 3.遗传算法有极强的容错能力遗传算法的初始串集本身就带有大量与最优解甚远的信息;通过选择、交叉、变异操作能迅速排除与最优解相差极大的串;这是一个强烈的滤波过程;并且是一个并行滤波机制。故而,遗传算法有很高的容错能力。 4.遗传算法中的选择、交叉和变异都是随机操作,而不是确定的精确规则。这说明遗传算法是采用随机方法进行最优解搜索,选择体现了向最优解迫近,交叉体现了最优解的产生,变异体现了全局最优解的复盖。 5.遗传算法具有隐含的并行性

H. 遗传算法具体应用

1、函数优化

函数优化是遗传算法的经典应用领域,也是遗传算法进行性能评价的常用算例,许多人构造出了各种各样复杂形式的测试函数:连续函数和离散函数、凸函数和凹函数、低维函数和高维函数、单峰函数和多峰函数等。

2、组合优化

随着问题规模的增大,组合优化问题的搜索空间也急剧增大,有时在目前的计算上用枚举法很难求出最优解。对这类复杂的问题,人们已经意识到应把主要精力放在寻求满意解上,而遗传算法是寻求这种满意解的最佳工具之一。

此外,GA也在生产调度问题、自动控制、机器人学、图象处理、人工生命、遗传编码和机器学习等方面获得了广泛的运用。

3、车间调度

车间调度问题是一个典型的NP-Hard问题,遗传算法作为一种经典的智能算法广泛用于车间调度中,很多学者都致力于用遗传算法解决车间调度问题,现今也取得了十分丰硕的成果。

从最初的传统车间调度(JSP)问题到柔性作业车间调度问题(FJSP),遗传算法都有优异的表现,在很多算例中都得到了最优或近优解。


(8)遗传算法的应用扩展阅读:

遗传算法的缺点

1、编码不规范及编码存在表示的不准确性。

2、单一的遗传算法编码不能全面地将优化问题的约束表示出来。考虑约束的一个方法就是对不可行解采用阈值,这样,计算的时间必然增加。

3、遗传算法通常的效率比其他传统的优化方法低。

4、遗传算法容易过早收敛。

5、遗传算法对算法的精度、可行度、计算复杂性等方面,还没有有效的定量分析方法。

热点内容
双线性插值算法c 发布:2024-11-15 16:30:45 浏览:866
c语言和vc的区别 发布:2024-11-15 16:19:23 浏览:118
linux是免费的吗 发布:2024-11-15 15:53:44 浏览:617
多控存储 发布:2024-11-15 15:52:42 浏览:283
一年级数学分解算法 发布:2024-11-15 15:41:08 浏览:411
安卓个人热点怎么分享 发布:2024-11-15 15:40:16 浏览:264
垫钱解压 发布:2024-11-15 15:38:54 浏览:336
miui4相当于安卓什么系统 发布:2024-11-15 15:37:54 浏览:709
rc4android 发布:2024-11-15 15:27:25 浏览:742
电脑服务器机箱图片 发布:2024-11-15 15:27:18 浏览:115