Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lab PDF
Lab PDF
100021578@alumnos.uc3m.es 100029567@alumnos.uc3m.es
1.
INTRODUCTION
2.
OBJETIVOS
3.
ESTRATEGIA
4.
RESOLUCION DE PROBLEMAS
4.1
| else begin
| anotar_solucion
| acertado cierto
| end
hasta que (acertado = cierto ) o (candidatos agotados)
fin procedimiento
4.2
4.3
4.3.2
Algunos Ejemplos
4.3.1
4.3.3
4.3.4
Torres de Hanoi
4.3.5
5.
5.1
IMPLEMENTACION
Descripcin General
5.2
El Problema de la Mochila
Algoritmo
5.3
Interfaz Grfico
5.4
Codificacin
5.5
Cdigo Fuente
5.5.1
BTAlgorithm
package backtracker;
import java.util.Vector;
/*
* Esta case implementa el algoritmo de BackTracking optimo
*/
public class BTAlgorithm{
//dimensiones del mapa
private int dim_x;
private int dim_y;
private int dim_z;
//sucesion de casillas que conforman la solucion
Vector movP;
//mapa del laberinto
Casilla mapa [][][];
public BTAlgorithm(Casilla mapa[][][]) {
this.mapa=mapa;
dim_x=mapa.length;
dim_y=mapa[0].length;
dim_z=mapa[0][0].length;
movP=new Vector();
}
/*
* Este etodo analiza las Casilla circundantes y devuelve un array con
las posiciones donde hay pasillo
*/
Object[] movPosibles(Posicion p){
Vector<Posicion> m=new Vector<Posicion>(3,1);
if(p.getY()>0 && mapa[p.getX()][(p.getY()-1)][p.getZ()].isNotWall()){
m.addElement(new Posicion(p.getX(),(p.getY()-1),p.getZ()));
}
if(p.getY()<(dim_y-1) &&
mapa[p.getX()][(p.getY()+1)][p.getZ()].isNotWall()){
m.addElement(new Posicion(p.getX(),(p.getY()+1),p.getZ()));
}
if(p.getX()>0 && mapa[(p.getX()-1)][p.getY()][p.getZ()].isNotWall()){
m.addElement(new Posicion((p.getX()-1),p.getY(),p.getZ()));
}
if(p.getX()<(dim_x-1) &&
mapa[(p.getX()+1)][p.getY()][p.getZ()].isNotWall()){
m.addElement(new Posicion((p.getX()+1),p.getY(),p.getZ()));
}
if(p.getZ()>0 && mapa[p.getX()][(p.getY())][p.getZ()-1].isNotWall()){
m.addElement(new Posicion(p.getX(),(p.getY()),p.getZ()-1));
}
if(p.getZ()<(dim_z-1) &&
mapa[p.getX()][(p.getY())][p.getZ()+1].isNotWall()){
m.addElement(new Posicion(p.getX(),(p.getY()),p.getZ()+1));
}
m.trimToSize();
return m.toArray();
}
/*
5.5.2
Posicion
package backtracker;
/*
* La clase Posicion representa un punto en coordenadas cartesianas
*/
public class Posicion {
private int x;
private int y;
private int z;
public Posicion(int x,int y,int z) {
this.x=x;
this.y=y;
this.z=z;
}
public void setX(int nx){
x=nx;
}
5.5.3
Casilla
package backtracker;
import java.awt.Color;
import java.awt.*;
/*
* La clase Casilla representa una casilla en el mapa del laberinto a
resolver.
* Se compone bsicamente de un elemento Posicion que define su
situacin en el mapa,
* un entero para almacenar el numero de pasos minimos necesarios para
alcanzar dicha
* posicion desde la Casilla de salida y un booleano indicador de si dicha
Casilla
* forma parte de la solucin.
* Al ser parte fundamental de la GUI, Casilla es un tipo Canvas extendido.
*/
public class Casilla extends Canvas{
//elemento Posicion que define su situacin en el mapa. Valores
especiales son:
private Posicion pos;
/*
* numero de pasos minimos necesarios para alcanzar dicha posicion
desde la Casilla de salida
* -1 si es representa un elemento no navegable (muro)
* 0 si representa la casilla de llegada
* 1 si representa la casilla de salida
*/
private int step;
//indicador de si dicha Casilla forma parte de la solucin
private boolean marked;
public Casilla(int x, int y, int z){
setBackground(Color.LIGHT_GRAY);
pos=new Posicion(x,y,z);
step=-1;
marked=false;
}
public String toString(){
return pos.toString() + " step= " + String.valueOf(step) + " marked= "
+ String.valueOf(marked);
}
//reinicia la casilla a su valor previo al calculo de la solucin
public void reset(){
if(isNotWall()){
unmark();
step=Integer.MAX_VALUE;
}
}
//cambia la naturaleza de la Casilla entre muro y pasillo
public void changeState(){
if(isNotWall()){
step=-1;
setBackground(Color.LIGHT_GRAY);
}
else{
step=Integer.MAX_VALUE;
setBackground(Color.WHITE);
}
}
public void mark(){
if(isNotTheEnd() & isNotTheBeginning() & isNotWall()){
setBackground(Color.RED);
marked=true;
}
}
public void unmark(){
if(marked)
setBackground(Color.WHITE);
}
public boolean isWall(){
return step == -1;
}
public boolean isNotWall(){
return step != -1;
}
public boolean isTheEnd(){
return step==0;
}
public boolean isNotTheEnd(){
return step!=0;
}
public void setAsEnd(){
step=0;
setBackground(Color.GREEN);
}
public void unsetAsEnd(){
step=Integer.MAX_VALUE;
setBackground(Color.WHITE);
}
public boolean isTheBeginning(){
return step==1;
}
public boolean isNotTheBeginning(){
return step!=1;
}
public void setAsBeginning(){
step=1;
setBackground(Color.BLUE);
}
public void unsetAsBeginning(){
step=Integer.MAX_VALUE;
setBackground(Color.WHITE);
}
public void setStep(int i){
step=i;
}
public int getStep(){
return step;
}
public void setPosicion(Posicion p){
pos=p;
}
public Posicion getPosicion(){
return pos;
}
public void setX(int nx){
pos.setX(nx);
}
public void setY(int ny){
pos.setY(ny);
}
public void setZ(int nz){
pos.setZ(nz);
}
public int getX(){
return pos.getX();
}
public int getY(){
return pos.getY();
}
public int getZ(){
return pos.getZ();
}
5.5.4
BackTracker
i=Integer.parseInt(alto.getText());
j=Integer.parseInt(ancho.getText());
k=Integer.parseInt(pisos.getText());
package backtracker;
import java.awt.event.*;
import java.awt.*;
import java.util.Vector;
import java.io.*;
/*
* Esta clase implementa la GUI
*/
public class BackTracker extends java.applet.Applet implements
MouseListener, ActionListener, ItemListener{
private static final long serialVersionUID = 1L;
int state;
boolean endMarked, beginningMarked;
Casilla beginningTile, endTile;
Casilla maze[][][];
Panel tablero;
Panel control;
Panel mapa[];
Button reset;
Button general;
Checkbox ffile;
TextField alto;
TextField ancho;
TextField pisos;
Label altoL;
Label anchoL;
Label pisosL;
public void init() {
state=0;
endMarked=false;
beginningMarked=false;
setSize(500,600);
reset=new Button("Resetear");
reset.setName("reset");
reset.setEnabled(false);
reset.addActionListener(this);
general=new Button("Siguiente");
general.setName("general");
general.addActionListener(this);
ffile=new Checkbox("File",false);
ffile.addItemListener(this);
alto=new TextField(3);
ancho=new TextField(3);
pisos=new TextField(2);
altoL=new Label("Alto");
anchoL=new Label("Ancho");
pisosL=new Label("Pisos");
setLayout(new BorderLayout());
tablero=new Panel();
tablero.setBackground(Color.RED);
add(tablero,BorderLayout.CENTER);
control=new Panel();
control.setBackground(Color.BLUE);
add(control,BorderLayout.SOUTH);
control.add(reset);
control.add(general);
control.add(ffile);
control.add(altoL);
control.add(alto);
control.add(anchoL);
control.add(ancho);
control.add(pisosL);
control.add(pisos);
doLayout();
}
public String getAppletInfo() {
return "Title: BackTracker";
}
private void loadWithoutFile(){
int i,ii, j,jj, k,kk;
maze=new Casilla[i][j][k];
mapa=new Panel[k];
setSize(k*500,600);
for(kk=0; kk<k; kk++){
mapa[kk]=new Panel();
mapa[kk].setSize(500,500);
mapa[kk].setBackground(Color.BLACK);
mapa[kk].setLayout(new GridLayout(i,j,1,1));
tablero.setLayout(new GridLayout(1,k,5,5));
tablero.add(mapa[kk]);
for(ii=0; ii<i; ii++){
for(jj=0; jj<j; jj++){
maze[ii][jj][kk]=new Casilla(ii,jj,kk);
maze[ii][jj][kk].addMouseListener(this);
mapa[kk].add(maze[ii][jj][kk]);
}
}
mapa[kk].doLayout();
}
tablero.doLayout();
doLayout();
}
private void loadFromFile(){
BufferedReader br;
FileDialog fd;
Vector<String> lines=new Vector<String>();
String line;
char marcas[][];
int i,ii, j,jj, k,kk;
fd=new FileDialog(new Frame(),"Abrir",FileDialog.LOAD);
fd.setVisible(true);
try {
br=new BufferedReader(new
FileReader(fd.getDirectory().concat(fd.getFile()) ));
line=br.readLine();
while(line!=null){
lines.add(line);
line=br.readLine();
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
marcas=new char[lines.size()][((String)lines.elementAt(0)).length()];
for(int merlo=0;merlo<marcas.length;merlo++)
marcas[merlo]=((String)lines.elementAt(merlo)).toCharArray();
i=marcas.length;
j=marcas[0].length;
k=1;
maze=new Casilla[i][j][k];
mapa=new Panel[k];
setSize(k*500,600);
for(kk=0; kk<k; kk++){
mapa[kk]=new Panel();
mapa[kk].setSize(500,500);
mapa[kk].setBackground(Color.BLACK);
mapa[kk].setLayout(new GridLayout(i,j,1,1));
tablero.setLayout(new GridLayout(1,k,5,5));
tablero.add(mapa[kk]);
for(ii=0; ii<i; ii++){
for(jj=0; jj<j; jj++){
maze[ii][jj][kk]=new Casilla(ii,jj,kk);
if(marcas[ii][jj]!='*')
maze[ii][jj][kk].changeState();
maze[ii][jj][kk].addMouseListener(this);
mapa[kk].add(maze[ii][jj][kk]);
ancho.setText("");
ancho.setEnabled(true);
pisos.setText("");
pisos.setEnabled(true);
}
}
mapa[kk].doLayout();
}
tablero.doLayout();
doLayout();
}
repaint();
}
public void mouseClicked(MouseEvent arg0) {
Casilla source=(Casilla)arg0.getSource();
}
public void actionPerformed(ActionEvent arg0) {
String buttonName=((Button)arg0.getSource()).getName();
switch(state){
case 1:
source.changeState();
break;
case 2:
if(beginningMarked){
if(source.isTheBeginning()){
source.unsetAsBeginning();
beginningTile=null;
beginningMarked=false;
}
}else if(source.isNotWall()){
source.setAsBeginning();
beginningTile=source;
beginningMarked=true;
}
break;
case 3:
if(endMarked){
if(source.isTheEnd()){
source.unsetAsEnd();
endTile=null;
endMarked=false;
}
}else if(source.isNotWall()){
source.setAsEnd();
endTile=source;
endMarked=true;
}
break;
}
source.repaint();
if( buttonName.equals("general") ){
switch(state){
case 0:
if(ffile.getState())
loadFromFile();
else
loadWithoutFile();
general.setLabel("definir");
state=1;
reset.setEnabled(true);
ffile.setEnabled(false);
alto.setEnabled(false);
ancho.setEnabled(false);
pisos.setEnabled(false);
break;
case 1:
general.setLabel("salida?");
state=2;
break;
case 2:
general.setLabel("llegada?");
if(beginningMarked)
state=3;
break;
case 3:
general.setLabel("resolver");
if(endMarked){
Posicion p;
BTAlgorithm solver=new BTAlgorithm(maze);
Vector
elCamino=solver.camino(beginningTile.getPosicion(),1);
elCamino.trimToSize();
for(int pp=0;pp<elCamino.size();pp++){
p=(Posicion)elCamino.elementAt(pp);
maze[p.getX()][p.getY()][p.getZ()].mark();
}
solver=null;
elCamino=null;
state=4;
}
break;
case 4:
general.setLabel("definir");
for(int a=0; a<maze.length;a++)
for(int b=0;b<maze[0].length;b++)
for(int c=0;c<maze[0][0].length;c++)
maze[a][b][c].reset();
state=1;
beginningTile.unsetAsBeginning();
beginningMarked=false;
endTile.unsetAsEnd();
endMarked=false;
break;
}
}else if( buttonName.equals("reset") ){
tablero.removeAll();
state=0;
maze=null;
mapa=null;
beginningMarked=false;
endMarked=false;
setSize(500,600);
reset.setEnabled(false);
general.setLabel("definir");
ffile.setState(false);
ffile.setEnabled(true);
alto.setText("");
alto.setEnabled(true);
}
public void itemStateChanged(ItemEvent arg0) {
if(((Checkbox)arg0.getSource()).getState()){
alto.setEnabled(false);
ancho.setEnabled(false);
pisos.setEnabled(false);
}else{
alto.setEnabled(true);
ancho.setEnabled(true);
pisos.setEnabled(true);
}
}
public void mouseEntered(MouseEvent arg0) {}
public void mouseExited(MouseEvent arg0) {}
public void mousePressed(MouseEvent arg0) {}
public void mouseReleased(MouseEvent arg0) {}
}
6.
REFERENCIAS
[1]
http://www.algoritmia.net/
[2]
http://en.wikipedia.org
[3]
http://www.uhu.es/nieves.pavon/pprogramacion/te
mario/tema4/tema4.html