本文目錄一覽:
- 1、如何用Java實現遺傳演算法?
- 2、遺傳演算法具體應用
- 3、使用java來實現在智能組卷中的遺傳演算法(急急急)
- 4、用JAVA實現遺傳演算法求最小值的問題,一直報錯,如下: 應該是越界拋的異常,如何解決呢
- 5、《Java遺傳演算法編程》pdf下載在線閱讀全文,求百度網盤雲資源
如何用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();
}
}
遺傳演算法具體應用
1、函數優化
函數優化是遺傳演算法的經典應用領域,也是遺傳演算法進行性能評價的常用算例,許多人構造出了各種各樣複雜形式的測試函數:連續函數和離散函數、凸函數和凹函數、低維函數和高維函數、單峰函數和多峰函數等。
2、組合優化
隨著問題規模的增大,組合優化問題的搜索空間也急劇增大,有時在目前的計算上用枚舉法很難求出最優解。對這類複雜的問題,人們已經意識到應把主要精力放在尋求滿意解上,而遺傳演算法是尋求這種滿意解的最佳工具之一。
此外,GA也在生產調度問題、自動控制、機器人學、圖象處理、人工生命、遺傳編碼和機器學習等方面獲得了廣泛的運用。
3、車間調度
車間調度問題是一個典型的NP-Hard問題,遺傳演算法作為一種經典的智能演算法廣泛用於車間調度中,很多學者都致力於用遺傳演算法解決車間調度問題,現今也取得了十分豐碩的成果。
從最初的傳統車間調度(JSP)問題到柔性作業車間調度問題(FJSP),遺傳演算法都有優異的表現,在很多算例中都得到了最優或近優解。
擴展資料:
遺傳演算法的缺點
1、編碼不規範及編碼存在表示的不準確性。
2、單一的遺傳演算法編碼不能全面地將優化問題的約束表示出來。考慮約束的一個方法就是對不可行解採用閾值,這樣,計算的時間必然增加。
3、遺傳演算法通常的效率比其他傳統的優化方法低。
4、遺傳演算法容易過早收斂。
5、遺傳演算法對演算法的精度、可行度、計算複雜性等方面,還沒有有效的定量分析方法。
參考資料來源:百度百科-遺傳演算法
使用java來實現在智能組卷中的遺傳演算法(急急急)
題目好像是讓你做個增強版的List ,簡單的都實現了 程序架子大概是這樣,排序查找什麼的百度搜下 演算法很多,套著每樣寫個方法就行了,測試就在main『方法里寫
public class MyList {
private String[] arr;
private int count ;
public MyList (int count){
arr = new String[count];
this.count = count;
}
public MyList (int[] intArr){
arr = new String[intArr.length];
this.count = intArr.length;
for(int i=0;iintArr.length;i++){
arr[i] = intArr[i]+””;
}
}
public MyList (String[] stringArr){
arr = stringArr;
this.count = stringArr.length;
}
public int getLength(){
return count;
}
//清空容器內的數組。
public void clearAll(){
arr = new String[count];
}
//通過給定元素下標來刪除某一元素
public void removeBySeqn(int seqn){
if(seqn = 0 seqncount){
arr[seqn] = null;
}
}
public static void main(String[] args){
MyList list = new MyList (40);
MyList list1 = new MyList ({3,2,125,56,123});
MyList list2 = new MyList ({“123”,””ad});
list2.removeBySeqn(0);
list1.clearAll();
}
}
用JAVA實現遺傳演算法求最小值的問題,一直報錯,如下: 應該是越界拋的異常,如何解決呢
具體遺傳演算法我沒研究過,但是這個異常是數組下標越界引起的,數組裡沒有數據,你去索引了第一個,肯定是哪裡不細心了,如果邏輯沒問題的話,在這一行(GeneticAlgorithmMin.java:102)加個判斷,數組長度為0就不索引,這樣就不會報錯。 不過我估計涉及到邏輯性的其他地方了,就算不報錯,程序也會有邏輯性問題,你給的資料不夠,我儘力了
《Java遺傳演算法編程》pdf下載在線閱讀全文,求百度網盤雲資源
《Java遺傳演算法編程》百度網盤pdf最新全集下載:
鏈接:
?pwd=xv3v 提取碼: xv3v
簡介:本書簡單、直接地介紹了遺傳演算法,並且針對所討論的示例問題,給出了Java代碼的演算法實現。全書分為6章。第1章簡單介紹了人工智慧和生物進化的知識背景,這也是遺傳演算法的歷史知識背景。第2章給出了一個基本遺傳演算法的實現;第4章和第5章,分別針對機器人控制器、旅行商問題、排課問題展開分析和討論,並給出了演算法實現。在這些章的末尾,還給出了一些練習供讀者深入學習和實踐。第6章專門討論了各種演算法的優化問題。
原創文章,作者:MTTU,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/131379.html