⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gene.java

📁 This is a java implementation for solving NQueen problem using genetic algorithm.Enjoy it!
💻 JAVA
字号:
package ir.ac.iust.evoalgs.nqueen;

import java.util.Arrays;
import java.util.Random;

public class Gene {
	private int[] string;
	private int dim;

	public Gene(int[] string) {
		this.string = string;
		dim = string.length;
	}
	
	public Gene(int dim, boolean randomInit) {
		this.dim = dim;
		
		string = new int[dim];
		if (randomInit) fillRandomGene();
	}
	
	private void fillRandomGene() {
		
		for (int i = 0; i < dim; i++)
			string[i] = -1;
		
		boolean[] flags = new boolean[dim];
		Random rand = new Random();
		for (int i = 0; i < dim; i++) {
			while (string[i] == -1) {
				int randNum = rand.nextInt(dim);
				if (!flags[randNum]) {
					string[i] = randNum;
					flags[randNum] = true;
				}
			}
		}
	}

	public int[] getString() {
		return string;
	}

	public void setString(int[] string) {
		this.string = string;
	}
	
	public Gene[] crossOver(Gene secondParent) {
		Gene[] children = new Gene[2];
		children[0] = new Gene(dim, false);
		children[1] = new Gene(dim, false);
		
		int[] st1 = new int[dim];
		int[] st2 = new int[dim];
		
		int pivot = new Random().nextInt(dim);
		
		System.arraycopy(string, 0, st1, 0, pivot);
		System.arraycopy(secondParent.string, 0, st2, 0, pivot);
		
		int lastCopied = 0;
		int t = -1;
		for (int i = pivot; i < dim; i++) {
			int target = -1;
			t++;
			for (int j = lastCopied; j < dim; j++) {
				target = secondParent.string[j];
				boolean exist = false;
				for (int ii = 0; ii < pivot + t; ii++) {
					if (target == st1[ii]) {
						exist = true;
					} 
				}
				if (!exist) {
					st1[i] = target;
					lastCopied = j;
					break;
				}
			}
		}

		lastCopied = 0;
		t = -1;
		for (int i = pivot; i < dim; i++) {
			int target = -1;
			t++;
			for (int j = lastCopied; j < dim; j++) {
				target = string[j];
				boolean exist = false;
				for (int ii = 0; ii < pivot + t; ii++) {
					if (target == st2[ii]) {
						exist = true;
					}
				}
				if (!exist) { 
					st2[i] = target;
					lastCopied = j;
					break;
				}
			}
		}
		
		children[0].setString(st1);
		children[1].setString(st2);
		return children;
	}
	
	public void mutate() {
		int size = string.length;
		
		Random rand = new Random();
		int firstIdx = rand.nextInt(size);
		int secondIdx = -1;
		
		do {
			secondIdx = rand.nextInt(size);
		} while (firstIdx == secondIdx);


		int firstVal = string[firstIdx];
		int secondVal = string[secondIdx];
		
		string[firstIdx] = secondVal;
		string[secondIdx] = firstVal;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((string == null) ? 0 : string.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (!(obj instanceof Gene))
			return false;
		Gene other = (Gene) obj;
		if (string == null) {
			if (other.string != null)
				return false;
		} else if (!string.equals(other.string))
			return false;
		return true;
	}
	
	@Override
	public String toString() {
		return Arrays.toString(string);
	}

	public static void main(String [] args) {
		Gene g1 = new Gene(25, true);
		Gene g2 = new Gene(25, true);
		
		Gene[] children = g1.crossOver(g2);
		
		System.out.println(g1.toString());
		System.out.println(children[0].toString());
		children[0].mutate();
		System.out.println(children[0].toString());

		System.out.println("");
		
		System.out.println(g2.toString());
		System.out.println(children[1].toString());
		children[1].mutate();
		System.out.println(children[1].toString());
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -