Publicidad

Ayuda con problema de backtracking (recursividad) de optimización en C

Publicado por Albpenu, 24 Septiembre de 2021, 12:56

Tema anterior - Siguiente tema

0 Usuarios y 1 Visitante están viendo este tema.

Albpenu

Hola compas :), por favor, a ver si podéis echarme una manilla sobre cómo abordar correctamente la única condición que me queda en este problema de optimización, en el que se pretende crear un andamio con hasta 5 piezas y minimizando su coste:

No logro almacenar en el array con 0 y 1 (andamio[]) la solución correcta de mínimo coste (*costeAndamio < coste_total).

He probado con: min 7m, max 8m, y <=25 y me devuelve las piezas 1 y 2, en lugar de la 4, que sería la más barata.

Aquí parte del código (el necesario para entender lo que quiero hacer :)):

void insertarPiezas(Pieza piezas[]) 
{
    piezas[0].altura = 5;
    piezas[0].peso = 10;
    piezas[0].coste = 50;

    piezas[1].altura = 3;
    piezas[1].peso = 13;
    piezas[1].coste = 70;

    piezas[2].altura = 4;
    piezas[2].peso = 28;
    piezas[2].coste = 80;

    piezas[3].altura = 7;
    piezas[3].peso = 25;
    piezas[3].coste = 100;

    piezas[4].altura = 6;
    piezas[4].peso = 30;
    piezas[4].coste = 90;

}

***************ESTA DE DEBAJO ES LA PARTE QUE ME INTERESA Y NO FUNCIONA CORRECTAMENTE EN EL IF...********************

void actualizarSolucion(int solucion_parcial[], Pieza piezas[], int andamio[],int *alturaAndamio, int *pesoAndamio, int *costeAndamio, int alturaMin)
{
    int altura_total = 0, peso_total = 0, coste_total = 0;

    for(int i = 0; i < NUM_PIEZAS; i++)
    {
        if(solucion_parcial[i] == 1){
            altura_total += piezas[i].altura;
            peso_total += piezas[i].peso;
            coste_total += piezas[i].coste;
        }
    }

    if(alturaMin <= altura_total && *costeAndamio <= coste_total){
        printf("\nCoste andamio = %d vs Coste total = %d", *costeAndamio, coste_total);

        minimoCoste(solucion_parcial, andamio, altura_total, peso_total, coste_total, *alturaAndamio, *pesoAndamio, *costeAndamio);

        *alturaAndamio = altura_total;
        *pesoAndamio = peso_total;
        *costeAndamio = coste_total;
    }
}

int minimoCoste(int solucion_parcial[], int andamio[], int altura_total, int peso_total, int coste_total, int *alturaAndamio, int *pesoAndamio, int *costeAndamio)
{

        for(int i = 0; i < NUM_PIEZAS; i++)
        {
            andamio[i] = solucion_parcial[i];
            printf("\n %d ",andamio[i]);
        }
    return andamio;
}


Y MUCHÍSIMAS GRACIAS!!! :)

Rock Lee

Perdona no entendi bien ¿No te da valor correcto? ¿Te da error al no tomar el valor que deseas? por como esta todo junto al probarlo me da un error lógico, como no define bien el valor a tomar manda el primero que toma como correcto. Igualmente tengo hacer mas pruebas en mi PC...


Suludos Familia!

Temas Similares (5)