package frsf.cidisi.exercise.arqueologic.situationCalculus;
import frsf.cidisi.faia.agent.ActionFactory;
import frsf.cidisi.faia.agent.Perception;
import frsf.cidisi.faia.agent.situationcalculus.KnowledgeBase;
import frsf.cidisi.faia.agent.situationcalculus.SituationCalculusPerception;
import frsf.cidisi.faia.exceptions.PrologConnectorException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;
import Clases.Aldea;
import Clases.Cofre;
import Clases.Mundo;
public class ArqueologicState extends KnowledgeBase {
private double capacidadRestante;
private String origen;
private String posicionActual;
private String destino;
private Mundo mundo;
private ArrayList<Cofre> acoplado;
private ArrayList<String> aldeasVisitadas;
private int disMin;
private int disRecorrida;
private int [][] distanciasMin;
private int percepcionCofre;
public ArqueologicState() throws PrologConnectorException {
//TODO: Replace file name
super("arqueoLogic.pl");
this.initState();
}
@Override
public ActionFactory getActionFactory() {
return ArqueologicAgentActionFactory.getInstance();
}
@Override
public String getSituationPredicate() {
return "situacionActual";
}
@Override
public String getBestActionPredicate() {
return "mejorAccion";
}
@Override
public String getExecutedActionPredicate() {
return "accionEjecutada";
}
@Override
public void updateState(Perception p) {
this.tell((SituationCalculusPerception) p);
}
@Override
public void initState() {
this.capacidadRestante = 450.0;
this.origen = Aldea.ARAGAEY;
this.posicionActual = this.getOrigen();
this.destino = Aldea.CENEDE;
this.acoplado = new ArrayList<Cofre>();
this.mundo = new Mundo();
this.aldeasVisitadas = new ArrayList<String>();
aldeasVisitadas.add(posicionActual);
this.disMin = -1;
this.disRecorrida = 0;
this.distanciasMin = mundo.distanciasMinimas();
this.percepcionCofre=ArqueologicAgentPerception.UNKNOWN_PERCEPTION;
this.addKnowledge("capacidadRestante(450,0)");
this.addKnowledge("situacionActual(0)");
this.addKnowledge("posicion(aragaey,0)");
}
@Override
public String toString() {
String str = "";
str = str + "Posici�n=\"" + this.getPosicion() + "\"\n";
str = str + "Capacidad restante=\"" + this.getCapacidadRestante() + "\"\n";
str = str + "Vecinos=\"" + this.getVecinosProlog() + "\"\n";
//str = str + "Aldeas Visitadas=\"" + this.getAldVisProlog() + "\"\n";
str = str + "Mejor accion=\"" + this.getMejorAccion() + "\"\n";
//str = str + "Carga del acoplado=\"" + this.cargaTotal() + "\"\n";
//str = str + "Valor del acoplado=\"" + this.valorTotal() + "\"\n";
//str = str + "Cantidad de cofres=\"" + this.acoplado.size() + "\"\n";
//str = str + "Distancia recorrida=\"" + this.disRecorrida + "\"\n";
//str = str + "Mundo=\" \n";
/**
* Para imprimir las adyacencias de las ditintas aldeas.
*/
/* for (int row = 0; row < 11; row++) {
str = str + "[ ";
for (int col = 0; col < 11; col++) {
str = str + mundo.getDistancias()[row][col] + " ";
}
str = str + " ]\n";
}
str = str + " \"";
str = str + "Aldeas visitadas: ";
Iterator<String> it = aldeasVisitadas.iterator();
while(it.hasNext()){
str=str+it.next()+"; ";
}*/
return str;
}
public String getPosicion(){
//return posicionActual;
String posicion="";
String consulta = "posicion(X," + this.getSituation() + ")";
Hashtable[] resultado = this.query(consulta);
posicion = resultado[0].get("X").toString();
return posicion;
}
public void setPosicion(String arg){
posicionActual = arg;
}
public double getCapacidadRestante(){
//return capacidadRestante;
String consulta = "capacidadRestante(C," + this.getSituation() + ")";
Hashtable[] resultado = this.query(consulta);
double capacidad = Double.parseDouble(resultado[0].get("C").toString());
return capacidad;
}
public void setCapacidadRestante(double arg){
capacidadRestante = arg;
}
public String getVecinosProlog(){
String name = "";
String consultaPosicion = "vecinos("+this.getPosicion()+",Y,D,"+this.getSituation()+")";
Hashtable[] resultado = this.query(consultaPosicion);
for (Hashtable h : resultado) {
name += h.get("Y").toString()+" " +h.get("D").toString()+ " ";
}
return name;
}
public String getMejorAccion() {
String consultaEstado = "mejorAccion(A,T,"+this.getSituation()+")";
Hashtable[] resultado = this.query(consultaEstado);
if(resultado.length==0)return "";
return resultado[0].get("A").toString()+" -> "+resultado[0].get("T").toString();
}
public String getAldVisProlog(){
String name = "";
String visitadas = "aldeaVisitada(AL,"+this.getSituation()+")";
Hashtable[] resultado = this.query(visitadas);
for (Hashtable h : resultado) {
name += h.get("AL").toString()+" ";
}
return name;
}
public String getOrigen() {
return origen;
}
public void setOrigen(String origen) {
this.origen = origen;
}
public String getDestino(){
return destino;
}
public void setDestino(String arg){
destino = arg;
}
public Mundo getmundo(){
return mundo;
}
public ArrayList<Cofre> getcarga(){
return acoplado;
}
public void setcarga(ArrayList<Cofre> arg){
acoplado = arg;
}
public double cargaTotal(){
double cargaT = 0.0;
Iterator<Cofre> it = acoplado.iterator();
while(it.hasNext()){
cargaT += it.next().getPeso();
}
return cargaT;
}
/**
* Funcion que retorna el valor total de los tesoros que lleva el
* agente en el acoplado.
* @return valorT
*/
public int valorTotal(){
int valorT = 0;
Iterator<Cofre> it = acoplado.iterator();
while(it.hasNext()){
valorT += it.next().getValor();
}
return valorT;
}
/**
* Resibe como parametro un elemento de la clase Cofre, y lo agrega al
* acoplado del agente.
* @param co
*/
public void agregarCofre(Cofre co){
this.acoplado.add(co);
}
public ArrayList<String> getAldeasVisitadas() {
return aldeasVisitadas;
}
public void setAldeasVisitadas(ArrayList<String> aldeasVisitadas) {
this.aldeasVisitadas = aldeasVisitadas;
}
/**
* Esta funcion retorna una ArrayList de Strings con los nombres de los vecinos de
* la posicion actual.
* @return vec
*/
public Collection<String> getVecinos() {
ArrayList<String> vec = new ArrayList<String>();
int indice = this.mundo.getNombres().indexOf(this.getPosicion());
int dist[][] = this.mundo.getDistancias();
for(int i = 0; i < 11; i++){
if(dist[indice][i] > 0){
vec.add(this.mundo.getNombres().get(i));
}
}
return vec;
}
public int getDisMin(){
return disMin;
}
public int getDisRecorrida(){
return disRecorrida;
}
public void sumarDistancia(int dis){
disRecorrida += dis;
}
public void agregarAldeaVisitada(String string) {
this.aldeasVisitadas.add(string);
}
public ArrayList<Cofre> getAcoplado() {
return acoplado;
}
public int getDistMin(){
int indiceA = this.mundo.getNombres().indexOf(posicionActual);
int indiceD = this.mundo.getNombres().indexOf(destino);
return distanciasMin[indiceA][indiceD];
}
public String ultimaAldeaVisitada(){
int cantAl = this.aldeasVisitadas.size();
if(cantAl > 1){
return this.aldeasVisitadas.get(cantAl - 2);
}
return this.aldeasVisitadas.get(cantAl - 1);
}
public void quitarUltimaAldeaVisitada() {
int cantAl = this.aldeasVisitadas.size();
if(cantAl > 1){
this.aldeasVisitadas.remove(cantAl - 1);
}
}
public int getPercepcionCofre() {
return percepcionCofre;
}
public void setPercepcionCofre(int percepcionCofre) {
this.percepcionCofre = percepcionCofre;
}
}