/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package algoritmo;

/**
 *
 * @author Marília
 */

public class SensorFitness extends Sensor{

	/**
	 * @param args
	 */
	private int contador = 0;
    private int tamanhoMemoria = 3;
    private ConjuntoDeSolucoes memoriaDeSolucoes;//Acesso à memória do agente
    private boolean objetivoEncontrado;
    //Limiar para detecção de alvo dentro do espaço avaliado
    private int nivelPrecisao = 10;
    //Erro Associado ao sensor em qualquer avaliação ded fitness
    private int erroAssociadoAoSensor = 0;

	public SensorFitness(ConjuntoDeSolucoes conjuntoDeSolucoes){
		setSensorDiametro(100);//em metros
        setCor(new java.awt.Color(255, 50, 50,150));//cor que representa o sensor(vermelho)
        objetivoEncontrado = false;
        this.memoriaDeSolucoes = conjuntoDeSolucoes;
	}
	
	public Solucao sensorResponse(double[] posicao){
		double errorValue = 0;
		Solucao functionEvaluation = null;//Calcula o fitness
		
		double sensorResponse;
		
		if(functionEvaluation.getFitness() > nivelPrecisao){
			sensorResponse = functionEvaluation.getFitness() + errorValue;
            objetivoEncontrado = true;
        }
		else{
			sensorResponse = 0;
            objetivoEncontrado = false;
        }
        functionEvaluation.setFitness(sensorResponse);//corrige fitness

        atualizarUtilidadesDasSolucoes(functionEvaluation);
        atualizaMemoriaLocaisVisitados(functionEvaluation);

		return functionEvaluation;
	}//

    public void atualizarUtilidadesDasSolucoes(Solucao solucao){
        double distanciaMinimaPermitida = solucao.getRaioDaAreaDaImagemEmMetros()*2;
        this.memoriaDeSolucoes.atualizarUtilidades(solucao,distanciaMinimaPermitida , false);

    }
    public void atualizaMemoriaLocaisVisitados(Solucao solucao){
        //Atualiza ultimos locais visitados

        if(!this.memoriaDeSolucoes.existeSolucao(solucao.getPosicao()))
            this.memoriaDeSolucoes.inserirSolucao(solucao);
        else{
            System.out.println("Não inseriu posição! ");
        }

    }

   
    public boolean isObjetivoEncontrado() {
        return objetivoEncontrado;
    }

    public void setObjetivoEncontrado(boolean objetivoEncontrado) {
        this.objetivoEncontrado = objetivoEncontrado;
    }

    public int getNivelPrecisao() {
        return nivelPrecisao;
    }

    public void setNivelPrecisao(int sensorAccuaracyLevel) {
        this.nivelPrecisao = sensorAccuaracyLevel;
    }

    public int getErroAssociadoAoSensor() {
        return erroAssociadoAoSensor;
    }

    public void setErroAssociadoAoSensor(int erroAssociadoAoSensor) {
        this.erroAssociadoAoSensor = erroAssociadoAoSensor;
    }

    public int getTamanhoMemoria() {
        return tamanhoMemoria;
    }

    public void setTamanhoMemoria(int tamanhoMemoria) {
        this.tamanhoMemoria = tamanhoMemoria;
    }

    public ConjuntoDeSolucoes getMemoriaDeSolucoes() {
        return memoriaDeSolucoes;
    }

    public void setMemoriaDeSolucoes(ConjuntoDeSolucoes conjuntoDeSolucoes) {
        this.memoriaDeSolucoes = conjuntoDeSolucoes;
    }

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

