system binarny i algorytm genetyczny. potrzebna pomoc

0

Witam

Piszę ponieważ mam problem natury technicznej związany z prezentacją liczb w systemie binarnym. Ale zacznę od początku. Na zajęciach ze sztucznej inteligencji otrzymałem do zrobienia program z zastosowaniem algorytmu genetycznego. Dla funkcji y=3x+2 w przedziale xe{0;31}. Z przedziału 0 do 31 otrzymuję w systemie binarnym liczbę 5-bitową. i tutaj przechodzę do sedna mojego problemu. W późniejszej fazie program będzie łączył ze sobą losowo chromosomy osobników i tworzył nową populację. W moim przypadku wszystko jest fajnie jeśli liczbę da się przekształcić na dwójkową i 5-bitową. Ale w przypadku np. liczby 5 w binarnym otrzymam 101, a potrzebowałbym zapisu 00101.
Potrzebuję aby ktoś przejrzał mój program, a właściwie pętlę wypisującą liczbę w systemie binarnym i rozjaśnił mi gdzie popełniłem błąd i jak temu zaradzić.

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <string>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
    
    srand( time( NULL ) );
    int y,x,i,n;
    n=6;
    int tab[6]={4,12,10,8,6,5};
    int tabx[6]; // tablica tab[6] do  wzoru y=3x+2
    float tabp[n];
    string bin="";
    string tabB[6];
    int naj=0;
    //losowanie osobników + najwyzszy rand
    for(i=0;i<6;i++){
                     /*int wynik=(rand()%31);
                     tab[i]=wynik;*/
                     
                     cout<<tab[i]<<" ";
                    if(tab[i]>naj){
                       naj=tab[i];
                       }
                        else
                        naj;
                       }
    cout<<endl<<"najwyzszy x: "<<naj<<endl  ;   
    //funkcja przystosowania
    int f=3*naj+2;
    cout<<"f_przystosowania: "<<f<<endl;
    
    //kolo ruletki
    int suma=0;
    int temp=0;
    //suma do kola
    for(i=0;i<6;i++){
                     temp=3*tab[i]+2;
                     suma+=temp; 
                     }
    cout<<"suma y: "<<suma<<endl;
    cout<<"Po podstawieniu do wzoru:"<<endl;
    for(i=0;i<6;i++){
        tabx[i]=3*tab[i]+2;
        cout<<tabx[i]<<" ";
    }
    cout<<endl<<"Wartosci procentowe:"<<endl;
    //int na float
    for(i=0;i<6;i++){
        tabp[i]=tabx[i];
        /*cout<<tabp[i]<<" ";*/
    }
    //wartosci procentowe
    for(i=0;i<6;i++){
        tabp[i]=(tabp[i]/suma)*100;
        cout<<tabp[i]<<" ";
    }    
    cout<<endl<<"Wartosci binarne:"<<endl;
    //system binarny na stringachi cos tu jest nie tak
    for(i=0;i<6;i++){
        while (tab[i]!=0){
            if (tab[i] % 2 == 0)
            {bin="0"+bin;} 
            else 
            {bin="1"+bin;};
            tab[i] = tab[i] /2;     
    }    tabB[i]=bin;
        cout<<tabB[i]+" ";
        bin="";
    }
    //problem z liczbami 4 i mniej bitowymi -> dodac odpowiednią liczbę 0 na poczatek stringu
    /*string d;
    for(i=0;i<6;i++){
        tabB[i].length()=d;
        if(d==4){
            tabB[i]="0"+tabB[i];
        }
        cout << tabB[i]+" "; 
        d="";
    }  
    */    
    return 0;
}
0

Zacznij od formatowania kodu

0

Tak na szybko:

 
for(i = 0; i < 6; +=i){    
        int l = 0;
        while (tab[i]!=0){
                l++;
                if (tab[i] % 2 == 0) {
                        bin="0"+bin;
                } 
                else {
                        bin="1"+bin;    
                }
                tab[i] = tab[i]/2; 
        }
        for(l; l < 5; ++l)
                bin = "0"+bin;
        tabB[i]=bin;
        cout<<tabB[i]+" ";
        bin="";
}
0

Tak na zdrowy rozsądek (dokładnie to co w poście wyżej tylko że z głową):

for(i=0;i<6;++i)
  {
   tabB[i]="";
   for(l=0;l<5;++l,tab[i]>>1) tabB[i]=(tab[i]&1?"1":"0")+tabB[i];
   cout<<tabB[i]<<" ";
  }
0

Ojejku, tablica jednoznakowych stringów? Dlaczego?

0
kq napisał(a):

Ojejku, tablica jednoznakowych stringów? Dlaczego?

Ooo, to ja się podepnę z pytaniem, gdyż kiedyś również interesowałem się AG i właśnie zastanawiałem się jak powinno się najbardziej optymalnie (/praktycznie) przekształcać i zapisywać liczby do postaci binarnej? Czy taki ciąg 0 i 1 trzymać w tablicy char-ów czy (i tu właśnie moje pytanie) nie można byłoby utworzyć kilku zmiennych typu int i na nich bawić się bitami? W końcu taka liczba to 4 bajty tj. 32 bity do wykorzystania -> w zależności od potrzeb można na takiej liczbie trzymać nawet kilka zmiennych... Co wy o tym myślicie?
W ostateczności taka liczba int może również reprezentować tylko 1 zmienną - wydaje mi się, że operacje na bitach byłyby bardziej optymalne, niż zabawa na char-ach ;)
pozdrawiam

1

@BeBetter, normalni programiści właśnie tak robią (no chyba że to mocno kłuci się z czytelnością).
Początkujące robią różne dziwne przekształcenia, ponieważ jeżeli nie widzą tych zer i jedynek to nie są w stanie ich sobie wyobrazić.

0

Dziękuję wszystkim za szybką odpowiedź. W sumie w tej chwili zastanawiam się dlaczego nie dodałem licznika. @_13th_Dragon z formatowaniem kodu to się jeszcze pobawię, to pierwotny zarys jeszcze z zajęć, a kod w większości chciałbym rozłożyć na funkcje. Na razie może to być w charakterystycznym nieładzie. @szweszwe tak na szybko skorzystałem z twojego kodu.
Swoją drogą chciałbym zapytać o co chodzi z tablicą jednoznakowych stringów @kq ?

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