遺傳算法java算法源碼,遺傳算法起源

本文目錄一覽:

如何用Java實現遺傳算法?

通過遺傳算法走迷宮。雖然圖1和圖2均成功走出迷宮,但是圖1比圖2的路徑長的多,且複雜,遺傳算法可以計算出有多少種可能性,並選擇其中最簡潔的作為運算結果。

示例圖1:

示例圖2:

實現代碼:

import java.util.ArrayList;

import java.util.Collections;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.List;

import java.util.Random;

/**

* 用遺傳算法走迷宮

*

* @author Orisun

*

*/

public class GA {

int gene_len; // 基因長度

int chrom_len; // 染色體長度

int population; // 種群大小

double cross_ratio; // 交叉率

double muta_ratio; // 變異率

int iter_limit; // 最多進化的代數

Listboolean[] individuals; // 存儲當代種群的染色體

Labyrinth labyrinth;

int width;      //迷宮一行有多少個格子

int height;     //迷宮有多少行

public class BI {

double fitness;

boolean[] indv;

public BI(double f, boolean[] ind) {

fitness = f;

indv = ind;

}

public double getFitness() {

return fitness;

}

public boolean[] getIndv() {

return indv;

}

}

ListBI best_individual; // 存儲每一代中最優秀的個體

public GA(Labyrinth labyrinth) {

this.labyrinth=labyrinth;

this.width = labyrinth.map[0].length;

this.height = labyrinth.map.length;

chrom_len = 4 * (width+height);

gene_len = 2;

population = 20;

cross_ratio = 0.83;

muta_ratio = 0.002;

iter_limit = 300;

individuals = new ArrayListboolean[](population);

best_individual = new ArrayListBI(iter_limit);

}

public int getWidth() {

return width;

}

public void setWidth(int width) {

this.width = width;

}

public double getCross_ratio() {

return cross_ratio;

}

public ListBI getBest_individual() {

return best_individual;

}

public Labyrinth getLabyrinth() {

return labyrinth;

}

public void setLabyrinth(Labyrinth labyrinth) {

this.labyrinth = labyrinth;

}

public void setChrom_len(int chrom_len) {

this.chrom_len = chrom_len;

}

public void setPopulation(int population) {

this.population = population;

}

public void setCross_ratio(double cross_ratio) {

this.cross_ratio = cross_ratio;

}

public void setMuta_ratio(double muta_ratio) {

this.muta_ratio = muta_ratio;

}

public void setIter_limit(int iter_limit) {

this.iter_limit = iter_limit;

}

// 初始化種群

public void initPopulation() {

Random r = new Random(System.currentTimeMillis());

for (int i = 0; i population; i++) {

int len = gene_len * chrom_len;

boolean[] ind = new boolean[len];

for (int j = 0; j len; j++)

ind[j] = r.nextBoolean();

individuals.add(ind);

}

}

// 交叉

public void cross(boolean[] arr1, boolean[] arr2) {

Random r = new Random(System.currentTimeMillis());

int length = arr1.length;

int slice = 0;

do {

slice = r.nextInt(length);

} while (slice == 0);

if (slice length / 2) {

for (int i = 0; i slice; i++) {

boolean tmp = arr1[i];

arr1[i] = arr2[i];

arr2[i] = tmp;

}

} else {

for (int i = slice; i length; i++) {

boolean tmp = arr1[i];

arr1[i] = arr2[i];

arr2[i] = tmp;

}

}

}

// 變異

public void mutation(boolean[] individual) {

int length = individual.length;

Random r = new Random(System.currentTimeMillis());

individual[r.nextInt(length)] ^= false;

}

// 輪盤法選擇下一代,並返回當代最高的適應度值

public double selection() {

boolean[][] next_generation = new boolean[population][]; // 下一代

int length = gene_len * chrom_len;

for (int i = 0; i population; i++)

next_generation[i] = new boolean[length];

double[] cumulation = new double[population];

int best_index = 0;

double max_fitness = getFitness(individuals.get(best_index));

cumulation[0] = max_fitness;

for (int i = 1; i population; i++) {

double fit = getFitness(individuals.get(i));

cumulation[i] = cumulation[i – 1] + fit;

// 尋找當代的最優個體

if (fit max_fitness) {

best_index = i;

max_fitness = fit;

}

}

Random rand = new Random(System.currentTimeMillis());

for (int i = 0; i population; i++)

next_generation[i] = individuals.get(findByHalf(cumulation,

rand.nextDouble() * cumulation[population – 1]));

// 把當代的最優個體及其適應度放到best_individual中

BI bi = new BI(max_fitness, individuals.get(best_index));

// printPath(individuals.get(best_index));

//System.out.println(max_fitness);

best_individual.add(bi);

// 新一代作為當前代

for (int i = 0; i population; i++)

individuals.set(i, next_generation[i]);

return max_fitness;

}

// 折半查找

public int findByHalf(double[] arr, double find) {

if (find  0 || find == 0 || find arr[arr.length – 1])

return -1;

int min = 0;

int max = arr.length – 1;

int medium = min;

do {

if (medium == (min + max) / 2)

break;

medium = (min + max) / 2;

if (arr[medium] find)

min = medium;

else if (arr[medium] find)

max = medium;

else

return medium;

} while (min max);

return max;

}

// 計算適應度

public double getFitness(boolean[] individual) {

int length = individual.length;

// 記錄當前的位置,入口點是(1,0)

int x = 1;

int y = 0;

// 根據染色體中基因的指導向前走

for (int i = 0; i length; i++) {

boolean b1 = individual[i];

boolean b2 = individual[++i];

// 00向左走

if (b1 == false  b2 == false) {

if (x  0  labyrinth.map[y][x – 1] == true) {

x–;

}

}

// 01向右走

else if (b1 == false  b2 == true) {

if (x + 1  width labyrinth.map[y][x + 1] == true) {

x++;

}

}

// 10向上走

else if (b1 == true  b2 == false) {

if (y  0  labyrinth.map[y – 1][x] == true) {

y–;

}

}

// 11向下走

else if (b1 == true  b2 == true) {

if (y + 1  height labyrinth.map[y + 1][x] == true) {

y++;

}

}

}

int n = Math.abs(x – labyrinth.x_end) + Math.abs(y -labyrinth.y_end) + 1;

//      if(n==1)

//          printPath(individual);

return 1.0 / n;

}

// 運行遺傳算法

public boolean run() {

// 初始化種群

initPopulation();

Random rand = new Random(System.currentTimeMillis());

boolean success = false;

while (iter_limit–  0) {

// 打亂種群的順序

Collections.shuffle(individuals);

for (int i = 0; i population – 1; i += 2) {

// 交叉

if (rand.nextDouble() cross_ratio) {

cross(individuals.get(i), individuals.get(i + 1));

}

// 變異

if (rand.nextDouble() muta_ratio) {

mutation(individuals.get(i));

}

}

// 種群更替

if (selection() == 1) {

success = true;

break;

}

}

return success;

}

//  public static void main(String[] args) {

//      GA ga = new GA(8, 8);

//      if (!ga.run()) {

//          System.out.println(“沒有找到走出迷宮的路徑.”);

//      } else {

//          int gen = ga.best_individual.size();

//          boolean[] individual = ga.best_individual.get(gen – 1).indv;

//          System.out.println(ga.getPath(individual));

//      }

//  }

// 根據染色體打印走法

public String getPath(boolean[] individual) {

int length = individual.length;

int x = 1;

int y = 0;

LinkedListString stack=new LinkedListString();

for (int i = 0; i length; i++) {

boolean b1 = individual[i];

boolean b2 = individual[++i];

if (b1 == false  b2 == false) {

if (x  0  labyrinth.map[y][x – 1] == true) {

x–;

if(!stack.isEmpty() stack.peek()==”右”)

stack.poll();

else

stack.push(“左”);

}

} else if (b1 == false  b2 == true) {

if (x + 1  width labyrinth.map[y][x + 1] == true) {

x++;

if(!stack.isEmpty() stack.peek()==”左”)

stack.poll();

else

stack.push(“右”);

}

} else if (b1 == true  b2 == false) {

if (y  0  labyrinth.map[y – 1][x] == true) {

y–;

if(!stack.isEmpty() stack.peek()==”下”)

stack.poll();

else

stack.push(“上”);

}

} else if (b1 == true  b2 == true) {

if (y + 1  height labyrinth.map[y + 1][x] == true) {

y++;

if(!stack.isEmpty() stack.peek()==”上”)

stack.poll();

else

stack.push(“下”);

}

}

}

StringBuilder sb=new StringBuilder(length/4);

IteratorString iter=stack.descendingIterator();

while(iter.hasNext())

sb.append(iter.next());

return sb.toString();

}

}

《Java遺傳算法編程》pdf下載在線閱讀全文,求百度網盤雲資源

《Java遺傳算法編程》百度網盤pdf最新全集下載:

鏈接:

?pwd=xv3v 提取碼: xv3v

簡介:本書簡單、直接地介紹了遺傳算法,並且針對所討論的示例問題,給出了Java代碼的算法實現。全書分為6章。第1章簡單介紹了人工智能和生物進化的知識背景,這也是遺傳算法的歷史知識背景。第2章給出了一個基本遺傳算法的實現;第4章和第5章,分別針對機器人控制器、旅行商問題、排課問題展開分析和討論,並給出了算法實現。在這些章的末尾,還給出了一些練習供讀者深入學習和實踐。第6章專門討論了各種算法的優化問題。  

急求 遺傳算法 java程序

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;

/**

* 編寫者: 賴志環

* 標準遺傳算法求解函數

* 編寫日期: 2007-12-2

*/

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;

}

}

原創文章,作者:XTQW,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/145514.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
XTQW的頭像XTQW
上一篇 2024-10-27 23:49
下一篇 2024-10-27 23:50

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29

發表回復

登錄後才能評論