Nuevo bonus por entropía

Como sabéis, se planteo usar la entropía (diversidad de fuentes) para limitar envíos. Concretamente se propuso:

Que el límite de envíos que puede hacer una persona (L) no sea fijo, sino que depende de su entropía (E). A más variedad, más margen tiene para enviar cosas.

La fórmula que se propuso es: L = 1 + (Lmax - 1) * E^y.

Y traducido a palabras: El número de envíos permitidos empieza en 1, y se va acercando al máximo (12) conforme aumenta la entropía del usuario, pero con una curva que crece más despacio al principio y más rápido al final.

En lugar de eso, que era buena idea pero que podía desincentivar la participación, he decidido meter un bonus en el cálculo del karma del envío en función de la entropía del usuario.

Este es el código:

  1.             // ——— BONUS POR ALTA «ENTROPÍA» DEL AUTOR ———
  2.             // Usa el porcentaje que ya calculas en perfil/API. Si no lo tienes cacheado:
  3.             $total_links = (int)$user->total_links;
  4.             if ($total_links > 1) {
  5.                 $blogs_distintos = (int)$user->blogs();
  6.                 $E = ($blogs_distintos - 1) / ($total_links - 1);   // 0..1
  7.             } else {
  8.                 $E = 0.0;
  9.             }
  10.             $E = max(0.0, min(1.0, $E));
  11.             // Curva suave tipo L = 1 + 0.15 * E^0.85 (máx. +15 %)
  12.             $expo = 0.85;
  13.             $extra_max = 0.15; // 15 %
  14.             $factor = 1 + $extra_max * pow($E, $expo);
  15.             // Regla opcional: si tiene >20 envíos y E ≥ 0.30, subir a factor fijo 1.30
  16.             if ($total_links > 20 && $E >= 0.30) {
  17.                 $factor = max($factor, 1.30); // «30 %»
  18.             }
  19.             // Convierte el factor a bonus aditivo sobre el karma actual
  20.             $entropy_bonus = (int) round($link->karma * ($factor - 1.0));
  21.             // Pequeño tope y umbral para evitar saltos exagerados o ruido
  22.             $entropy_bonus = max(min($entropy_bonus, 50), -50); // tope ±50
  23.             if (abs($entropy_bonus) >= 5) {
  24.                 $old2 = $link->karma;
  25.                 $link->karma += $entropy_bonus;
  26.                 $link->annotation .= 'Karma por «entropía» del autor (E=' . sprintf('%.0f', $E*100) . '%): ' .
  27.                 $old2 . ' → ' . $link->karma . ' (×' . sprintf('%.2f', $factor) . ")<br/>\n";
  28.             }
  29.             // ——— FIN BONUS ENTROPÍA ——

Se trata de un refuerzo que premia a quien comparte desde fuentes variadas. Primero calcula la «entropía» del autor, midiendo cuántos envíos tiene y a cuántos dominios distintos apunta; así obtiene un valor entre 0 y 1: si siempre enlaza lo mismo, E≈0; si reparte mucho, E≈1. Con esa E aplica un multiplicador «suave» al karma: «factor = 1 + 0,15 · E^0,85», es decir, como máximo suma un 15 % y la subida crece de forma cóncava para no disparar el efecto de golpe. Además añade una regla opcional: si el autor tiene más de 20 envíos y E es al menos 0,30, el factor no baja de ×1,30 (un 30 % extra). Ese factor se traduce a puntos: «bonus = karma_actual · (factor − 1)». Para que no haya saltos bruscos, se limita el bonus a ±50 puntos y se ignoran cambios menores de 5 puntos, y se deja constancia en la anotación del enlace con la entropía, el factor aplicado y el karma antes y después.

Ahora mismo está en pruebas, podemos retocarlo como queramos manteniendo el espíritu de diversificar las fuentes.