1.什么是遗传算法?
就个人理解,遗传算法是模拟神奇的大自然中生物“优胜劣汰”原则指导下的进化过程,好的基因有更多的机会得到繁衍,这样一来,随着繁衍的进行,生物种群会朝着一个趋势收敛。而生物繁衍过程中的基因杂交和变异会给种群提供更好的基因序列,这样种群的繁衍趋势将会是“长江后浪推前浪,一代更比一代强”,而不会是只受限于祖先的最好基因。而程序可以通过模拟这种过程来获得问题的最优解(但不一定能得到)。要利用该过程来解决问题,受限需要构造初始的基因组,并为对每个基因进行适应性分数(衡量该基因的好坏程度)初始化,接着从初始的基因组中选出两个父基因(根据适应性分数,采用轮盘算法进行选择)进行繁衍,基于一定的杂交率(父基因进行杂交的概率)和变异率(子基因变异的概率),这两个父基因会生成两个子基因,然后将这两个基因放入种群中,到这里繁衍一代完成,重复繁衍的过程直到种群收敛或适应性分数达到最大。
2.利用遗传算法解决迷宫寻路问题。
代码如下:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class MazeProblem extends JFrame{
//当前基因组
private static List<Gene> geneGroup = new ArrayList<>();
private static Random random = new Random();
private static int startX = 2;
private static int startY = 0;
private static int endX = 7;
private static int endY = 14;
//杂交率
private static final double CROSSOVER_RATE = 0.7;
//变异率
private static final double MUTATION_RATE = 0.0001;
//基因组初始个数
private static final int POP_SIZE = 140;
//基因长度
private static final int CHROMO_LENGTH = 70;
//最大适应性分数的基因
private static Gene maxGene = new Gene(CHROMO_LENGTH);
//迷宫地图
private static int[][] map = {
{
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{
1,0,1,0,0,0,0,0,1,1,1,0,0,0,1},
{
5,0,0,0,0,0,0,0,1,1,1,0,0,0,1},
{
1,0,0,0,1,1,1,0,