https://foro.gambas-es.org/viewtopic.php?f=15&t=5511&p=32652#p32652
-----------------------------------
tincho
Jueves, 02 Junio 2016, 17:11

Elegir La Caja Optima
-----------------------------------
Hola, hice una función para elegir la caja optima para que me ayude a elegir las cajas que debo comprar para embalar objetos (de los cuales dispongo las dimensiones xyz)
Es bastante mejorable supongo, así que aquí se las dejo para que, si a alguien le interesa, la mejore o la use como esta.
Los problemas con los que me tope son:
> Elegir el menor valor float de una float[], las opciones .max y .min son para orden en la lista y no para su valor. Podria haber ordernado los datos pero como hay cuatro listas que comparten el mismo orden eso no era viable. Lo solucione pero dando un rodeo bastante largo.
> Orientar el objeto o la caja para que sea optimo el acople. no esta implementado en los tres ejes solo en x-y y es rudimentario.

[code linenumbers=false syntax=gambas]
Public Function BoxChooser(floXi As Float, floYi As Float, floZ As Float) As String
  '' Requiere como parametros de entrada las medidas x,y,z en metros [float]
  '' Y devuelve la caja que cuadre con dicha medidas.

  Dim flo3 As Float ' es el volumen de lo que hay que meter dentro de la caja
  Dim floX, floY As Float ' Dimensiones para intercambio x-y si es necesario

  Dim stxBoxes As New String[]
  Dim stxBoxesX As New Float[] ' Dimension en x de la caja en metros
  Dim stxBoxesY As New Float[] ' Dimension en y de la caja en metros
  Dim stxBoxesZ As New Float[] ' Dimension en z de la caja en metros
  Dim stxBoxes3 As New Float[] ' Volumen de la caja en metros cúbicos
  Dim stxBoxesV As New String[] ' Vendedor de la caja
  Dim floBoxX, floBoxY, floBoxZ, floBox3 As Float ' Dimensiones para los calculoas
  Dim strVendor As String
  Dim strModel As String
  Dim strBox As String ' Codigo de la caja
  Dim intR As Integer ' Uso para recursividad de matriz
  Dim stxWinner3 As New Float[] ' Lista de volumenes seleccionados
  Dim stxWinnerV As New String[] ' Lista de caja-vendedor seleccionados
  Dim strWinner As String
  Dim floWinner, floLoser, floRecursive As Float

  'Acomodar el orden de las medidas X-Y
  Select floXi < floYi
    Case True
      floX = floYi
      floY = floXi
    Case Else
      floX = floXi
      floY = floYi
  End Select

  flo3 = floX * floy * floZ ' Volumen input calculado

  stxBoxes.Clear
  stxBoxesX.Clear
  stxBoxesY.Clear
  stxBoxesZ.Clear
  stxBoxes3.Clear
  stxBoxesV.Clear

  'Cargar la lista de cajas disponibles estandard
  stxBoxes = Split(File.Load(User.Home &/ "boxes.txt"), "\n")

  For Each strBox In stxBoxes

    ' Valores directos
    floBoxX = CFloat(Split(strBox, "x")[0]) * 0.01
    floBoxY = CFloat(Split(strBox, "x")[1]) * 0.01
    floBoxZ = CFloat(Split(strBox, "x")[2]) * 0.01
    strVendor = Split(strBox, "x")[3]
    strModel = Split(strBox, "x")[0] & "x" & Split(strBox, "x")[1] & "x" & Split(strBox, "x")[2]
    ' Valores Calculados

    ' Descarte de volumenes menores de cajas que flo3
    floBox3 = floBoxX * floBoxY * floBoxZ

    If floBox3 >= flo3 Then
      stxBoxesX.Add(floBoxX)
      stxBoxesY.Add(floBoxY)
      stxBoxesZ.Add(floBoxZ)
      stxBoxes3.Add(floBox3)
      stxBoxesV.Add(strModel & "," & strVendor)
    Endif
  Next

  '' Hasta aca la parte de carga de los datos, de ahora en adelante viene el analisis
  For intR = 0 To stxBoxesX.Max
    If stxBoxesX[intR] >= floX Then
      If stxBoxesY[intR] >= floY Then
        If stxBoxesZ[intR] >= floZ Then
          stxWinner3.Add(stxBoxes3[intR])
          stxWinnerV.Add(stxBoxesV[intR])
        Endif
      Endif
    Endif
  Next

  'Primero obtengo el valor maximo
  floLoser = 0
  For intR = 0 To stxWinner3.Max
    If stxWinner3[intR] > floLoser Then
      floLoser = stxWinner3[intR]
    Endif
  Next

  floWinner = floLoser
  For intR = 0 To stxWinner3.Max
    If stxWinner3[intR] < floWinner Then
      floWinner = stxWinner3[intR]
      strWinner = stxWinnerV[intR]
    Endif
  Next

  Return strWinner

End

[/code]

pd: El archivo de texto boxews.txt contiene información dimensional de las cajas posibles mas el vendedor:

20x14x10xVendedor-1
20x15x20xVendedor-1
20x20x20xVendedor-1
30x30x30xVendedor-1
35x25x25xVendedor-1
40x35x40xVendedor-1
40x40x40xVendedor-1
45x45x60xVendedor-2
50x30x30xVendedor-1
50x50x50xVendedor-1
60x40x40xVendedor-1
80x60x50xVendedor-1

Saludos.


