Page 1 of 1

Consulta Sobre Funcion Calcular Costo Minimo

PostPosted: Sun May 05, 2019 3:58 am
by remtec
Amigos

Muy buenas noches, necesito Urgente un Funcion que me permita Calcular Costo Minimo de la siguiente Tupla:

Tengo una Lista de la Siguiente Forma con (Tamaño, Precio): Lista_pre=[(1,1),(2,5),(3,8),(4,9),(5,10),(6,17),(7,17),(8,20)], donde:
Para ello me ingresaran una Madera de largo " N ", y debo cortarla en trozos cuya dimencion o tramaño se encuentren el la lista, la cual tiene asociado el Costo de cada corte.
Ejemplo Elementos (2,5)
1. Primer Elemento = Dimencion 2
2. Segundo Elemento = Costo 5

Necesito poder realizar un proceso de Cortes, con una funcion que me calcule en Costo minimo de trozar:
Ejemplo: Una Madera de Dimencion 4, tiene un costo de 9, debo cortarla en dimenciones menores, pero al minimo costo:
Resultado: ( 1,1,1,1) Esto indica, que puedo hacer 4 cortes de largo 1 y cada corte cuesta 1, por lo que el Costo de Corte es 4)

Alguien pueda tener una funcion Similar que pueda calcular Costo Minimo, asi podria guiarme o adptarla, si no es mucha la molestia.

Muchas gracias y muchos saludos.

Re: Consulta Sobre Funcion Calcular Costo Minimo

PostPosted: Sun May 05, 2019 6:47 pm
by jvtecheto
Hola Remtec.

Asi a bote pronto sin optimizar nada...

algo asi.

Code: Select all  Expand view


Function CalcOpc(nlargo,aMedidas)

   local n, m, ntrozos, nprecioTemporal, nMejorPrecio:= 0
   Local aLongitudes := {}, aPrecios := {} , aSolucion:= {}
   Local lPrimeraVez:= .T.

   FOR n:= 1 TO Len(aMedidas)
      AAdd(aLongitudes,aMedidas[n,1])
      AAdd(aPrecios,aMedidas[n,2])
   ENDFOR

   FOR n:=1 TO Len(aLongitudes)
      IF (aLongitudes[n]<= nlargo) .AND. ((nlargo%aLongitudes[n]) =0 )
        ntrozos:= nlargo/aLongitudes[n]
        nprecioTemporal := ntrozos*aPrecios[n]
        IF lPrimeraVez
            nMejorPrecio:= nprecioTemporal
            AAdd(aSolucion,aLongitudes[n])
            AAdd(aSolucion,aPrecios[n])
            lPrimeraVez:= .F.
        ELSEIF !lPrimeraVez .AND. (nprecioTemporal<nMejorPrecio)
            nMejorPrecio:= nprecioTemporal
            aSolucion[1]:= aLongitudes[n]
            aSolucion[2]:= aPrecios[n]
        ENDIF
      ENDIF
   ENDFOR

Return aSolucion

 


Saludos

Jose

Re: Consulta Sobre Funcion Calcular Costo Minimo

PostPosted: Sun May 05, 2019 7:14 pm
by jvtecheto
Hola amigo

Mas optimizado,
creo que mejor devuelve el indice del array que es mejor opcion,
Se puede optimizar mas, pero no tengo mas tiempo.

Code: Select all  Expand view

Function Main()

   Local aMedidas := { {1,3},{2,6},{3,10},{4,5},{5,2},{6,1},{7,2},{8,2}}
   Local n, nLargo:= 8
   n:= nCalcOpc(nLargo,aMedidas)
   ? "Indice del array", n
   ? aMedidas[n,1], aMedidas[n,2]

   Inkey(0)

 Return nil

Function nCalcOpc(nlargo,aMedidas)

   local n, r, ntrozos, nprecioTemporal, nMejorPrecio:= 0
   Local aSolucion:= {}
   Local lPrimeraVez:= .T.

   FOR n:=1 TO Len(aMedidas)
      IF (aMedidas[n,1]<= nlargo) .AND. ((nlargo%aMedidas[n,1]) =0 )
        ntrozos:= nlargo/aMedidas[n,1]
        nprecioTemporal := ntrozos*aMedidas[n,2]
        IF lPrimeraVez
            nMejorPrecio:= nprecioTemporal
            r := n
            lPrimeraVez:= .F.
        ELSEIF !lPrimeraVez .AND. (nprecioTemporal<nMejorPrecio)
            nMejorPrecio:= nprecioTemporal
            r := n
        ENDIF
      ENDIF
   ENDFOR

Return r
 


Un saludo

Jose

Re: Consulta Sobre Funcion Calcular Costo Minimo

PostPosted: Sun May 05, 2019 8:57 pm
by remtec
Jose

Hola como estas, Mil gracias por tu ayuda.

Me has salvado, lo probare.

Muchos saludos.

Re: Consulta Sobre Funcion Calcular Costo Minimo

PostPosted: Sun May 05, 2019 9:20 pm
by remtec
Hola Jose.

Solo me entrega en Costo minimo. Necesito que me registre el detalle de los cortes que debo realizar por ese costo.

He tratado de registrarlo, pero no logro hacer la lista de detalle de cortes.

Muchos Saludos

Re: Consulta Sobre Funcion Calcular Costo Minimo

PostPosted: Mon May 06, 2019 6:52 am
by jvtecheto
Hola amigo:

Mira la funcion sin codigo redundante y con el esto en el Main tiene el despieze que tienes que hacer en nCortes
el precio minimo y el indice del elemento del subarray que tienes que utilizar.

Code: Select all  Expand view

Function Main()

   Local aMedidas := { {1,1},{2,6},{3,10},{4,2},{5,2},{6,3},{7,2},{8,2}}
   Local n, nCortes, nLargo:= 24
   n:= nCalcOpc(nLargo,aMedidas) // Devuelve el indice del subarray a utilizar
   nCortes := nLargo/aMedidas[n,1] // Despiece a realizar
   QOut("Para el largo", nLargo)
   QOut("Indice del array", n)
   QOut("Longitud del corte",aMedidas[n,1],"Precio del Corte",aMedidas[n,2])
   QOut("Numero de Cortes",nCortes,"Precio", aMedidas[n,2])
   QOut("Total Precio Minimo= ",(nCortes * aMedidas[n,2]) ) // Con este tienes despiece y precio por elemento

   Inkey(0)

   Return nil

Function nCalcOpc(nlargo,aMedidas)

   local n, r, ntrozos, nprecioTemporal, nMejorPrecio:= 0
   Local lPrimeraVez:= .T.

   FOR n:=1 TO Len(aMedidas)
      IF ((nlargo%aMedidas[n,1]) =0 )
        ntrozos:= nlargo/aMedidas[n,1]
        nprecioTemporal := ntrozos*aMedidas[n,2]
        IF lPrimeraVez
            nMejorPrecio:= nprecioTemporal
            r := n
            lPrimeraVez:= .F.
        ELSEIF !lPrimeraVez .AND. (nprecioTemporal<nMejorPrecio)
            nMejorPrecio:= nprecioTemporal
            r := n
        ENDIF
      ENDIF
   ENDFOR
Return r
 


Espero que esto si solucione el asunto

Saludos.

Jose.