matios16 Temat założony przez niniejszego użytkownika |
problem z macierzą- programowanie genetyczne » 2015-01-07 20:53:21 W skrócie: do tablicy o nazwie "tab" w mainie wpisujemy z klawiatury numery miast. Następnie funkcja populacja powinna moim zdaniem ułożyć te miasta na 10 sposobów w losowej kolejności, tak aby aby w danym przypadku( w danym chromosomie) nie powtórzyły się te same miasta. Niby działa ona dobrze do jak robię couta wewnątrz tej funkcji jest ok- miasta się nie powtarzają, jednak jak już zrobię return wynik, a następnie wyświetlę tą tablicę w mainie - funkcja wypisz to nagle ta tablica jest nieco inna i niektóre miasta się powtarzają Kod: #include <iostream> #include <stdio.h> #include <conio.h> #include <new> #include <cstdlib> #include <cstdio> #include <ctime>
struct chromosom { int * kolejnosc = new int; double suma = 0; double jakosc = 0; double prawdo = 0; double dystrybuanta = 0; };
chromosom * populacja( int tab[], int ilosc, int tablica[ 10 ][ 10 ] ) { chromosom * wynik = new chromosom[ 10 ]; for( int i = 0; i < 10; i++ ) for( int j = 0; j < ilosc; j++ ) wynik[ i ].kolejnosc[ j ] = 0; for( int i = 0; i < 10; i++ ) { for( int j = 0; j < ilosc; j++ ) { wynik[ i ].kolejnosc[ j ] = tab[ rand() % ilosc ]; for( int k = 0; k < j; k++ ) if( wynik[ i ].kolejnosc[ j ] == wynik[ i ].kolejnosc[ k ] ) { j = j - 1; break; } } for( int k = 0; k < ilosc - 1; k++ ) wynik[ i ].suma += tablica[ wynik[ i ].kolejnosc[ k ] ][ wynik[ i ].kolejnosc[ k + 1 ] ]; } return wynik; }
void wylicz( double & najg, double & al, chromosom * pop ) { float jakosc_all = 0; najg = pop[ 0 ].suma; al = pop[ 0 ].suma; for( int m = 1; m < 10; m++ ) { if( najg < pop[ m ].suma ) najg = pop[ m ].suma; al += pop[ m ].suma; } for( int i = 0; i < 10; i++ ) { pop[ i ].jakosc =( najg - pop[ i ].suma + 1 ) /( al + 1 ); } for( int i = 0; i < 10; i++ ) { jakosc_all += pop[ i ].jakosc; } for( int i = 0; i < 10; i++ ) { pop[ i ].prawdo = pop[ i ].jakosc / jakosc_all; } pop[ 0 ].dystrybuanta = pop[ 0 ].prawdo; for( int i = 1; i < 10; i++ ) { pop[ i ].dystrybuanta = pop[ i - 1 ].dystrybuanta + pop[ i ].prawdo; } }
chromosom * populuj( chromosom * poprzedni, chromosom * wiekszy ) { using namespace std; if( wiekszy != NULL ) { for( int i = 0; i < 10; i++ ) { int x =( rand() % 1001 ); double y = double( x ) / 1000; int j = 0; while( j < 10 ) { if( poprzedni[ j ].dystrybuanta >= y ) { wiekszy[ i ] = poprzedni[ j ]; break; } else j++; } } return wiekszy; } else return 0; }
void wypisz( chromosom * popul, int ilosc ) { using namespace std; cout << "oto populacja: " << endl; for( int i = 0; i < 10; i++ ) { for( int j = 0; j < ilosc; j++ ) { cout.width( 4 ); cout << left << popul[ i ].kolejnosc[ j ]; } cout << "suma drogi: "; cout.width( 10 ); cout << left << popul[ i ].suma; cout << popul[ i ].dystrybuanta; cout << endl; } }
int main()
{ using namespace std; srand( time( NULL ) ); int n = 10; int tablica[ 10 ][ 10 ] = { { 0, 565, 696, 1586, 1805, 2954, 3317, 1300, 1191, 872 }, { 0, 0, 345, 1058, 1522, 2325, 2788, 771, 662, 868 }, { 0, 0, 0, 1029, 1308, 2239, 2702, 900, 877, 525 }, { 0, 0, 0, 0, 1431, 1272, 1735, 326, 503, 1484 }, { 0, 0, 0, 0, 0, 1964, 2516, 1488, 1661, 1228 }, { 0, 0, 0, 0, 0, 0, 628, 1572, 1768, 2521 }, { 0, 0, 0, 0, 0, 0, 0, 2036, 2232, 3075 }, { 0, 0, 0, 0, 0, 0, 0, 0, 203, 1356 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1397 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }; for( int i = 0; i < n; i++ ) for( int j = i; j < n; j++ ) tablica[ j ][ i ] = tablica[ i ][ j ]; for( int i = 0; i < n; i++ ) { for( int j = 0; j < n; j++ ) cout << tablica[ i ][ j ] << '\t'; cout << endl; } int ilosc; chromosom * wiekszy = new chromosom[ 10 ]; cout << "ile miast chcesz odwiedzic?" << endl; cin >> ilosc; int * tab = new int[ ilosc ]; cout << "podaj numery miast" << endl << endl;; for( int i = 0; i < ilosc; i++ ) cin >> tab[ i ]; cout << endl << "oto wybrane miasta: "; for( int i = 0; i < ilosc; i++ ) cout << tab[ i ] << ", "; cout << endl; chromosom * popul = populacja( tab, ilosc, tablica ); double najgorszy = 0; double all = 0; wylicz( najgorszy, all, popul ); wypisz( popul, ilosc ); cout << endl; chromosom * nowy; nowy = populuj( popul, wiekszy ); najgorszy = 0; all = 0; wylicz( najgorszy, all, nowy ); wypisz( nowy, ilosc ); nowy = populuj( nowy, wiekszy ); najgorszy = 0; all = 0; wylicz( najgorszy, all, nowy ); wypisz( nowy, ilosc ); getchar(); return 0; }
Prosze o pomoc |