Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

problem z macierzą- programowanie genetyczne

Ostatnio zmodyfikowano 2015-01-08 08:27
Autor Wiadomość
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:
C/C++
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <new>
#include <cstdlib>
#include <cstdio>
#include <ctime>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */



struct chromosom
{
    int * kolejnosc = new int;
    double suma = 0;
    double jakosc = 0;
    double prawdo = 0;
    double dystrybuanta = 0;
   
   
};
/// populacja- funkcja tworzaca populacje poczatkowa zawierająca tablice 10 chromosomow

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 ) // jest to funkcja oceny
{
    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 ) ///ocen jakosc
{
    using namespace std;
    //srand( time( NULL ) );
    // chromosom *wiekszy=new chromosom[10];
    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++;
               
            }
            //przepisuje cala struklture
        }
        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.width( 15);
        cout << popul[ i ].dystrybuanta; /// f c i wartosc funkci celu i mniejsza tym lepsza-  jest to suma drog
       
        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 },
    };
   
   
   
   
    //przepisanie wartosci z nad przekatnej pod przekatna
    for( int i = 0; i < n; i++ )
    for( int j = i; j < n; j++ )
         tablica[ j ][ i ] = tablica[ i ][ j ];
    ///////wyswietlanie macierzy0
   
    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 ];
    /// pobranie ilosc miast
    cout << "ile miast chcesz odwiedzic?" << endl;
    cin >> ilosc;
    int * tab = new int[ ilosc ]; //tab - tablica   z numerami miast
    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
P-124412
darko202
» 2015-01-08 08:27:47
1.
  formatowanie wklejanego kodu
http://cpp0x.pl/kursy​/Porady-dla-uzytkownikow-cpp0x-​pl​/Zakladanie-tematow-na-forum​/483

2.
  udowodnij mi, że to co mówisz jest prawdą tzn. przedstaw algorytm dojścia do spostrzeżenia "wewnątrz tej funkcji jest ok- miasta się nie powtarzają"

3.
przyjrzyj się np funkcji
C/C++
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.kolejnosc[ j ] = 0;
   
    for( int i = 0; i < 10; i++ )
    {
       
        for( int j = 0; j < ilosc; j++ )
        {
            wynik.kolejnosc[ j ] = tab[ rand() % ilosc ];
            for( int k = 0; k < j; k++ )
            if( wynik.kolejnosc[ j ] == wynik.kolejnosc[ k ] )
            {
               
                j = j - 1;
                break; }
           
        }
       
        for( int k = 0; k < ilosc - 1; k++ )
             wynik.suma += tablica[ wynik.kolejnosc[ k ] ][ wynik.kolejnosc[ k + 1 ] ];
       
    }
    return wynik;
}

3.1
np.
C/C++
for( int k = 0; k < ilosc - 1; k++ )
     wynik.suma += tablica[ wynik.kolejnosc[ k ] ][ wynik.kolejnosc[ k + 1 ] ];


w pierwszej chwili pomyślałem że lecisz po przekątnej co byłoby dziwne
ale tablica[wynik.kolejnosc[k]][wynik.kolejnosc[k+1]] to chyba np. tablica[696,345]

3.2
C/C++
chromosom * wynik = new chromosom[ 10 ];
for( int i = 0; i < 10; i++ )
for( int j = 0; j < ilosc; j++ )
     wynik.kolejnosc[ j ] = 0;


iterujesz tak jakby wynik był 2 wymiarowy

3.3
C/C++
struct chromosom
{
    int * kolejnosc = new int;
    ...};
// a potem
wynik.kolejnosc[ j ] == wynik.kolejnosc[ k ] ) //co porównujesz ?

wynik.kolejnosc[ j ] = 0; // co podstawiasz ?
P-124436
« 1 »
  Strona 1 z 1