Program wysypuje się po zastosowaniu pętli

0

Witam, mam problem:) Powiem od razu, żeby nie było moje umiejętności programowania są dosyć słabe.
Problem polega na tym, że jeżeli pętla jest w komentarzu to program działa bez problemowo, problem pojawia się bowiem, jak pętla ma wykonać operację, w tedy program wysypuję się. Był bym bardzo wdzięczny gdyby ktoś powiedział, w którym miejscu popełniłem błąd. Najgorsze jest to, że ta pętla musi być próbowałem użyć while, do while cały czas się wysypuje.
Męczyłem się z tym już trochę godzin i nic z tego nie wynikło :(
Kompilatora jakiego używam to DevC++ v4.9.9.2.

Mniej więcej co ten program ma robić:
użytkownik podaje ilość przedmiotów - x np.6
(tablica przedmioty[2][x])
w przedmiotach[0][6] - użytkownik wpisuje objętość przedmiotów
w przedmiotach[1][6] - użytkownik wpisuje wartość przedmiotów
i mamy np. tablice przedmioty:
4 5 3 7 3 2 - objętość
12 18 4 20 12 5 - wartość
Następnie użytkownik podaje ilość zestawów przedmiotów np. 4, w tedy program tworzy tablice "osobników" [4][6].
następnie losowo wypełnia tą tablice wartościami (0,1) i otrzymujemy np.
tablice osobników:
110010 - zestaw 1
000011 - zestaw 2
111110 - zestaw 3
101001 - zestaw 4
wartość 1- oznacza ze przedmiot jest.
Następnie zestaw, który ma największą wartość, a jego objętość nie przekracza wartości poj_plecaka (podaj przez użytkownika)
zostaje zapisany w tablicy plecak[6] w zmiennych plecak_obj jest przechowywana objętość, plecak_wart przechowywana jego wartość.
Po tym liczona jest suma wszystkich wartości: (12+18+4+20+12+5)=71 - max_wartość.
Następnie w tablicy przystosowanie[4] jest zapisywana wartość każdego z zestawów ze wzoru (wartość zestawu/max_wartość)*100.
59 - zestaw 1
23 - zestaw 2
92 - zestaw 3
29 - zestaw 4
Po tym liczona jest suma wszystkich wartości z tablicy przystosowanie: (59+23+92+29)=203 - suma_przystosowan.
Po tej czynności w tablicy kolo[4] są zapisywane wartości liczone ze wzoru (przystosowanie/suma_przystosowan)*100.
Po obliczeniach kolo[4] ma wartości:
29 - zestaw 1
11- zestaw 2
40 - zestaw 3
12 - zestaw 4
Tworzona jest tablica kolo2[4] która ma wartości:
29 (0+29) - zestaw 1
45 (29+11) - zestaw 2
85 (40+45) -zestaw 3
100(wartość przypisywana automatycznie) - zestaw 4
Kolejnym krokiem jest wylosowanie 4 liczb (zależnie od ilości zestawów) i np. program wylosował: 93,83,22,17.
Każda wylosowana wartość odpowiada zestawowi odczytywane to jest na podstawie tablicy kolo2, czyli
Zestaw 4
Zestaw 3
Zestaw 1
Zestaw 1
następnie są losowane dwie liczby L i PK.
L=3
PK= 65
Jeżeli PK <= pk(podanego przez użytkownika) to zachodzi mieszanie zestawów z wylosowanych (kolo2). L określa która część od prawej strony będzie mieszana.
Zestawy są mieszane parami: 4z3 1z1
101|001 - zestaw 4
111|110 - zestaw 3
110|010 - Zestaw 1
110|010 - Zestaw 1
Po pomieszaniu otrzymujemy nowe zestawy:
101110 -Zestaw 1
111001 - Zestaw 2
111010 - Zestaw 3
111010 - Zestaw 4

program do tego momentu działa.
Następnie te zestawy są przepisywane do tablicy "osobników" i ponownie leci procedura od plecaka do mieszania tyle razy ile zdefiniuje użytkownik.

Mam nadzieję, że znajdzie się ktoś miły i pomoże rozwiązać ten problem.

Poniżej zamieszczam źródło (nie wiem czy jest czytelne, pierwszy raz pokazuję). Z góry przepraszam na brak funkcji.

 #include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main()
{
                                                                                //definiuje pojemnosc ilosc przedmiotow
 int ilosc_przedmiotow;
 cout << "Podaj ilosc przedmiotow: " << endl;
 cin >> ilosc_przedmiotow;
                                                                                //tworzy tablice przedmiotow 
 int przedmioty[2][ilosc_przedmiotow];
 int obj=0;
 int wart=0;
 for (int i=0; i<1; i++)
 {
  for (int j=0; j<ilosc_przedmiotow; j++)
  {
   cout << "Podaj objetosc przedmiotu " << j+1 << ":" << endl;
   cin >>obj;
   cout << "Podaj wartosc przedmiotu " << j+1 << ":" <<endl;
   cin >> wart;
   przedmioty[0][j]=obj;
   przedmioty[1][j]=wart; 
  }
 }
                                                                                //definiuje polemnosc plecaka; 
 int poj_plecaka=0;
 cout << "Podaj pojemnosc plecaka" << endl;
 cin >> poj_plecaka;
                                                                                //definuje populacje 
 int populacja=1;
 while (populacja%2!=0)
 {
  cout << "Podaj populacje poczatkowa (liczba parzysta):" << endl;
  cin >> populacja;
 }
                                                                                //definuje prob krzyzowania
 int pk;
 while (pk<1 || pk>=100)
 {
  cout << "Podaj prawdopodobienstwo krzyzowania (lizba z zakresu 1-100):" << endl;
  cin >> pk;
 }
                                                                                //definiuje ilosc pokolen 
 int pokolenia=0;
 while (pokolenia<=0)
 {
  cout << "Podaj ilosc pokolen:" << endl;
  cin >> pokolenia;
 }
                                                                                
 int tab_osobnikow[populacja][ilosc_przedmiotow];//tworzy tablice osobnikow     //tworzy tablice osobnikow
 for (int i=0; i<populacja; i++)
 {
  for (int j=0; j<ilosc_przedmiotow; j++)
  {
   tab_osobnikow[i][j]=rand()%2;
  }
 }
  for (int i=0; i<populacja; i++)
 {
  for (int j=0; j<ilosc_przedmiotow; j++)
  {
   cout <<tab_osobnikow[i][j];
  }
  cout << endl;
 }
 system("cls");
 cout << "===================" << endl;
 cout << "Lista przedmiotow: " << endl <<endl;
 for (int i=0; i<ilosc_przedmiotow; i++)
 {
  cout << "Przedmiot " << i+1 << ":" << endl;
  cout << "  -objetosc: " << przedmioty[0][i] << endl;
  cout << "  -wartosc: " << przedmioty[1][i] << endl << endl;  
 } 
 cout << "===================" << endl<< endl;
 cout << "Informacje ogolne: " << endl << endl;
 cout << "-maksymalna objetosc plecaka: " << poj_plecaka << endl;
 cout << "-ilosc zestawow przedmiotow: " << populacja << endl;
 cout << "-prawdopodobienstwo krzyzowan: " << pk << endl;
 cout << "-ilosc krzyzowania zestawow:" << pokolenia << endl;
 cout << "===================" << endl<< endl;

 int plecak[ilosc_przedmiotow];
 int plecak_obj=0;
 int plecak_wart=0; 
 int n_tab2[populacja][ilosc_przedmiotow];                                              //tworzy plecak
 for (int i=0; i<ilosc_przedmiotow; i++)
 {
  plecak[i]=0;
 }
 
//for (int z=0; z<pokolenia; i++) {                                             //to jest ta pętla ktora wysypuje program

 int suma_obj=0;
 int suma_war=0;                                                                //pakuje przedmioty do plecaka
 for (int i=0; i<populacja; i++)
 {
  for (int j=0; j<ilosc_przedmiotow; j++)
  {
      
   if (tab_osobnikow[i][j]==1)
   {
    suma_obj=suma_obj+przedmioty[0][j];
    suma_war=suma_war+przedmioty[1][j];
   }
   
  }
  if(suma_obj <= poj_plecaka && suma_obj >=plecak_obj && suma_war>=plecak_wart)
  {
   for (int k=0; k<ilosc_przedmiotow; k++)
   {
    plecak[k]=tab_osobnikow[i][k];
   }
  plecak_obj=suma_obj;
  plecak_wart=suma_war;
  }
  suma_obj=0;
  suma_war=0;
 }
 cout << "koniec plecaka." << endl;
 int przystosowanie[populacja];                                                 //definiuje wartosci przystosowan
 int max_wartosc=0;
 for (int i=0; i<ilosc_przedmiotow; i++)                                        //oblicza maksymalna wartosc przedmiotow
 {
  max_wartosc=max_wartosc+przedmioty[1][i];
 }

 int suma_osobnika=0;
 for (int i=0; i<populacja; i++)
 {
  for (int j=0; j<ilosc_przedmiotow; j++)
  {
  if (tab_osobnikow[i][j]==1) {suma_osobnika=suma_osobnika+przedmioty[1][j];}
  }
  double x=(suma_osobnika/(max_wartosc+0.0))*100;
  int x1= int (x);
  przystosowanie[i]=x1;
  suma_osobnika=0;
 }
 cout << "koniec przystosowania" << endl;
 
 int kolo[populacja];                                                           //definiuje kolo ruletki
 int suma_przystosowania=0;
 for (int i=0; i<populacja; i++)
 {
  suma_przystosowania=suma_przystosowania+przystosowanie[i];
 }
 cout << suma_przystosowania;
 for (int i=0; i<populacja; i++)                                                //tworzenie kola
 {
  double x2=(przystosowanie[i]/(suma_przystosowania+0.0))*100;
  int x3=int (x2);
  kolo[i]=x3;
 }
 
 int kolo2[populacja];                                                          //definiuje przedzialy losowan
 for (int i=0; i<populacja; i++)
 {
  if (i==0) {kolo2[i]=kolo[i];}
  else { kolo2[i]=kolo[i]+(kolo2[i-1]);}
 }
 kolo2[populacja-1]=100;
cout << "koniec kola" << endl;
 
 int losowanie[populacja];                                                      // przeprowadza losowanie
 for (int i=0; i<populacja; i++)
 {
  losowanie[i]=rand() %100+1;
 } 
cout << "koniec losowania" << endl;
 int krzyzowanie[populacja];                                                    //definuje tablice osobnikow do krzyzowania
 int k_pom[100];
 int b=0;                                                     
 for (int i=0; i<populacja; i++)
 {
  while (b!=kolo2[i])
  {
  k_pom[b]=i;
  b++;
  }
 }

int a=0;
for (int i=0; i<populacja; i++)                                                 // definiuje ktore osobniki beda krzyzowac
{
 a=losowanie[i];
 krzyzowanie[i]=k_pom[a];
}
cout << "koniec krzyzowania" << endl;
int l_pk=rand() %pk;
int l=rand() %ilosc_przedmiotow;

int c=0;
if (l_pk <= pk)
{
int n_tab[populacja][ilosc_przedmiotow];
for (int i=0; i<populacja; i++)
{
 a=krzyzowanie[i];
 for (int j=0; j<ilosc_przedmiotow; j++)
 {
  n_tab[i][j]=tab_osobnikow[a][j];
 }
}



for (int i=0; i<populacja; i++)
{
 for (int j=0; j<ilosc_przedmiotow; j++)
 {
  n_tab2[i][j]=n_tab[i][j];
 }
}


for (int i=0; i<populacja; i++)
{
 for (int j=0; j<l; j++)
 {
  if (i%2==0) n_tab2[i][ilosc_przedmiotow-j-1]=n_tab[i+1][ilosc_przedmiotow-j-1];
  if (i%2==1) n_tab2[i][ilosc_przedmiotow-j-1]=n_tab[i-1][ilosc_przedmiotow-j-1];
 }
}

} 
 cout << "koniec krzyzowanie" << endl;
 cout << "===================" << endl;
 cout << "Przebieg " <<  ": "<<endl;
 cout << "===================" << endl << endl;
 for (int i=0; i<populacja; i++)
 {
  cout << "Zestaw " << i+1 <<": ";
  for (int j =0; j<ilosc_przedmiotow; j++)
  {
    cout << tab_osobnikow[i][j];
  }
  cout << ", przystosowanie: " << przystosowanie[i] << "%"<< endl;
 }
 cout << endl<< endl;
 
 cout << "Aktualna zawartosc plecaka: " << endl;
 for (int i=0; i<ilosc_przedmiotow; i++)
 {
  cout << plecak[i];
 }
 cout << endl << "-objetosc: " << plecak_obj<< endl;
 cout << "-waga: " << plecak_wart<< endl << endl;
 
  cout << "Kolo ruletki: " << endl;
 for (int i=0; i<populacja; i++)
 {
  cout << kolo2[i] << " ";
 }
 cout << endl << endl;
 cout << "Wylosowane liczby: "<<endl;
 for (int i=0; i<populacja; i++)
 {
  cout << losowanie[i] << " ";
 }
 cout << endl << endl;
 if (l_pk<=pk)
 {
 cout << "Wylosowane PK: " << l_pk << endl << endl;
 cout << "Ile czesci bedzie krzyzowanych (od prawej strony): " << l <<endl << endl; 
 cout << "Zestawy ktore bede krzyzowane: " << endl;
  for (int i=0; i<populacja; i++)
 {
  cout << krzyzowanie[i]+1 << " ";
 }
 cout << endl<< endl;
}

for (int i=0; i<populacja; i++)
{
 for (int j=0; j<ilosc_przedmiotow; j++)
 {
  tab_osobnikow[i][j]=n_tab2[i][j];
 }
}
//}                                                                             //to jest ta pętla ktora wysypuje program
 system("PAUSE");
 return 0;   
}
0
  1. Mogłes po prostu napisać że próbujesz rozwiązać problem plecakowy za pomocą algorytmu genetycznego ;)
  2. Napisz ten kod jeszcze raz, tym razem jak człowiek, dzieląc go na odpowiednie klasy i metody. Zapewniam cię ze wszelkie problemy znikną. Bo nie trudno o bląd jak masz jeden wielki blok kodu w którym nie wiadomo co się dzieje. Jakby twoja główna pętla wyglądała tak:
        while not self.stop.should_we_finish(self.units_fitness):
            parent_pairs = self._choose_parents()
            self._crossover(parent_pairs)
            self._mutate()
            self._compute_fitness()

i pozostałe fragmenty analogicznie miały po kilka linijek to znalezienie błędu zajęłoby ci 30 sekund.

0

Dokładnie chodzi o problem plecakowy za pomocą algorytmu genetycznego.
Dziękuję, za radę poczytam o klasach i metodach, postaram się poprawić ten kod.

1 użytkowników online, w tym zalogowanych: 0, gości: 1