20050902

Implementació d’un Algoritme Aleatori per pesos en Java

Random Weighted Chooser in Java

Si alguna vegada us veieu en la necessitat de distribuir uniformement la carrega entre n servidors, però alhora voleu controlar qui rep més carrega amb un sistema de pesos... Aquest es el vostre algoritme.

La idea es simple:


  • Crear l'objecte

  • Fer put de tots els objectes servidor i passant-li un pes (integer i millor que sigui baixet per temes d’eficiència)

  • Per cada petició que tingueu, cridar al get sense paràmetres. L'algoritme s'encarregarà d'obtenir un objecte adient de manera aleatòria però respectant els pesos.



Diagrama técnic que he fet per preparar la implementacio :)

friky foto

Qui diu servidors, diu qualsevol cosa, en estadística serien boles blanques i negres, vull dir que es pot fer servir qualsevol tipus d'objecte. Fins i tot 'lomplir el sac" amb objectes heterogenis.



/*
* Creat per Agusti Pons el 20050901
* Class per omplir una "taula" de objectes amb pesos
* posteriorment es pot cridar al metode get() per obtenir aleatoriament
* pero mantenint el pes un objecte de la taula
* GNU license, apons at grupogodo.com
*/
package com.grupogodo.vang.util;
import java.util.HashMap;
import java.util.Random;

public class RandomWGenerator
{
HashMap list;
int max;
Random random;
int count;

public RandomWGenerator()
{
max=0;
list = new HashMap();
random = new Random();
count=0;
}

public void put (Object p_obj, int p_weigth)
{
int l_ini_element_index=this.max;
int l_end_element_index=this.max+p_weigth;

for(int i=l_ini_element_index; i<l_end_element_index; i++)
{
list.put(i, p_obj);
}
this.max=l_end_element_index;
this.count++;
}

public Object get ()
{
int r = random.nextInt(this.max);
Object l_ret = list.get(r);
return l_ret;
}

public static void main(String args[])
{
RandomWGenerator rwg = new RandomWGenerator();
rwg.put("A", 5);
for (int i=0; i<10; i++){ System.out.println("*1*-"+rwg.get());}
rwg.put("B", 20);
for (int i=0; i<10; i++){ System.out.println("*2*-"+rwg.get());}
rwg.put("C", 20);
for (int i=0; i<10; i++){ System.out.println("*3*-"+rwg.get());}
rwg.put("D", 50);
for (int i=0; i<10; i++){ System.out.println("*4*-"+rwg.get());}
}

public int size()
{
return count;
}
}



Limitacions:
Com que he optat per la simplicitat hi ha una petita limitació. No feu servir números grans com a pesos, ja que, inserto n vegades l'objecte en un HashMap on n es el pes. Si podeu fer servir pesos del 1 al 10 millor que del 1 al 1.000.

2 comentarios:

Unknown dijo...

[Starting Friky mode...]

En estadística serien boles blanques i negres, i en Minority Reports seria una BOLA ROJA.

M'en vaig a paginar una estona al DIR/precrimen...

[Friky mode ended]

ocanalejo dijo...

Interesante y útil. De hecho me ha ayudado a confirmar mis sospechas sobre cómo implementar lo que quería: Un calculador aleatorio con pesos de probabilidad.

Si tienes un rato y quieres, cambia el HashMap del ejemplo por un ArrayList o similar, porque ya sabes que el método "put" de un HashMap no admite valores "int".

Saludos Cordiales