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.
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
'' 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
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.