es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encuentre todas las posibilidades de una distribución porcentual (2 puntos decimales) para hacer algo en cada caso.

Aquí está el problema, necesito ejecutar una función para cada posibilidad de porcentaje (2 puntos decimales). Para eso, necesito un algoritmo que identifique cada caso para n elementos.

Por ejemplo:
Un arreglo de 2 elementos tendría la siguiente distribución:

[1.00, 0.00]
[0.99, 0.01]
[0.98, 0.02]
[0.97, 0.03]
[...]

Pero en casos de más elementos, esto es más complejo:

[1.00, 0.00, 0.00, 0.00]
[0.99, 0.01, 0.00, 0.00]
[0.99, 0.00, 0.01, 0.00]
[0.99, 0.00, 0.00, 0.01]
[0.98, 0.02, 0.00, 0.00]
[0.98, 0.01, 0.01, 0.00]
[0.98, 0.01, 0.00, 0.01]
[0.98, 0.00, 0.02, 0.00]
[0.98, 0.00, 0.01, 0.01]
[0.98, 0.00, 0.00, 0.02]
[0.97, 0.03, 0.00, 0.00]
[0.97, 0.02, 0.01, 0.00]
[0.97, 0.02, 0.00, 0.01]
[0.97, 0.01, 0.02, 0.00]
[0.97, 0.01, 0.00, 0.02]
[0.97, 0.01, 0.01, 0.01]
[0.97, 0.00, 0.03, 0.00]
[0.97, 0.00, 0.00, 0.03]
[0.97, 0.00, 0.02, 0.01]
[0.97, 0.00, 0.01, 0.02]
[...]

¿Alguien conoce una forma de encontrar estos casos para n elementos?
No es necesario guardar el arreglo en memoria, solo ejecutar una función o una parte del código para cada uno de estos casos.
Este código/función podría ser simplemente una impresión del caso.
Acepto cualquier lenguaje como respuesta, gracias por su atención.

[Edit 1] La solución que creé con la ayuda de Alejandro fue la siguiente:

import numpy as np

n = 4

f = open("possibilities.txt", "w")

def getPossibilities(array):
  if array == None:
    array = []

  alreadySummed = sum(array)
  remaining = round(1 - alreadySummed, 2)

  if(len(array) == n-1):
    newArr = [*array, remaining]
    f.write(str(newArr) + "\n")
    return

  allRemainingPossibilities = np.arange(0, remaining + 0.01, 0.01)
  for possibility in allRemainingPossibilities:
    newArr = [*array, round(possibility, 2)]
    getPossibilities(newArr)

getPossibilities(None)

f.close()

Básicamente, para cada posibilidad inicial, el código busca las posibilidades restantes. Y en cascada, me muestra todas las posibilidades.

Tags:  

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, puedo proporcionar un algoritmo potencial para resolver este problema:

    1. Define el número de elementos, n, para encontrar las posibilidades.
    2. Inicializa una lista vacía, output, para almacenar los resultados.
    3. Para cada posibilidad, i, desde 1.00 hasta 0.00 en decrementos de 0.01 (incluyendo):
      • Si n es 1, agrega [i] a output y continúa con la siguiente posibilidad.
      • Si n es mayor que 1, llama recursivamente al algoritmo con n-1 y el porcentaje restante, 1-i, como argumentos.
        • Para cada posibilidad devuelta por la llamada recursiva, agrega i al principio de la lista y luego agrega la posibilidad a output.
    4. Devuelve output.

    Aquí hay una implementación posible de este algoritmo en Python:

    def get_possibilities(n):
        output = []
        for i in np.arange(1.00, -0.01, -0.01):
            if n == 1:
                output.append([i])
            else:
                for possibility in get_possibilities(n-1, round(1-i, 2)):
                    output.append([i] + possibility)
        return output
    

    Esta implementación utiliza la recursividad para iterar a través de todas las combinaciones posibles de elementos y porcentajes. Inicializa una lista vacía, output, para almacenar los resultados y luego recorre cada posibilidad, i, desde 1.00 hasta 0.00 en decrementos de 0.01. Si n es 1, agrega la posibilidad actual a output. De lo contrario, realiza una llamada recursiva a la función con n-1 y el porcentaje restante, 1-i, como argumentos. Para cada posibilidad devuelta por la llamada recursiva, agrega i al principio de la lista y luego agrega esa posibilidad a output. Finalmente, devuelve output, que contiene todas las combinaciones posibles de elementos y porcentajes para el valor n dado.

Comments are closed.