?? gene.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 + -