Ir ao conteúdo

Posts recomendados

Postado

Estou desenvolvendo um trabalho de mochila binaria, o trabalho consiste em preencher a mochila aleatoriamente com 0 e 1, 12500 vezes até que encontremos uma solução viável(cujo peso não extrapole o limite da mochila), mas meu código esta quebrando na linha 26, no online GDB não mostra, mas joguei no python tutor e lá ele acusa o código quebrando na linha 26 e dando uma mensagem de "Invalid write of size 4" que impede de continuar, se alguém puder me ajudar agradeceria muito.

 

Segue o link do código : https://onlinegdb.com/ggUwu-Xbx

  • Obrigado 1
  • Confuso 1
Postado

Eu tinha colocado o link do código, que leva ao online gdb onde é mais fácil de visualizar o código, mas posso por o código aqui manualmente caso julguem mais fácil.

 

Segue o código:

 

#include <stdlib.h>
#include <time.h>
#include <stdio.h>

int Aleatorio(int n, int qt, int *maior,int *capacidade,int *somaPeso, int *somaBeneficio,int *solucao[],int *melhorSolucao[], int peso[], int beneficio[] ){
    
    
    srand( (unsigned)time(NULL));
    *somaBeneficio = 0;
    *somaPeso = 0;
    
    
    // Condição de parada //
    
    if(qt == 10){
        return 0;
    }
    // Preenche mochila com valores aleatorios entre 0 e 1 //
    
    for(int i = 0; i<n;i++){
        *solucao[i] = rand() % 2;
        if (*solucao[i] == 1){
            *somaBeneficio = *somaBeneficio + beneficio[i];
            *somaPeso = *somaPeso + peso[i];
        }
    }
    
    // Verifica se essa solução é viavel //
    
    if(*somaBeneficio > *maior && *somaPeso <= *capacidade){
        *maior = *somaBeneficio;
        for(int b = 0; b<n;b++){
            *melhorSolucao[b] = *solucao[b];
        }
        
   
    }    
    
    Aleatorio(n,++qt,maior,capacidade,somaPeso,somaBeneficio,solucao,melhorSolucao,peso,beneficio);
    
        
}
    
//-------------------------------------------------------------------------------------------------------------//
int main()
{
   int somaPeso = 0;
    int somaBeneficio = 0;
    int maior = 0;
    int capacidade = 15;
    // int peso[15] = {4,5,2,7,9,4,5,3,5,8,1,3,5,5,7};
    // int beneficio[15] = {3,6,1,3,8,3,6,4,2,4,7,5,4,6,7};
    int peso[5] = {12,1,4,1,2};
    int beneficio[5] = {4,2,10,1,2};
    int *solucao = (int*) malloc(sizeof(int)*5);
    int *melhorSolucao = (int*) malloc(sizeof(int)*5);
    
    
    Aleatorio(5,0, &maior,&capacidade, &somaPeso, &somaBeneficio, &solucao, &melhorSolucao,peso,beneficio );
    printf("beneficio: %d  ",maior);
    printf("Melhor Solução [%d, %d, %d, %d, %d]",melhorSolucao[0],melhorSolucao[1],melhorSolucao[2],
    melhorSolucao[3],melhorSolucao[4]);

    return 0;
}


A  linha que esta dando problema é essa linha:

*somaBeneficio = *somaBeneficio + beneficio[i];

  • Amei 1
Postado

É que nesse caso em especifico eu necessito usar ponteiros, pra ser mais exato, necessito usar passagem por referencia para que o valor mude fora da função também.

  • Curtir 1
Postado

@BRNMR    não precisa ser ponteiro para que receba valores em uma função e possa usar em outra ,  pode ser um vetor simples , e na Hora de enviar para a função ,  indique a posição zero do vetor , que é onde começa o endereço do vetor na memória ,  e seu código ficaria se assim  :

#include <stdlib.h>
#include <time.h>
#include <stdio.h>

int Aleatorio(int n, int qt, int* maior, int* capacidade, 
    int* somaPeso, int* somaBeneficio, int* solucao/*[]*/, 
    int* melhorSolucao[], int peso[], int beneficio[]) 
{
    srand(/*(unsigned)*/ time(NULL));
    *somaBeneficio = 0;
    *somaPeso = 0;


    // Condição de parada //

    if (qt == 10) {
        return 0;
    }
    // Preenche mochila com valores aleatorios entre 0 e 1 //

    for (int i = 0; i < n; i++) 
    {
        solucao[i] = rand() % 2;
        printf("aqui  %d\n",solucao[i]);
        if (/***/solucao[i] == 1) 
        {
            *somaBeneficio = *somaBeneficio + beneficio[i];
            *somaPeso = *somaPeso + peso[i];
            printf("somaBeneficio = %d\n", *somaBeneficio);
            printf("somaPeso = %d\n", *somaPeso);
        }
    }
    //return 0;
    // Verifica se essa solução é viavel //

    if (*somaBeneficio > *maior && *somaPeso <= *capacidade) {
        *maior = *somaBeneficio;
        printf("aqui  %d\n", *somaBeneficio);
        for (int b = 0; b < n; b++) {
            *melhorSolucao[b] = /***/solucao[b];
        }


    }

    //Aleatorio(n, ++qt, maior, capacidade, somaPeso, somaBeneficio, solucao, melhorSolucao, peso, beneficio);


}

//-------------------------------------------------------------------------------------------------------------//
int main()
{
    int somaPeso = 0;
    int somaBeneficio = 0;
    int maior = 0;
    int capacidade = 15;
    // int peso[15] = {4,5,2,7,9,4,5,3,5,8,1,3,5,5,7};
    // int beneficio[15] = {3,6,1,3,8,3,6,4,2,4,7,5,4,6,7};
    int peso[5] = { 12,1,4,1,2 };
    int beneficio[5] = { 4,2,10,1,2 };
    //int* solucao = (int*)malloc(sizeof(int) * 5);
    int solucao[5] = {0};// = (int*)malloc(sizeof(int) * 5);
    int* melhorSolucao = (int*)malloc(sizeof(int) * 5);


    Aleatorio(5, 0, &maior, &capacidade, &somaPeso, 
              &somaBeneficio, &solucao[0], 
              &melhorSolucao, peso, beneficio);
    printf("\n");
    printf("beneficio ------: %d\n", maior);
    printf("Melhor Solução -: [%d, %d, %d, %d, %d]\n\n\n", 
        melhorSolucao[0], melhorSolucao[1], melhorSolucao[2],
        melhorSolucao[3], melhorSolucao[4]);

    return 0;
}

 

Postado
23 horas atrás, BRNMR disse:

Eu tinha colocado o link do código, que leva ao online gdb onde é mais fácil de visualizar o código

 

Acessando o forum sequer dá para visualizar tal código. Apenas uma linha com um link, que leva a uma suposta sessão online de um navegador.

 

Não falo pelo forum, mas imagino que o que se espera num forum assim é que a questão tenha um título significativo e o código visível, de modo a ser possível visualizar tal código aqui e que outros que tenham dúvida similar possam se beneficiar. 

 

E alguém que ache que possa ajudar possa de imediato copiar o código para seu ambiente e testar.

 

Use o tal botão code como explicado no primeiro tópico do forum. Eis o seu programa:

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int Aleatorio(
    int n, int qt, int* maior, int* capacidade,
    int* somaPeso, int* somaBeneficio, int* solucao[],
    int* melhorSolucao[], int peso[], int beneficio[])
{
    srand((unsigned)time(NULL));
    *somaBeneficio = 0;
    *somaPeso      = 0;

    // Condição de parada //

    if (qt == 10) { return 0; }
    // Preenche mochila com valores aleatorios entre 0 e 1
    // //

    for (int i = 0; i < n; i++)
    {
        *solucao[i] = rand() % 2;
        if (*solucao[i] == 1)
        {
            *somaBeneficio = *somaBeneficio + beneficio[i];
            *somaPeso      = *somaPeso + peso[i];
        }
    }

    // Verifica se essa solução é viavel //

    if (*somaBeneficio > *maior && *somaPeso <= *capacidade)
    {
        *maior = *somaBeneficio;
        for (int b = 0; b < n; b++)
        {
            *melhorSolucao[b] = *solucao[b];
        }
    }

    Aleatorio(
        n, ++qt, maior, capacidade, somaPeso, somaBeneficio,
        solucao, melhorSolucao, peso, beneficio);
}

//-------------------------------------------------------------------------------------------------------------//
int main()
{
    int somaPeso      = 0;
    int somaBeneficio = 0;
    int maior         = 0;
    int capacidade    = 15;
    // int peso[15] = {4,5,2,7,9,4,5,3,5,8,1,3,5,5,7};
    // int beneficio[15] = {3,6,1,3,8,3,6,4,2,4,7,5,4,6,7};
    int  peso[5]       = {12, 1, 4, 1, 2};
    int  beneficio[5]  = {4, 2, 10, 1, 2};
    int* solucao       = (int*)malloc(sizeof(int) * 5);
    int* melhorSolucao = (int*)malloc(sizeof(int) * 5);

    Aleatorio(
        5, 0, &maior, &capacidade, &somaPeso,
        &somaBeneficio, &solucao, &melhorSolucao, peso,
        beneficio);
    printf("beneficio: %d  ", maior);
    printf(
        "Melhor Solução [%d, %d, %d, %d, %d]",
        melhorSolucao[0], melhorSolucao[1],
        melhorSolucao[2], melhorSolucao[3],
        melhorSolucao[4]);

    return 0;
}

 

Sobre o código e o enunciado

 

Em 21/03/2022 às 07:20, BRNMR disse:

um trabalho de mochila binaria, o trabalho consiste em preencher a mochila aleatoriamente com 0 e 1, 12500 vezes até que encontremos uma solução viável(cujo peso não extrapole o limite da mochila)

 

Não consegui associar o código com esse enunciado. O que é uma "mochila binária"? Onde entram os 12500? O que é beneficio[]? Pode postar o exemplo? Parece um exercício clássico de permutações.

 

Sobre Aleatório()

 

Uma função com nada menos que 10 parâmetros e recursiva é algo problemático.

 

  • está certo de que ela deve ser recursiva?
  • precisa mesmo de 10 parâmetros se o retorno é uma combinação de pesos?
  • se vai retornar uma combinação de pesos que atenda um critério não seria mais simples retornar simplesmente o endereço de um novo vetor com alguma permutação encontrada e que satisfaça o critério? Ou NULL se não achar uma combinação em certo tempo ou certo número de tentativas? É muito mais comum.
  • Se o máximo de pesos é pequeno não pode retornar apenas um int usando os bits, que já são 0 ou 1, como a combinação de pesos? um int pode representar 32 pesos, um long 64 pesos, um vetor de 10 long pode representar 640 pesos para uma mochila.
  • considere usar uma estrutura com a tal Mochila

 

 

 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!