| File |
Line |
| com\delhezi\ga\mutation\heuristics\_2Opt.java |
170 |
| com\delhezi\ga\mutation\heuristics\LinKernighan.java |
192 |
if (selectEdge(chromosome, edge1iter, edge2iter) == true) {
//System.out.println("ZNALAZLEM. Odcinki edge1=" + edge1 +
//", edge2=" + edge2 + " należy usunąć.");
changeEdge(chromosome, edge1iter, edge2iter);
return;
}
//Ustaw edge2iter o jeden dalej.
edge2iter = (edge2iter == chromosomeSize) ? 1 : edge2iter + 1;
//ZAŁOŻENIE. edge1 nigdy nie jest rowne edge2
if (edge2iter == edge2) {
//WYJŚCIE Z PETLI2
//USTAW edge2iter do następnej petli.
edge2iter = (edge2iter == chromosomeSize) ? 1 : edge2iter + 1;
koniec = true;
//Tu sprawdzamy czy po przesunieciu edge2iter wchodzi
//na edge1
//Nie musimy sprawdzać czy edge2 jest wewnątrz ścieżki
//"edge1-edge1iter", bo był przed ścieżką.
if (edge2iter == edge1) {
edge2iter = (edge1iter == chromosomeSize) ? 1
: edge1iter + 1;
}
} else { //(edge2iter != edge2)
//Sprawdź czy edge2iter wchodzi na edge1.
//Jeśli tak to przeskocz nim za ścieżką "edge1-edge1iter".
if (edge2iter == edge1) {
//USTAW edge2iter za ścieżką "edge1-edge1iter"
edge2iter = (edge1iter == chromosomeSize) ? 1
: edge1iter + 1;
//edge2 jest we wnetrzu "edge1-edge1iter"
//WYJŚCIE Z PETLI2
if ((edge2 <= edge1iter) && (edge2 >= edge1)) {
koniec = true;
break; //GOTO2
} else {
//Sprawdź czy po przeskoczeniu ścieżki nie trafisz
//edge2iter == edge2. Nie musisz sprawdzać, czy dalej
//nie ma "edge1-edge1iter", bo już była.
if (edge2iter == edge2) {
//USTAW edge2iter do następnej petli !!!
edge2iter = (edge2iter == chromosomeSize) ? 1 : edge2iter + 1;
break; //GOTO2
}
}
} //if (edge2iter == edge1)
} //koniec //(edge2iter != edge2)
} //----------- koniec PETLA 2
//Tu wychodzimy z GOTO2
edge1iter = (edge1iter == chromosomeSize) ? 1 : edge1iter + 1;
//Ewentualna korekta edge2iter
if (edge2iter == edge1iter) {
edge2iter = (edge2iter == chromosomeSize) ? 1 : edge2iter + 1;
}
}
}
/**
* Jeśli znaleziono lepszy cykl; Zamień "krzyżowo" ścieżki;
* Przykład:
* edge1=ab, edge2=cd
* Zawsze odwracamy odcinek bc.
* 1) dxxa-b12c-, edge1=ab=4, edge2=cd=8 -- wynik dxxa-c21b-
* 2) xxa-b12c-dxx, edge1=ab=3, edge2=cd=7 -- wynik xxa-c21b-dxx
* @param chromosome Chromosom.
* @param edge1 Pierwsza krawędź, wartość z zakresu <1, chromosomeSize>
* np. edge1=4 dla xxxx-xxxx.
* @param edge2 Druga krawędź, wartość z zakresu <1, chromosomeSize>
* np. edge2=8 dla xxxxxx-xx.
* @since 1.0
*/
protected final void changeEdge(Chromosome chromosome,
final int edge1,
final int edge2) {
int chromosomeSize = chromosome.size();
int pA;
int pB;
int pC;
int pD;
//Zawsze odwracamy punkty pomiędzy B a C.
if (edge1 == chromosomeSize) { //bxxxxxxxxa-
pA = edge1 - 1; //geny licza sie od 0
pB = 0;
} else { //xxxxxa-bxxx
pA = edge1 - 1; //geny licza sie od 0
pB = edge1;
}
if (edge2 == chromosomeSize) { //dxxxxxxxxc-
pC = edge2 - 1; //geny licza sie od 0
pD = 0;
} else { //xxxxxc-dxxx
pC = edge2 - 1; //geny licza sie od 0
pD = edge2;
}
//Liczba genów podlegających inwersji.
int inversionGenes = (pB < pC) ? pC - pB + 1
: (chromosomeSize - pB) + pC + 1;
//tmpGenes - sekcja inwersji po operacji inwersji.
Object[] invGenes = new Object[inversionGenes];
int ii;
if (pB < pC) {
ii = pC;
for (int i = 0; i < invGenes.length; i++) {
invGenes[i] = chromosome.getGene(ii);
ii--;
}
} else {
ii = 0;
for (int i = pC; i >= 0; i--) {
invGenes[ii++] = chromosome.getGene(i);
}
for (int i = chromosomeSize - 1; i >= pB; i--) {
invGenes[ii++] = chromosome.getGene(i);
}
}
int inv = 0;
if (edge1 < edge2) {
for (int i = edge1; i < edge2; i++) {
chromosome.setGene(i, invGenes[inv]);
inv++;
}
} else {
for (int i = edge1; i < chromosomeSize; i++) {
chromosome.setGene(i, invGenes[inv]);
inv++;
}
for (int i = 0; i < edge2; i++) {
chromosome.setGene(i, invGenes[inv]);
inv++;
}
}
chromosome.changed();
}
/**
* Funkcja sprawdza, czy udało sie wybrać właściwe krawędzie do
* usunięcia; Cykl po usunięciu wybraych krawędzi (edge1, edge2) oraz
* po utworzeniu nowych "na krzyż" powinien być badziej optymalny;
* Przykład:
* dxxa-bxxc-, edge1=ab=4, edge2=cd=8
* Jeśli długości odcinków ac+bd jest mniejsza niż ab+cd to
* znaleziono cykl lepszy (zwróć true).
* @param chromosome Chromosom.
* @param edge1 Pierwsza krawędź, wartość z zakresu <1, chromosomeSize>
* np. edge1=4 dla xxxx-xxxx.
* @param edge2 Druga krawędź, wartość z zakresu <1, chromosomeSize>
* np. edge2=8 dla xxxxxx-xx.
* @return true, w przypadku kiedy usuniecie wybranych odcinków i
* utworzenie nowych skraca cykl.
* @since 1.0
*/
protected final boolean selectEdge(Chromosome chromosome, |
| File |
Line |
| com\delhezi\ga\StateInitialized.java |
35 |
| com\delhezi\ga\StateStopped.java |
35 |
public StateInitialized(final GeneticAlgorithm ga) {
this.ga = ga;
}
/**
* Uruchamia działanie algorytmu gentycznego.
* @throws GeneticAlgorithmException xxx
* @since 1.0
*/
@Override
public final void run() throws GeneticAlgorithmException {
ga.setState(GeneticAlgorithmState.RUNNING);
while ((ga.getPopulation().getGeneration() <
ga.getMaxGenerationCount() ||
ga.getMaxGenerationCount() < 1) &&
(ga.getPopulation().getGeneration() -
ga.getPopulation().getTopChromosomeGenerationFound() <
ga.getLastGenerationTopChromosomeFind() ||
ga.getLastGenerationTopChromosomeFind() < 1)) {
if (ga.getState() != GeneticAlgorithmState.RUNNING) {
return;
}
ga.getPopulation().generation();
}
if (ga.getState() != GeneticAlgorithmState.ERROR) {
ga.setState(GeneticAlgorithmState.STOPPED);
}
}
/**
* Zatrzymuje działanie algorytmu gentycznego.
* @throws GeneticAlgorithmException xxx
* @since 1.0
*/
@Override
public final void stop() throws GeneticAlgorithmException {
return;
}
/**
* Zwraca status algorytmu gentycznego.
* @return Status algorytmu gegentycznego.
* @since 1.0
*/
@Override
public final GeneticAlgorithmState getState() {
return GeneticAlgorithmState.INITIALIZED; |
| File |
Line |
| com\delhezi\ga\mutation\heuristics\_2Opt.java |
110 |
| com\delhezi\ga\mutation\heuristics\LinKernighan.java |
129 |
assert chromosome != null : "Illegal argument chromosome: null";
int chromosomeSize = chromosome.size();
//Krawędź edge1 powininna zawierać się w obszare chromosomu.
assert (edge1 >= 1 && edge1 <= chromosomeSize)
: "Illegal argument edge1: " + edge1;
//Krawędź edge2 powininna zawierać się w obszare chromosomu.
assert (edge2 >= 1 && edge2 <= chromosomeSize)
: "Illegal argument edge2: " + edge2;
//Dla chromosomeSize <= 3 dowolne połączenie jest optymalne
if (chromosomeSize <= 3) {
return;
}
//Szukamy deterministycznie, wiec przestawiamy krawędzie
if (edge1 == edge2) {
edge2 = (edge2 == chromosomeSize) ? 1 : ++edge2;
}
int edge1iter = edge1;
int edge2iter = edge2;
boolean koniec = false;
int tmpEdge1IterNext;
//Sprawdź czy edge2iter nie jest bezpośrednio po edge1iter lub
//edge2iter nie pokrywa się z edge1iter.
//Jeśli tak to zmiana krawędzi nie zmieni porządku genów w chromosomie,
//więc od razu przestawiamy edge2iter do kolejnego przypadku.
tmpEdge1IterNext = (edge1iter == chromosomeSize) ? 1 : edge1iter + 1;
if (tmpEdge1IterNext == edge2iter) {
edge2iter = (edge2iter == chromosomeSize) ? 1 : edge2iter + 1;
}
//Poszukuj iterakcyjnie lepszego cyklu dla ścieżki.
//Kręć PETLA 2 i zwiekszaj w każdym obrocie edge2iter+1 (lub
//przejdź na początek jeśli edge2iter dojdzie do końca tablicy).
//Jeśli edge2 zatoczyło koło to zwiększ edge1+1 i ponownie
//kręć PETLA 2 zwiększając w każdej iterakcji edge2+1
//do wyczerpania wszystkich możliwości.
//Pomiń pary ścieżek powtarzające się w edge1 i edge2.
for (int i1 = 0; i1 < chromosomeSize - 2; i1++) { //PETLA 1
// TU SĄ ZAWSZE PRZYGOTOWANE ZMIENNE edge1iter, edge1, edge2iter, edge2.
//----------- PETLA 2
koniec = false;
while (koniec == false) { //Zakończ jeśli zatoczysz pełne koło
//z edge2.
//Możlie wyjście przez break wówczas idziemy
//do pętli zewnętrznej do GOTO2
//Licznik ilości podjętych prób.
if (counter == 0) {
return;
}
counter--;
//Sprawdź, czy po zmianie uzyskamy lepszy cykl.
if (selectEdge(chromosome, edge1iter, edge2iter) == true) { |
| File |
Line |
| com\delhezi\ga\GeneticAlgorithmXmlDomParserFactory.java |
99 |
| com\delhezi\ga\GeneticAlgorithmXmlSaxParserFactory.java |
121 |
throw new GeneticAlgorithmException(ex.getMessage());
}
if (fitnessFunctionOption == FitnessFunctionOption.minimisation) {
fitnessFunction.setMaximisation(false);
} else if (fitnessFunctionOption == FitnessFunctionOption.maximisation) {
fitnessFunction.setMaximisation(true);
}
ChromosomeProperties chromosomeProperties =
ChromosomeProperties.getInstance();
chromosomeProperties.setFitnessFunction(fitnessFunction);
LinkedList<Chromosome> chromosomes = null;
switch (initializeDataSource) {
case sampleTSP:
chromosomes = SampleTsp.newChromosomes(populationSize, chromosomeProperties);
break;
case db:
//UZUPEŁNIĆ
//initializePopulationConnectionName
//initializePopulationSQLQuery
chromosomes = null;
break;
}
switch (populationType) {
case PopulationChangeableSize:
try {
population = PopulationChangeableSize.newPopulationChangeableSize(
maxLT, minLT, chromosomes,
crossoverOperator, crossoverProbability,
mutationOperator, mutationProbability,
chromosomeProperties);
} catch (GeneticAlgorithmException ex) {
LOGGER.log(Level.SEVERE, null, ex);
throw new GeneticAlgorithmException(ex.getMessage()); |
| File |
Line |
| com\delhezi\ga\mutation\heuristics\_2Opt.java |
335 |
| com\delhezi\ga\mutation\heuristics\LinKernighan.java |
360 |
protected final boolean selectEdge(Chromosome chromosome,
final int edge1,
final int edge2) {
int chromosomeSize = chromosome.size();
double sizeAB;
double sizeCD;
double sizeAC;
double sizeDB;
Point pA, pB, pC, pD;
if (edge1 == chromosomeSize) { //bxxxxxxxxa-
pA = (Point) chromosome.getGene(edge1 - 1); //geny licza sie od 0
pB = (Point) chromosome.getGene(0);
} else { //xxxxxa-bxxx
pA = (Point) chromosome.getGene(edge1 - 1); //geny licza sie od 0
pB = (Point) chromosome.getGene(edge1);
}
sizeAB = distance(pA.getx(), pA.gety(), pB.getx(), pB.gety()); |