armo
Dołączył: 14 Paź 2010 Posty: 40
Przeczytał: 0 tematów
Pomógł: 1 raz Ostrzeżeń: 0/5
|
Wysłany: Sob 18:08, 18 Gru 2010 Temat postu: |
|
|
Moje wypociny.
jakoś mi zbyt szybko chodzil i dawal zbyt kiepskie wyniki
normalnie sprawdzam czy wynik poprawil sie o epsilon i jesli powrawil sie mniej to konczylem algorytm
teraz dalem mu trzy szanse: jesli trzy razy z kolei nie poprawil wyniku to koncze algorytm
i tak ma kiepskie wyniki
Kod: |
package genetycznealg;
import java.util.Random;
/**
*
* @author amanko
*/
public class AlgGenetyczny {
public static void main(String[] args) {
System.out.println(znajdzMinimum());
for(int j=0;j<xMin.length;j++)
System.out.println(" " + xMin[j]);
}
static Random r = new Random();
// mutowanie
// losowanie jednego bitu i jego zamiana na pozycji index
public static int M(int A, int index){
//Random r = new Random();
boolean random = r.nextBoolean();
//return random ? (A | (1 << index)) : A & ~(1 << index) ;
return random ? (A | (1 << index)) : A & (Integer.MAX_VALUE - (1 << index)) ;
}
// Krzyzowanie
public static int K1(int A, int B, int index){
if( (B & (1 << index))>0 )
A |= (1 << index);
else
A &= (Integer.MAX_VALUE - (1 << index)) ;
return A;
}
public static int K2(int A, int B, int index){
return K1(B,A,index);
}
public final static int LICZBA_OSOBNIKOW_POCZATKOWA = 100000;
public final static int WYMIAR_BADANCYH = 6;
/**
* alg gentyczny
* 0. wylosuj populacje
* 1. policzyc srednia
* 2a. kiepskich mutowac
* 2b. lepszych krzyzowac
* 3. jesli nie ma poprawy to koncz
* 4. jesli jest poprawa idz do kroku 1
* @return
*/
public static double znajdzMinimum(){
double populacja[][] = wylosujPopulacje();
double srednia = policzSrednia(populacja);
double wynik = policzMin(populacja);
do {
zmutujSlabych(populacja,srednia,wynik);
krzyzujLepszych(populacja,srednia,wynik);
srednia = policzSrednia(populacja);
wynik = policzMin(populacja);
} while( saPostepy(wynik));
return wynik;
}
public static double[][] wylosujPopulacje(){
//Random r = new Random();
double wynik[][] = new double[LICZBA_OSOBNIKOW_POCZATKOWA][WYMIAR_BADANCYH];
for(int i=0;i<LICZBA_OSOBNIKOW_POCZATKOWA;i++)
for(int j=0;j<WYMIAR_BADANCYH;j++)
wynik[i][j] = r.nextDouble();
return wynik;
}
public static double policzSrednia(double populacja[][]){
double wynik = 0.0;
for(int i=0;i<LICZBA_OSOBNIKOW_POCZATKOWA;i++)
wynik+=czarnaSkrzynka(populacja[i]);
wynik /= LICZBA_OSOBNIKOW_POCZATKOWA;
return wynik;
}
static double xMin[] = null ;
public static double policzMin(double populacja[][]){
double wynik = Double.MAX_VALUE;
if(xMin!=null)
wynik = czarnaSkrzynka(xMin);
for(int i=0;i<LICZBA_OSOBNIKOW_POCZATKOWA;i++){
double nastepny = czarnaSkrzynka(populacja[i]);
if(nastepny<wynik){
wynik=nastepny;
xMin = populacja[i].clone() ;
}
}
return wynik;
}
private static void zmutujSlabych(double[][] populacja, double srednia, double wynik) {
for(int i=0;i<LICZBA_OSOBNIKOW_POCZATKOWA;i++)
if(czarnaSkrzynka(populacja[i])>srednia){
zmutuj(populacja[i]);
}
}
private static void zmutuj(double[] slaby) {
for(int j=0;j<slaby.length;j++)
slaby[j]=zmutuj(slaby[j]);
}
private static double zmutuj(double slaby) {
return ((double)(M( (int)(slaby*Integer.MAX_VALUE),r.nextInt(Integer.SIZE)))) / ((double)Integer.MAX_VALUE);
}
private static void krzyzujLepszych(double[][] populacja, double srednia, double wynik) {
boolean jedenJuzJest = false;
double tenJeden[] = null;
for(int i=0;i<LICZBA_OSOBNIKOW_POCZATKOWA;i++)
if(czarnaSkrzynka(populacja[i])<srednia){
if(jedenJuzJest){
krzyzuj(populacja[i],tenJeden,srednia,wynik);
jedenJuzJest = false;
} else {
tenJeden = populacja[i];
jedenJuzJest = true;
}
}
}
private static void krzyzuj(double[] lepszy1, double[] lepszy2, double srednia, double wynik) {
double wynikL1 = czarnaSkrzynka(lepszy1);
double wynikL2 = czarnaSkrzynka(lepszy2);
double ratio1 = Math.abs((wynikL1-wynik)/(srednia-wynik));
double ratio2 = Math.abs((wynikL2-wynik)/(srednia-wynik));
int bitMutacji = (int)Math.round(Integer.SIZE*((ratio1+ratio2)/2.0));
krzyzuj(lepszy1,lepszy2,bitMutacji);
}
private static void krzyzuj(double[] lepszy1, double[] lepszy2, int bitMutacji) {
double nowy1;
double nowy2;
for(int j=0;j<lepszy1.length;j++){
nowy1=krzyzuj(lepszy1[j],lepszy2[j],bitMutacji);
nowy2=krzyzuj(lepszy2[j],lepszy1[j],bitMutacji);
lepszy1[j]=nowy1;
lepszy2[j]=nowy2;
}
}
private static double krzyzuj(double L1, double L2, int bitMutacji) {
int iL1 = (int)(L1*Integer.MAX_VALUE);
int iL2 = (int)(L2*Integer.MAX_VALUE);
int iK = K1(iL1,iL2,bitMutacji);
return ((double)iK)/((double)Integer.MAX_VALUE);
}
static double staryWynik = Double.MAX_VALUE;
public static final double EPISLON = 1.0e-10;
public static final int ILE_BEZ_POSTEPU = 10 ;
public static int ileBezPostepu = ILE_BEZ_POSTEPU;
public static boolean saPostepy(double nowyWynik){
double roznica = Math.abs(nowyWynik-staryWynik);
staryWynik = nowyWynik;
if(roznica>EPISLON){
ileBezPostepu = ILE_BEZ_POSTEPU;
} else {
ileBezPostepu--;
return ileBezPostepu>=0;
}
return roznica>EPISLON;
}
public static double czarnaSkrzynka(double x[]){
double wynik = 0.0;
for(int j=0;j<x.length;j++)
wynik+=x[j];
return wynik ;
}
}
|
Post został pochwalony 0 razy
|
|