遗传算法 简单程序应用
发布网友
发布时间:2022-07-13 23:14
我来回答
共4个回答
热心网友
时间:2023-09-13 15:19
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;
}
}
热心网友
时间:2023-09-13 15:20
自己看吧
http://wenku.baidu.com/view/f82fd604cc175527072208d4.html追问就一段代码 我拿来有什么用,。。
热心网友
时间:2023-09-13 15:20
发给你了 请查收和给分
热心网友
时间:2023-09-13 15:21
已经发了追问没收到。。
遗传算法matlab程序代码
遗传算法主循环 for gen = 1:num_gen 计算适应度 fitness = arrayfun(@(ind) fitness_func(ind), pop);选择操作(这里简单使用轮盘赌选择)selected_indices = rouletteWheelSelection(fitness, pop_size);mating_pool = pop(selected_indices, :);交叉操作(单点交叉)offspring = crossover(mating...
基因表达相关性分析
基因表达相关性分析是迈杰转化医学研究(苏州)有限公司的核心业务之一。我们运用先进的生物信息学工具和方法,对大量基因表达数据进行深入挖掘,旨在揭示不同基因间的相互作用及其与生物表型之间的关联性。通过相关性分析,我们能够识别出与特定疾病、药物反应或生物过程密切相关的基因群,为精准医疗、药物研发及生物学研究提供有力的数据支持和理论依据,助力客户加速科研进程,推动生命科学领域的发展。迈杰转化医学研究(苏州)有限公司于2013年成立,其前身为凯杰(苏州)转化医学研究有限公司。基于基因组学、蛋白组学、细胞组学及病理组学等综合性转化医学平台,丰富的伴随诊断开发经验,高质量的管理体系以及高素质的研发管理团队,迈杰转化...
遗传算法求最小值点
用遗传算法求已知函数的最小值点的方法:1、首先建立自定义函数,f(x)ga_fun=@(x)11*sin(6*x)+7*cos(5*x);2、其二用ga()函数求解最小值 [x,fval,exitflag] = ga(ga_fun,1,[],[],[],[],lb)3、然后用ezplot()函数或plot()函数,绘出其函数f(x)的图形及最小值点 4、运行结...
请问能给几个遗传算法的应用实例么,越简单越好,如果有java程序实现的就...
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, ...
遗传算法有哪些有趣应用?
体的表现型x和基因型X之间可通过编码和解码程序相互转换。2) 初始群体的产生遗传算法是对群体进行的进化操作,需要给其淮备一些表示起始搜索点的初始群体数据。本例中,群体规模的大小取为4,即群体由4个个体组成,每个个体可通过随机方法产生。选择运算(或称为复制运算)把当前群体中适应度较高的个体按...
有一个C#遗传算法程序求y=x*x在[0,31]范围内的极值。有的地方看不太懂...
遗传算法的主要步骤是4步,初始化种群,选择,交叉,变异。这里说的淘汰函数,很可能就是在选择选择算子,这个算子是根据最适合最优先的算法来实现。举个简单的例子,你要用数字进行遗传算法,肯定得把他转化为2进制的染色体,【0-31】就是从00000-11111,每条染色体5个基因。对于选择运算来说,每次要从...
谁有遗传算法的一些源程序啊,尽量别太复杂的。麻烦哪位达人帮帮忙啊,这...
现在,程序通过循环来考察各基因组,把它们相应的适应性分数一个一个累加起来,直到这一 部分累加和 大于 fSlice 值时,就返回该基因组。就是这样简单。3.4.4.2 重温杂交操作(Crossover Revisited)这一函数要求2个染色体在同一随机位置上断裂开,然后将它们在断开点以后的部分进行互换,以形成 2 个...
遗传算法
%遗传算法子程序%Name: decodebinary.m%产生 [2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制function pop2=decodebinary(pop)[px,py]=size(pop); %求pop行和列数for i=1:pypop1(:,i)=2.^(py-i).*pop(:,i);endpop2=sum(pop1,2); %求pop1的每行之和% 2.2.2 将二...
游戏人工智能的遗传算法
遗传算法是根据生物进化思想而启发得出的一种全局优化算法。遗传算法简介:对问题产生一个描述,对待解决问题进行编码。随机初始化群体X(0)=(x1, x2, … xn)。对当前群体X(t)中每个个体xi计算其适应度F(xi),适应度表示了该个体的性能好坏。应用选择算子产生优良种群goodX(t)。对goodX(t)应用遗...
matlab遗传算法求最小包容圆
function r=rmax(p,x)p :已知平面点集。p的每一列就是一点的x y坐标。x :包络圆的中心坐标。a=x(1);b=x(2);r=max(((p(1,:)-a).^2+(p(2,:)-b).^2).^0.5);易知,当r取值最小时,即为最小包络圆。下面是matlab求解程序:p=rand(2,10);%已知平面点列。p的每一列就是...
用遗传算法工具箱求解一个多目标优化问题,现在需要一个matlab程序,求高 ...
输入 >> optimtool %调用遗传算法工具箱 3、在遗传算法工具箱界面中,分别对Fitness function框内输入@ga_fun1();A框内输入[1,1,1];b框内输入16;Aeq框内输入[];beq框内输入[];Lower框内输入[0,0,0];Upper框内输入[];4、单击Start。得到x=4.508 y=2.513 z=1.912值。