Problema matemático

Started by panreyes, June 19, 2009, 10:42:14 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

panreyes

A ver quién sabe resolver esto, a mí me trae de cabeza xD
Una empresa de transportes dispone de camiones y furgonetas para distribuir mercancías. El coste de uso de cada camión es de 145€ al día, mientras que el de cada furgoneta es de 85€ al día. Si un cliente dispone de 2000€ para realizar una distribución indica el modelo matemático que permite saber cuántos camiones y cuántas furgonetas podrá utilizar.
¿Cuántos vehículos de cada clase necesitará para gastarse el dinero disponible?

¿¿Alguien sabe como resolverlo?? xD
Tengo entendido que es necesario algún dato más para resolverlo, aunque haciendo "la cuenta' la vieja" se queda en 5 camiones y 15 furgonetas. Me quedo en: 145x+85y=2000; y no sigo adelante.

Sandman

Although this is a text book example for dynamic programming (not programming as in with code), I found it funny to do it in Bennu:

import "mod_say"

Process Main()
Private
int x,y;
int x_max;
int y_max;
int x_cost = 145;
int y_cost = 85;
int money = 2000;
Begin
x_max = 1 + money / x_cost;
y_max = 1 + money / y_cost;
for(x=0; x<x_max; x++)
for(y=0; y<y_max; y++)
if(x_cost*x+y_cost*y==money)
say("Solution:");
say("x: " + x);
say("y: " + y);
end
end
end
end


So if I understand correctly (Spanish is not my native language ;)), this will give you the answer.
-- Sandman

darío

Es un problema de optimización lineal entera, y obviamente el método de sandman resuelve comprobando 1 por una, pero el modelo matemático sería:

Minimizar Z = 2000*X + 85*y; (Z se llama función objetivo)
x, y enteras; x, y > 0 (estas son las restricciones)
Que a priori no se sabe si tiene 0, 1, o más soluciones, pero es el modelo.

Cuando el problema es tan simple, se puede hacer lo que hace Sandman, pero cuando es más complejo hay que utilizar otros métodos (porque el tiempo de cálculo sería prohibitivo). Yo recuerdo de la carrera un método llamado Branch-and-bound.
My sites:
Smart Fpg Editor - Painless FPG Edition for Bennu and PixTudio
fenixlib - .NET support for manipulating PixTudio, Bennu and Div graphic formats

SplinterGU

#3
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

panreyes

Ese ejercicio ha aparecido en un examen de una prueba de acceso de la comunidad valenciana, y toda persona que conozco no ha sabido hacerlo xD
Y yo también lo hice en Bennu, pero claro, en ese examen no permitían Bennu xD

begin
from x=0 to 100; from y=0 to 100; if((x*145)+(y*85)==2000) say(x+","+y); end end end
end

Sandman, tu ejemplo está perfecto, pero no sirve en el examen
Darío, eso no entiendo... ¿cómo se resolvería después?
Splinter, para resolver cualquiera de esas tengo entendido que necesitas algún dato más para crear un sistema del cual puedas sacar las dos incógnitas.
¿Existe un método que no sea el que hemos programado en Bennu? xD

SplinterGU

#5
Leiste el wiki que puse?
No es mas que eso... o sea, para la ecuacion que planteas, realmente podria darse el caso de no existir una solucion unica... no hice todos los casos, pero podria darse el caso... para numeros reales, obviamente que hay gran cantidad de resultados posibles, pero para numeros enteros se acota, sin embargo, puede que no exista una unica solucion...
Eso del for, es una paparuchada... no es serio...
Matematicamente son ecuaciones de primer grado con 2 incognitas... no hay vueltas al asunto.

No se necesita ningun dato extra... ahora si pensamos en el ejemplo, el mismo es irreal, porque seria estupidisimo basar una distribucion de mercancias teniendo en cuenta tan pocos factores... deberian considerarse cantidad de puntos de distribucion, rutas a recorrer, distribucion geografica de los mismos (para aprovechar recorridos), cantidad de mercancia a distribuir (para evaluar si vale la pena usar una furgoneta o un camion), y muchos otros factores mas... pero para el estupido enunciado en cuestion lo que va es lo que puse arriba...

EDIT: Tu solucion y la de Sandman, solo son validas si la ecuacion con valores de X e Y positivos da exactamente el dinero a gastar, cosa que puede no ser valido para otros casos, en los cuales el sistema que ambos plantean caeria en ridiculo. Y matematicamente carece de validez. O sea, si no da "=" a 2000, no encuentra valores validos aunque haya valores validos sobrando algo de dinero.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

laghengar

Yo pondría una reclamación y que expliquen como se hace ese problema, me parece una tomadura de pelo. No es nada serio que se ponga ese tipo de preguntas en un examen.

Me ha parecido muy mal.

De todas formas la solución que plantean es estúpida, yo cogería todos los camiones que pudiese 2000/145, para tener el mayor número de vehículos. Ahora, si hay algún problema por no poder usar esos camiones que los expliquen.

A lo mejor la solución es esa, osea, tienes que hacer que 145 X n_camiones + 85 X n_furgonetas = 2000 exactos.

Empezaría por coger el maximo común divisor entre 145 y 2000. Que es el 5.

145*5= 725

2000-725=1275

1275/85=15

Fíjate que me da eso. Pero no me convence.
!!!Blender Blender Blender yuhuuuuuuu¡¡¡ novato o_O

SplinterGU

#7
jajaja... ver que tomen algo tan estupido da bronca, no?

jajaja...

No se que tipo de examen es este? Quizas PiXeL deberia dar mas detalles? Es un examen de informatica? un examen matematico? que tipo de examen es?

Pero segun entiendo yo, esto es un examen que puede ser graficado, y la forma correcta es la siguiente:


import "mod_say"
import "mod_text";
import "mod_draw";
import "mod_screen";
import "mod_video";
import "mod_key";
import "mod_map";

Process Main()
Private
    int x_max;
    int y_max;
    int x_cost = 145;
    int y_cost = 85;
    int money = 2000;
    int best_x = -1;
    int best_found = 0;
Begin
    set_mode(640,480,32);

    drawing_color(rgba(255,255,0,64));
    for(x=0; x < 64; x++)
        draw_line(x*10,0,x*10,479);
    end

    for(y=0; y < 48; y++)
        drawing_color(rgba(255,255,0,64));
        draw_line(0,y*10,639,y*10);
    end

    drawing_color(rgba(255,255,255,255));
    draw_line(20,0,20,479);
    draw_line(0,460,639,460);

    write(0,5,10,0, "Y" );
    write(0,625,465,0, "X" );

    write_int (0,100,10,0,&best_found);
    write_int (0,100,20,0,&best_x);

    x_max = money / x_cost;

    for(x=0; x < x_max; x++)
        y = ( money - x_cost * x ) / y_cost ; /* y = ( 2000 - 145 * x ) / 85 */

        drawing_color(rgba(0,255,0,128));

        draw_box(18+x*10,458-y*10,22+x*10,462-y*10);
        write(0,30+x*10,455-y*10,0, "(" + x + ", " + y + ", " + ( x_cost * x + y_cost * y ) + ")" );

        if ( best_x == -1 || ( best_found > money - ( x_cost * x + y_cost * y ) ) )
            best_found = money - ( x_cost * x + y_cost * y );
            best_x = x;
        end
    end

    if ( best_x != -1 )
        drawing_color(rgba(255,0,0,196));
        y = ( money - x_cost * best_x ) / y_cost ; /* y = ( 2000 - 145 * x ) / 85 */
        draw_box(16+best_x*10,456-y*10,24+best_x*10,464-y*10);
    end

    while(!key(_ESC))
        frame;
    end
end


EDIT: Converti los tabs a espacios.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

Prueben cambiar los valores y veran como esto siempre muestra la mejor opcion.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2