Algoritmo: todas las combinaciones posibles en una matriz de 2 por 7
Resuelto
Hola a todos; antes de lanzarme a la programación de mi macro de Excel, quise hacerme el algoritmo del código porque no veía cómo hacerlo, pero estoy dando vueltas...
Estoy tratando de probar todas las combinaciones posibles para encontrar la que más se acerque a mi valor objetivo, pero no veo cómo hacerlo.
Aquí está mi problema:
Tienes una tabla como en la imagen.
Mi valor objetivo es 180 (pero el valor objetivo puede cambiar)
Al sumar un valor de cada columna (ya sea en la fila 28 o en la fila 29) y al agregar 179.667 (valor que es modificable), debemos llegar lo más cerca posible de 180.
No viendo ninguna fórmula matemática para resolver mi problema, decidí probar todas las soluciones posibles.
Aquí está el comienzo del algoritmo que hice, pero no es muy concluyente...
Sub encontrarObjetivo()
'valorObjetivo
'valInter
'valEncontrar
'valEncontrarAnt = 100000
'valAgregar = 179.667
'Para i = 28 a 29 (permite definir los números de fila a tratar en Excel)
'Para j = 2 a 8 (permite definir los números de columna a tratar en Excel)
'Para k = 0 a 1
'i = i - k
'valInter = Cells(i,j)
'valEncontrar = valEncontrar + valInter
'Fin Para
'Fin Para
'Si (valEncontrarAnt + valAgregar) - valorObjetivo>(valEncontrar + valAgregar) - valorObjetivo
'valEncontrarAnt=valEncontrar
'Fin Si
'Fin Para
Fin
Pensé en utilizar recursividad para resolver mi problema, pero no veo cómo usarla...
Gracias de antemano por su ayuda.
Espero haber sido claro.
Gracias de antemano por su ayuda.
Cordialmente.
5 respuestas
-
ColaboradorHola,
dejando de lado la recursividad, ya que no te inspira, estoy pensando en estos enfoques:
1) ¿cómo lo harías a mano, cómo te organizarías para contar todas las sumas y encontrar la mejor? Luego puedes programar eso.
2) Debes calcular 128 sumas. Podrías hacer un bucle con un índice que vaya de 1 a 127 y, usar el índice para calcular para cada columna, qué fila utilizar.
3) Anidar siete bucles, lo que quizás te inspire luego a un enfoque recursivo.