package algoritmo;



public class Particula extends Agente{

	private double[] velocidade = null;
	private double pbestFit = -1;
	private double[] pbestPosicao = null;
	
	
	boolean gFlag = false;//new gbest found
	
	public Particula(int id) {
		super(id);
		// TODO Auto-generated constructor stub
	}
	
	public void ciclo(int w, Solucao gBest){
		
		
		double fitness = 1;//getSensor().sensorResponse(getPosicao());

		setFitness(fitness);
		
		if(fitness>pbestFit){
			pbestFit = fitness;
			pbestPosicao = getPosicao();
			if(fitness > gBest.getFitness()){
				System.out.println("ID "+ getIdAgente() +": Meu fitness � maior que meu gbest - atualizei meu gbest");
				gFlag =true;// atualizei a minha informa��o de gbest
				//gBestFit = fitness;
			}
		}
		
		//Se achou o alvo, vai parar de se alcancarDestino
		if(fitness==1)
			setEstadoDePausa(true);
		
		mover(w, gBest.getPosicao());
		
		boolean flagBroadcastGbestPosicao =false;
		
		// se atualizei o meu gbest, notifico aos outros
		if(gFlag){
			// broadcast gbestfit
			gBest.setFitness(fitness);
			gBest.setPosicao(getPosicao());
			// diz que o meu gbest � o Global best, pois � melhor que todos
			// os outros gbests
			System.out.println(" ID: "+ getIdAgente() +"  broadcast gbestfit");
		}
		
	}
	
	private void mover(double w, double[] gBestPosicao){
		
		if(!isEstadoDePausa()){
			
			double[] posicao = getPosicao();
			
			for(int i = 0; i<getPosicao().length;i++){
				
				velocidade[i] = velocidade[i]*w +2*Math.random()*(pbestPosicao[i] - posicao[i])+2*Math.random()*(gBestPosicao[i] - posicao[i]);
				posicao[i] = posicao[i] + velocidade[i];
				System.out.println("Particula: "+getIdAgente()+ " A-Mover=> velocidade:  "+velocidade+"  posicao:  "+posicao);
			}
			setPosicao(posicao);
		}
	}

	
	public double[] getVelocidade() {
		return velocidade;
	}

	public void setVelocidade(double[] velocidade) {
		this.velocidade = velocidade;
	}

	public double getPbestFit() {
		return pbestFit;
	}

	public void setPbestFit(double pbestFit) {
		this.pbestFit = pbestFit;
	}

	public double[] getPbestPosicao() {
		return pbestPosicao;
	}

	public void setPbestPosicao(double[] pbestPosicao) {
		this.pbestPosicao = pbestPosicao;
	}




}
