Witam,
Jestem w trakcie pisania programu opartego na algorytmie genetycznym. Chciał bym zaznaczyć, iż większość problemów rozwiązuje sam, ale nad tym problem spędziłem już tyle czasu, że nie mam do niego siły. Mam nadzieje, że będziecie potrafili i chcieli mi pomóc bo ja już straciłem nadzieję że to pójdzie.
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
double[] rates = new double[200]; //tablica ocen
int[][] parents; //chromosomy dla dzieci
int[][] children; //chromosomy rodzicow
int i;
int j;
double[] tmpRates = new double[20];
parents = new int[10][];
for (i = 0; i < 10; i++)
{
parents[i] = new int[1000];
}
children = new int[20][];
for (i = 0; i < 20; i++)
{
children[i] = new int[1000];
}
for (i = 0; i < 10; i++)
{
for (j = 0; j < 1000; j++)
{
parents[i][j] = Convert.ToByte(rand.getr.NextDouble()); //losowe chromosomy poczatkowe
}
}
int firstXOpoint;
int secondXOpoint;
for (int u = 0; u < 200; u++) //glowna petla - w niej robiony jest cross over
{
for (i = 0; i < 5; i++)
{
firstXOpoint = rand.getr.Next(500);
secondXOpoint = 500 + rand.getr.Next(500);
for (j = 0; j < firstXOpoint; j++) //4 dzieci z dwojki rodzicow
{
children[4 * i][j] = parents[2 * i][j];
children[4 * i + 1][j] = parents[2 * i + 1][j];
children[4 * i + 2][j] = parents[2 * i + 1][j];
children[4 * i + 3][j] = parents[2 * i][j];
}
for (j = firstXOpoint; j < secondXOpoint; j++)
{
children[4 * i][j] = parents[2 * i + 1][j];
children[4 * i + 1][j] = parents[2 * i][j];
children[4 * i + 2][j] = parents[2 * i + 1][j];
children[4 * i + 3][j] = parents[2 * i][j];
}
for (j = secondXOpoint; j < 1000; j++)
{
children[4 * i][j] = parents[2 * i][j];
children[4 * i + 1][j] = parents[2 * i + 1][j];
children[4 * i + 2][j] = parents[2 * i][j];
children[4 * i + 3][j] = parents[2 * i + 1][j];
}
}
for (j = 0; j < 20; j++)
{
tmpRates[j] = chrom.rate(children[i]); //obliczanie oceny dla nowych dzieci
}
int index;
double value;
for (i = 0; i < 10; i++) //zwykle sortowanie, wczesniej bylo na List'ach i metoda Sort()
{ //ale w akcie desperacji i ze strachu przed plytkim kopiowaniem
index = 0; //zamienione na zwykle tablice
value = tmpRates[0];
for (j = 1; j < 20; j++)
{
if (tmpRates[j] < value)
{
value = tmpRates[j];
index = j;
}
}
for (j = 0; j < 1000; j++)
{
parents[i][j] = children[index][j]; //najlepsze dzieci staja sie rodzicami
}
tmpRates[index] = double.MaxValue;
}
rates[u] = chrom.rate(parents[0]); //wpisanie oceny do tablicy zawierajacej oceny dla
//kazdej iteracji algorytmu
}
}
Jak widzicie jest to / ma to byc algorytm genetyczny. Program sie kompiluje. Z jakiegos jednak powodu bardzo szybko sie wyrzaza (wszystkie chromosomy, czyli tablice children i parents sa takie same), niemalze natychmiast (2, 3 iteracje). Na poczatku populacja jest rozna a potem jakby nagle, w wyniku łączenia w pary i przypisywania stawała się jednolita.
Początkowo program ten miał zaimplementowany zaawansowany algorytm genetyczny, 7 klas z interfejsami ICloneable i takie tam, po kilku dniach szukania błędu sprowadził się do malutkiego programiku z kilkoma tablicami typu byte (int tez byl testowany :D) a problem nadal pozostał.
Jak tak dalej pójdzie to program przepisze w czystym C albo jeszcze lepiej asemblerze.
Please help!