Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53

    [C]Scambio porzioni vettori

    Ho due vettori.
    Genero un numero random n tra 1 e (dim-2).
    Scambio le porzioni dei vettori da n in poi.
    Esempio:
    Dim = 8
    Valori ammissibili = da 0 a 14
    Vincolo: i due vettori devono essere composti da elementi distinti.

    v1: 2 4 5 7 9 10 13 14
    v2: 4 6 8 10 11 12 13 14

    Genero casualmente il taglio, ipotizziamo 4.

    Applicando lo scambio ottengo:

    v1: 2 4 5 7 11 12 13 14
    v2: 4 6 8 10 9 10 13 14

    Su v2 il numero 10 è ripetuto 2 volte...come fare per evitare questo???

    Io ho realizzato del codice ma a volte mi crasha:
    codice:
    int dim = 8,i,j;
    int v1[8], v2[8], appoggio[8];
    taglio = (RANDOM((dim-2))+1);
    
    /*copio la seconda parte di v1 nell'array di appoggio*/
            for(i = taglio; i<dim; i++)
            {
                  appoggio[i]=v1[i]; 
            }
            /*copio la seconda parte di v2 nel primo individuo*/
            for(i=taglio;i<dim;i++)
            {
                /*copio un elemento di v2 in v1*/
                v1[i] = v2[i];
                /*controllo che non vi siano doppioni*/
                for(j=0;j<taglio;j++)
                {
                    /*se trovo un doppione*/
                    if(v1[j] == v2[i])
                    {
                        /*prendo un altro random*/
                        doppione = RANDOM(15);
                    }
                    v1[i] = doppione;
    
                }
            }        
            /*copio la parte dell'array di appoggio nella seconda parte di v2*/
            for(i=taglio;i<dim;i++)
            {
                 /*copio un elemento di appoggio in v2*/
                 v2[i] = appoggio[i];
                 /*controllo che non vi siano doppioni*/
                for(j=0;j<taglio;j++)
                {
                    /*se trovo un doppione*/
                    if(v2[j] == appoggio[i])
                    {
                        /*prendo un altro nodo random*/
                        doppione = RANDOM(15);
                    }
    
                    v2[i] = doppione;
                }
            }
    Aiutooooo!!!!!!!

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    codice:
    for(j=0;j<taglio;j++)
                {
                    /*se trovo un doppione*/
                    if(v2[j] == appoggio[i])
                    {
                        /*prendo un altro nodo random*/
                        doppione = RANDOM(15);
                    }
    
                    v2[i] = doppione;
                }
    ma doppione come lo inizializzi? se l'if è falso cosa metti nel vettore v2/1[i]?

    Inoltre, non mi pare che questo codice ti assicuri l'unicità degli elementi:

    Nel tuo esempio, tu confronti 10 (appoggio) prima con 4, poi con 6, 8, 10 (v2)
    In questo caso crei un nuovo random, ma se ti esce 8 o 6 o 4 o di nuovo 10?

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53
    Allora doppione è un intero che non viene inizializzato, il primo uso che se ne fa è all'istruzione:
    codice:
    doppione = RANDOM(15)
    Per quanto riguarda invece l'unicità avevo omesso un particolare:
    i numeri contenuti in quel vettore rappresentano, in un numero binario, la posizione degli 1.
    Per esempio:
    bit: 15 numero_uni: 8

    num1: 0 0 1 0 1 1 0 1 0 1 1 0 0 1 1
    num2: 0 0 0 0 1 0 1 0 1 0 1 1 1 1 1

    Per applicare lo scambio prendo in considerazione le posizioni degli 1, quindi da ottenere due array si fatti:

    v1: 2 4 5 7 9 10 13 14
    v2: 4 6 8 10 11 12 13 14

    Ipotetico numero di taglio: 4

    applicandolo scambio ottengo:

    v1: 2 4 5 7 11 12 13 14
    v2: 4 6 8 10 9 10 13 14

    E i conseguenti individui saranno:

    num1: 0 0 1 0 1 1 0 1 0 0 0 1 1 1 1 numero di uni: 8
    num2: 0 0 0 0 1 0 1 0 1 1 1 0 0 1 1 numero di uni: 7


    così nella parte dentro if viene sostituita con:
    codice:
    /*prendo un altro nodo random, che non era già stato preso*/
                        do
                        {
                            doppione = RANDOM(nodi);
                        }while(num1[doppione] == 1);
    E nell'if sottostante al posto di num1 ci metto num2.
    Ecco come fa a generare solo numeri unici...o almeno credo!
    A volte capita che dentro a una cella di v1/2 non ci sia scritto niente, oppure un numero tipo 5489521246856 quindi quando tenta di accedere crasha tutto.

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Allora doppione è un intero che non viene inizializzato, il primo uso che se ne fa è all'istruzione:
    Il problema è quello...se non lo inizializzi non si sa cosa ci può essere dentro (0, 100 o millemila)

    codice:
    for(j=0;j<taglio;j++)
                {
                    /*se trovo un doppione*/
                    if(v2[j] == appoggio[i])
                    {
                        /*prendo un altro nodo random*/
                        doppione = RANDOM(15);
                    }
    
                    v2[i] = doppione;
                }
    Se per esempio j = 0 e v2[j] != appoggio[i] tu assegni comunque a v2[j] doppione, che non si sa quanto vale

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53
    Per passare dal numero binario, al vettore contenente interi che rappresentano gli indici ove si trovano gli 1, mi avvalgo di questo codice:
    codice:
            for(i=0, j=0;i<nodi;i++)
            { 
                 if(num1[i] == 1)
                 {
                     v1[j] = i;
                     j++;
                 }
                 
            }
    Ho provato ad applicare quello che hai detto in modo che doppione, quando usato, abbia sempre un valore:
    codice:
            for(i=taglio;i<dim;i++)
            {
                /*copio un elemento di v2 in v1*/
                v1[i] = v2[i];
                /*controllo che non vi siano doppioni*/
                for(j=0;j<taglio;j++)
                {
                    /*se trovo un doppione*/
                    if(v1[j] == v2[i])
                    {
                        do
                        {
                            doppione = RANDOM(nodi);
                        }while(num1[doppione] == 1);
                        v1[i] = doppione;
                    }
    
    
                }
            }
    Poi alla fine voglio costruire il nuovo numero binario, utilizzando questo codice:
    codice:
    /*resetto il numero*/
            for(i=0;i<dim_binario;i++)
            {
               num[i]=0;
            }          
            /*creo il nuovo numero binario*/
            for(i=0;i<dim_binario ;i++)
            {
               num1[v1[i]] = 1;
            }

    Una volta ogni 5-6 esecuzioni, il programma mi va comunque in crash perchè
    -mi perdo, non so come, qualche 1 (del vettore che contiene il numero binario)
    -di coneguenza una posizione del vettore rimane senza essere valorizzata (contenendo 15687465168465)
    -quando tento di accedere a num1[v1[i]]...tutto si ferma...

    Non riesco a capire perchè!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.