Buon giorno a tutti!
Premetto che io sono capace sostanzialmente a programmare in C e C++ e mi trovo nelle pesti con questa stupidissima simulazione essenzialmente perchè la devo fare in java... allora. La mia simulazione consiste nell'avere tanti "omini" (Agent) che si spostano sul piano. Questi Agent sono caratterizzati da una specializzazione, un int (A (==0) o B(==1)) e da una Satisfaction (intero fra 0 e 10). Se gli agenti, muovendosi in modo casuale sul piano, cadono in alcuni punti particolare (chiamiamoli industrie) allora la loro soddisfazione raggiunge il massimo. Se stanno tanto tempo senza lavoro la loro soddisfazione decresce, c'è una probabilità positiva che cambino specializzazione. Posto (parte del) codice, poi lo spiego.

CODE:
//Dichiarazione di Agent
package Package_simulation;

public class Agent

{

private int ID;

private int Agent_x;

private int Agent_y;

private int Spec;

private int Satisfaction;


public Agent(int i, int p)

{

//System.out.println("Agente "+i);

ID=i;

Agent_x=(int)(Math.random()*10);

Agent_y=(int)(Math.random()*10);

Spec=p;

Satisfaction=8;

}
//dichiarazione di Point
package Package_simulation;

import java.util.*;



public class Point

{

static final int max_time=40;

private int X;

private int Y;

private int Label;

private int Point_red;

private int Point_blue;

private int Point_green;

public Vector<Agent>Agent_A;

public Vector<Agent> Agent_B;

public Point(int coord_x, int coord_y)

{

X=coord_x;
Y=coord_y;

Label=-1;

Agent_A=new Vector<Agent>();

Agent_B=new Vector<Agent>();

Point_red=255;

Point_green=255;

Point_blue=255;

}

OVVERO gli agenti si muovono e, quando capitano nel punto, vengono salvati in Agent_A o Agent_B (a seconda della loro specializzazione).
Il metodo che restituisce errori è:
//Class Agent
public void Change_Spec(int sA, int sB, Point a)

{
double aux1;

double aux2=Math.random();

int max=sA;

if(sB>sA)

{

max=sB;

}

if(sA+sB>0)

{

if(this.Spec==0)

{

if(this.Satisfaction<max)

{
aux1=0.5*(sB/(sA+sB));
if(aux2<aux1)

{
a.Change_Spec_agent(this);
}

}

}

if(this.Spec==1)

{

if(this.Satisfaction<max)
{

aux1=0.5*(sA/(sA+sB));

if(aux2<aux1)

{
a.Change_Spec_agent(this);

}

}

}

}

}
// che chiama a sua volta una funzione della class point:
public void Change_Spec_agent(Agent x)

{

if(x.Get_spec()==0)

{

x.Set_Spec(1);

this.Agent_A.removeElement(x);

this.Agent_B.add(x);

}

if(x.Get_spec()==1)

{

x.Set_Spec(0);

this.Agent_B.remove(x);
this.Agent_A.add(x);

}


}
Ora, pare che gli errori saltino fuori quando io uso la funzione remove(x); tali persistono anche se uso l'equivalente removeElement(x). La console restituisce un elegante messaggio:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5>=5
//(ma a volte 3>=3, 7>=7...)
at java.util.Vector.checkBoundExclusive(libgcj.so.81)
at java.util.Vector.ElementAt(libgcj.so.81)
at java.util.Vector.get(libgcj.so.81)
Mi rendo conto che senza sapere bene tutto il codice è difficile, ma vorrei evitare di postarlo interamente perchè, mi rendo conto, è piuttosto lungo e macchinoso.

Idee?
Grazie