1 votos

Fórmula ponderada personalizada

Necesito una fórmula matemática que se pueda utilizar en cualquier lenguaje de programación y que me dé un valor por el que pueda ordenar o clasificar. Tengo 2 variables:

variable 1 = sólo un recuento arbitrario (podría ser algo como 0, 1, 5, 20, 50, 100)

variable 2 = número de días transcurridos desde la fecha actual (puede ser 0, 1, 2, 50, 100) Necesito una fórmula personalizada ponderada donde:

  1. entre 0-30 días a partir de la fecha actual, la variable 1 (recuento) comienza en el 100% del peso y la variable 2 en el 0% del peso. A medida que pasan los días hasta llegar a 30 días, el peso de la variable 1 desciende hasta el 50% en el día 30 y la variable 2 (número de días transcurridos) aumenta del 0% al 50% en el día 30.
  2. entre 31 y 60 días a partir de la fecha actual, la variable 1 empieza a aumentar del 50% al 100%, alcanzando su máximo en el día 60, y la variable 2 empieza a disminuir hasta 0 y llega a 0 en el día 60
  3. más allá del día 60, la variable 1 está siempre al 100% y la variable 2, obviamente, al 0%.

Por poner algunos ejemplos:

1) conjunto #1: x1 = 5,x2 = 1; conjunto #2: x1 = 5,x2 = 2 -> el conjunto #1 debería estar mejor clasificado

2) set #1: x1 = 5,x2 = 1; set #2: x1 = 6, x2 = 2 -> el set #2 debería clasificarse mucho más alto porque está al principio de los primeros 30 días y x1 debería estar alrededor del 90% y x2 cerca del 10% así que x1 es lo que cuenta aquí

A medida que x2 aumenta y llega al día 30, x1 y x2 se igualan en su peso. Después del día 30, x2 empieza a perder peso y en el día 60 deja de tener sentido y se queda en 0. Sin embargo, en el día 15, x1 tiene un peso mucho mayor que x2.

Nota: En igualdad de condiciones x1 = 100 es equivalente a x2 = 30. x1 es una cuenta arbitraria y x2 es el número de días, así que no puedo hacer x1 != x2 != 1

Tengo lo siguiente pero no cubre los 2 ejemplos anteriores: float k = abs(x2-30.0); if (k < 30.0) { // Rule 1 and 2 rank = k/60.0 + (60.0-k) * x1 / 60.0; } else { // Rule 3 rank = x1; } return rank;

Pido disculpas porque no sé qué etiquetas aplicar. Si este post no está claro, por favor sugiéralo y lo editaré para que tenga más sentido. He pensado que con dar las reglas y algunos ejemplos sería suficiente.

0voto

muaddib Puntos 6459

Sea $k$ sea el número de días transcurridos desde la fecha actual. A continuación, $60-k$ es el número de días que faltan para $60$ días después de la fecha actual.

En $k \leq 30$ tu primer peso $w_1$ se puede calcular como: $$w_1 = 100\% - w_2 = 100\%*\left(1 - \frac{k}{60}\right)$$ y el segundo es el peso restante $$w_2 = 100\% * \frac{k}{60}$$

En $k > 30$ tu primer peso $w_1$ se puede calcular como: $$w_1 = 100\% * \frac{k}{60}$$ y el segundo es el peso restante $$w_2 = 100\% - w_1 = 100\%*\left(1 - \frac{k}{60}\right)$$

Para $k > 60$ Sólo tienes que configurar $w_1 = 100\%$ y $w_2 = 0\%$ .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X