Académique Documents
Professionnel Documents
Culture Documents
INVESTIGACIÓN DE OPERACIONES II
DDDDD
ING. VILLEGAS CUBAS JUAN
2018
UNIVERSIDAD NACIONAL
PEDRO RUIZ GALLO
FACULTAD DE INGENIERA CIVIL, SISTEMAS Y
ARQUITECTURA
INVESTIGACIÓN DE OPERACIONES
ALUMNOS:
-CUMPA QUESQUEN EDGARD
Modo de Juego
En la Implementación del 8-Puzzle hemos creado 4 archivos diferentes en cada uno de los
cuales se ha utilizado una heurística diferente:
% H1 ó Suma total de fichas descolocadas: heurística minorante fácil de calcular pero con
resultados que distan mucho de ser óptimos.
% H2 ó Suma de distancias de Manhattan: heurística minorante bastante efectiva. En
problemas cortos es la que mejores resultados ha obtenido.
% H3 ó Suma de secuencias: heurística no minorante, que en nuestras pruebas no ha
demostrado ser excesivamente eficaz.
% H=H2+2*H3: heurística no minorante que ha demostrado ser la más eficaz de la cuatro
utilizadas, puesto que aunque en tableros de 8-puzzle con una configuración más simple
(con menor número de movimientos) se ha visto superada por la H2, en tableros con una
complejidad elevada (18 movimientos) ha sido capaz de resolver los problemas un numero
mucho más pequeño de nodos.
[1]
Para llegar a estas conclusiones nos hemos basado en la resolución de 3 tableros diferentes
de 8-puzzle con una complejidad de 6, 12 y 18 movimientos.
En todas ella se pretende llegar a la misma matriz solución:
8-Puzzle de 6 movimientos
La primera matriz utilizada ha sido la siguiente (el 0 representa la casilla vacía):
Para resolver esta matriz de forma óptima se deben realizar 6 movimientos, los cuales son
descritos a continuación:
Para llegar a este resultado se han tenido que efectuar los 6 movimientos que acabamos
[2]
de describir y que enumeramos a continuación:
Izquierda, Abajo, Izquierda, Abajo, Derecha, Arriba
Todas las heurísticas utilizadas llegan a una solución optima, pero la diferencia principal
radica en le cantidad de recursos que necesitan para resolver el problema.
Vamos a mostrar las principales diferencias obtenidas en la resolución del problema con las
diferentes heurísticas:
8-Puzzle de 12 movimientos
Para la prueba de 12 movimientos hemos utilizado la siguiente matriz:
Arriba, Arriba, Derecha, Abajo, Izquierda, Abajo, Derecha, Arriba, Derecha, Arriba,
Izquierda, Abajo.
Si hacemos una comparación entre las diferentes heurísticas podremos comprobar que:
[3]
8-Puzzle de 18 movimientos
Para la prueba de 18 movimientos hemos utilizado la siguiente matriz:
Una solución óptima encontrada para la resolución de esta matriz de forma óptima es:
Arriba, Izquierda, Abajo, Derecha, Arriba, Derecha, Abajo, Abajo, Izquierda, Arriba,
Izquierda, Arriba, Derecha, Abajo, Derecha, Arriba, Izquierda, Abajo.
Si hacemos una comparación entre las diferentes heurísticas podremos comprobar que:
[4]
ALGORITMO DE PUZZLE EN JAVA
package puzzleJAVA;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import pieza.btnPieza;
public Game()
{
System.out.println("Creado por jc-Mouse");
}
//Inicia el juego
public void Comenzar()
{
//habilita controles
for ( int i=0; i < win.length; i++ )
matriz[i].setEnabled(true);
//desordena puzzle
int[] tmp = win;
int count = 0;
int numRandom;
for ( int i=0; i < pos_juego.length ; i++ )
pos_juego[i]=0;
do{
//obtiene numero aleatorio
numRandom = (int)( Math.random() * win.length );
//Si elemento en la posicion de numRandom es diferente de 0
if( pos_juego[numRandom]== 0)
{
pos_juego[numRandom] = tmp[count];
count++;
}
}while( count < pos_juego.length);
llenar_tablero(pos_juego,false);
}
//Finaliza el juego :)
public void Terminar()
{
for ( int i=0; i < win.length; i++ )
{
matriz[i].setDisabledIcon( new ImageIcon(getClass().getResource("/pieza/rec/logo.jpg")) );
matriz[i].setEnabled(false);
}
}
//Llena la matriz de controles con imagenes dado un array numerico con las posiciones de las mismas
¿se entendio?
private void llenar_tablero(int[] m , boolean band)
{
for ( int i=0; i < win.length; i++ )
{
if( m[i] > -1 )
{
matriz[i].setIcon( new ImageIcon(getClass().getResource("/puzzle/"+ game +"/" + m[i] + ".jpg")) [6]
);
matriz[i].setDisabledIcon( new ImageIcon(getClass().getResource("/puzzle/"+ game +"/" + m[i] +
".jpg")) );
}
else if (band)
{
matriz[i].setIcon( new ImageIcon(getClass().getResource("/puzzle/"+ game +"/" + (i+1) + ".jpg"))
);
matriz[i].setDisabledIcon( new ImageIcon(getClass().getResource("/puzzle/"+ game +"/" + (i+1) +
".jpg")) );
}
else
{
matriz[i].setIcon( new ImageIcon(getClass().getResource("/pieza/rec/vacio.jpg")) );
matriz[i].setDisabledIcon( new ImageIcon(getClass().getResource("/pieza/rec/vacio.jpg")) );
}
}
}
[10]
package puzzleJAVA;
[11]
package puzzleJAVA;
import pieza.btnPieza;
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jpCuerpoPuzzle.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0,
0)));
/*
Programador: jc Mouse
Pais: Bolivia
*/
jMenu1.setText("Archivo");
menuNewGame.setText("Nuevo Juego");
menuNewGame.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
menuNewGameActionPerformed(evt);
}
});
jMenu1.add(menuNewGame);
menuPlay.setText("Jugar");
menuPlay.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
menuPlayActionPerformed(evt);
}
});
jMenu1.add(menuPlay);
menuEnd.setText("Terminar");
menuEnd.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
menuEndActionPerformed(evt); [13]
}
});
jMenu1.add(menuEnd);
menu.add(jMenu1);
jMenu2.setText("Ayuda");
menu.add(jMenu2);
setJMenuBar(menu);
pack();
}// </editor-fold>
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new frmPrincipal().setVisible(true);
}
});
}
[15]
package pieza;
import java.awt.Dimension;
import javax.swing.Icon;
import javax.swing.ImageIcon;
public btnPieza()
{
this.setPreferredSize(new Dimension(200,150));
this.setContentAreaFilled(false);
this.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
this.setIcon(image1);
this.setDisabledIcon(image1);
this.setVisible(true);
}
[16]
CONCLUSIONES
En problemas de complejidad pequeña (número reducido de movimientos para resolver el problema) la heurística
más eficaz es la de Manhattan, ya que es capaz de resolver el problema con menor consumo de memoria (utiliza
menos nodos).
A medida que la que la complejidad del problema va aumentando se va comprobando como la utilización de
nodos por parte de las diferentes heurísticas va aumentando en grandes cantidades. Así podemos ver que la
utilización de nodos resolviendo un problema de 18 movimientos por medio de la heurística de Mahattan asciende
a 5421, mientras que con la utilización de una heurística H2+2H3 el numero de nodos se reduce a 4709. Con las
otras 2 heurísticas utilizadas el número de nodos utilizados es infinitamente mayor a estas 2 últimas, tanto que
es capaz de desbordar la memoria del ordenador impidiéndose así llegar a solución alguna.
De esta forma queda demostrado que la utilización de la heurística H2+2H3 es la más efectiva, no solo por la
menor utilización de nodos, sino porque a la larga es la única capaz de resolver problemas de este tipo con una
complejidad muy elevada utilizando al hacerlo la menor cantidad de recursos posibles.
[17]