[solved] Generacja grafu G(n,f,p)

0

Próbuję napisać algorytm do generacji grafów z podanym maksymalnym stopniem wierzchołka oraz prawdopodobieństwem wylosowania krawędzi w tabeli 2-wymiarowej.
W praktyce jest to tabela 3-wymiarowa bo pierwszym wymiarem jest rep czyli liczba grafów.

Próbuję w ten sposób / ale gdy wydrukuję taki graf to w tabeli mam dane dziwnych wielkości i mimo, że to tablica boolowska to nie mam samych zer i jedynek.

//Generacja grafów G(n,f,p)
void gen(int n, int f, float p, int rep, bool ***tab) {   
    int k,i,j,x,x2,l;
    l=0;
    x=-1;
    zerowanie(n,rep,tab);
    for(k=0;k<rep;k++){                         
    for(i=0;i<n-1;i++){
          for(j=i+1;j<n;j++){
               srand( (unsigned)time( NULL ) );            
               if((p*100)>rand()%100){ 
                                                         
                   do{
                   x2=x;
                   x=i+1+rand()%(n-i-1);
                   if(x==x2) l++;
                   }
                   while(tab[k][i][x]!=0 || l<2*n);
                   
                   
                   if(stopien(n,k,i,x,f,tab)){
                   tab[k][i][x]=1;
                   tab[k][x][i]=1;
                   }
                   }
                   }
               }
               }
}

Funkcje pomocnicze:

int stopien(int n,int k, int i, int x, int f, bool ***tab){
    int l1,l2;
    l1=l2=0;
    for(int j=0;j<n;j++){
            if(tab[k][i][j]) l1++;
            if(tab[k][x][j]) l2++;
            }
    if(l1>=f || l2>=f)
             return 0;
    else return 1;
}


void zerowanie(int n,int rep,bool ***tab){
     for(int k=0;k<rep;k++)
     for(int i=0;i<n;i++)
     for(int j=0;i<n;i++)
     tab[k][i][j]=0;
     }

Zamysł był taki, żeby w komórkach pod przekątną zależnie od prawdopodobieństwa w losowych miejscu w kolumnie wstawić krawędź jeśli stopnie są mniejsze niż f.

0

uprościłem algorytm i nadal generuje jakiś bezsens

//Generacja grafów G(n,f,p)
void gen(int n, int f, float p, int rep, bool ***tab) {   
    int k,i,j,x;
    zerowanie(n,rep,tab);
    for(k=0;k<rep;k++){                         
    for(i=0;i<n-1;i++){
    for(j=i+1;j<n;j++){          
               if((p*100)>rand()%100){                                 
                   x=j+rand()%(n-j);
                   if(stopien(n,k,i,x,f,tab)){
                   tab[k][i][x]=1;
                   tab[k][x][i]=1;
                                              }
                                     }
                      }
               }
         }
}

wydrukowana macierz:

 0  4  1  0 208  4  1  0  1  1 
 0  4 61  0 184  4  1  1  1  1 
 1  4 61  0 160  4 61  0  1 92 
 0  4 61  0 136  4 61  0  1 114 
 0  4 61  0 112  1 61  0 67  1 
 0  4 61  0  1  4 61  0 101  1 
 1  1 61  0 64  4 61  0 78  1 
 0  1 61  0 40  4 61  0  1 59 
 1  1  1  1 16  4 61  1 101 109 
 1  1 61  0  1  1  1  0 84 101 
0

błąd był w funkcji zerowanie

generuje już się poprawnie ale nie mogę dojść do tego w jaki sposób zaimplementować tą pętlę do while przy losowaniu miejsca bo nigdy z niej nie wychodzi...

0

[img]//Generacja grafów G(n,f,p)
void gen(int n, int f, float p, int rep, bool **tab) {
int k,i,j,x,l;
zerowanie(n,rep,tab);
for(k=0;k<rep;k++)
for(i=0;i<n-1;i++){ l=0;
for(j=i+1;j<n;j++){
if((p
100)>rand()%100){
do
{
srand( (unsigned)time( NULL ) );
x=j+rand()%(n-j);
}
while(tab[k][i][x]==1 && l<f);
if(stopnie(n,k,i,x,f,tab)==1){
l++;
tab[k][i][x]=1;
tab[k][x][i]=1;
}
}
}
}
}[/img]
oto funkcja, która wydaje mi się całkowicie poprawna ale problem w tym, że dla niektórych danych liczy się w nieskończoność i co dziwniejsze te dane się chyba zmieniają ;x

0
//Generacja grafów G(n,f,p)
void gen(int n, int f, float p, int rep, bool ***tab) {   
    int k,i,j,x,l;
    zerowanie(n,rep,tab);    
    for(k=0;k<rep;k++)                       
    for(i=0;i<n-1;i++){   l=0;                         
    for(j=i+1;j<n;j++)                                 
               if((p*100)>rand()%100){
                  do
                   {          
                   x=(i+1)+rand()%(n-i-1);
                   }
                   while(tab[k][i][x]==1 && l<f);  
                   if(stopnie(n,k,i,x,f,tab)){
                   l++;
                   tab[k][i][x]=1;
                   tab[k][x][i]=1;
                   }
               }              
    }       
}

działający algorytm. Może się komuś przyda Oo

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