MH-P1/docs/Summary.org

117 lines
3.6 KiB
Org Mode

#+TITLE: Práctica 1
#+SUBTITLE: Metaheurísticas
#+AUTHOR: Amin Kasrou Aouam
#+DATE: 2021-04-19
#+PANDOC_OPTIONS: template:~/.pandoc/templates/eisvogel.latex
#+PANDOC_OPTIONS: listings:t
#+PANDOC_OPTIONS: toc:t
#+PANDOC_METADATA: lang=es
#+PANDOC_METADATA: titlepage:t
#+PANDOC_METADATA: listings-no-page-break:t
#+PANDOC_METADATA: toc-own-page:t
#+PANDOC_METADATA: table-use-row-colors:t
#+PANDOC_METADATA: logo:/home/coolneng/Photos/Logos/UGR.png
#+LaTeX_HEADER: \usepackage[ruled, lined, linesnumbered, commentsnumbered, longend]{algorithm2e}
* Práctica 1
** Introducción
En esta práctica, usaremos distintos algoritmos de búsqueda para resolver el problema de la máxima diversidad (MDP). Implementaremos:
- Algoritmo /Greedy/
- Algoritmo de búsqueda local
** Algoritmos
*** Greedy
El algoritmo /greedy/ añade de forma iterativa un punto, hasta conseguir una solución de tamaño m.
En primer lugar, seleccionamos el elemento más lejano de los demás (centroide), y lo añadimos en nuestro conjunto de elementos seleccionados. A éste, añadiremos en cada paso el elemento correspondiente según la medida del /MaxMin/. Ilustramos el algoritmo a continuación:
\begin{algorithm}
\KwIn{A list $[a_i]$, $i=1, 2, \cdots, m$, that contains the chosen point and the distance}
\KwOut{Processed list}
$Sel = [\ ]$
$centroid \leftarrow getFurthestElement()$
\For{$i \leftarrow 0$ \KwTo $m$}{
\For{$element$ in $Sel$}{
$closestElements = [\ ]$
$closestPoint \leftarrow getClosestPoint(element)$
$closestElements.append(closestPoint)$
}
$maximum \leftarrow max(closestElements)$
$Sel.append(maximum)$
}
\KwRet{$Sel$}
\end{algorithm}
*** Búsqueda local
El algoritmo de búsqueda local selecciona una solución aleatoria, de tamaño /m/, y explora durante un número máximo de iteraciones soluciones vecinas.
Para mejorar la eficiencia del algoritmo, usamos la heurística del primer mejor (selección de la primera solución vecina que mejora la actual). Ilustramos el algoritmo a continuación:
\begin{algorithm}
\KwIn{A list $[a_i]$, $i=1, 2, \cdots, m$, the solution}
\KwOut{Processed list}
$Solutions = [\ ]$
$firstSolution \leftarrow getRandomSolution()$
$Solutions.append(firstSolution)$
$lastSolution \leftarrow getLastElement(neighbour)$
$maxIterations \leftarrow 1000$
\For{$i \leftarrow 0$ \KwTo $maxIterations$}{
\While{$neighbour \leq lastSolution$}{
$neighbour \leftarrow getNeighbouringSolution(lastSolution)$
$Solutions.append(neighbour)$
$lastSolution \leftarrow getLastElement(neighbour)$
}
$finalSolution \leftarrow getLastElement(Solutions)$
}
\KwRet{$finalSolution$}
\end{algorithm}
** Implementación
La práctica ha sido implementada en /Python/, usando las siguientes bibliotecas:
- NumPy
- Pandas
*** Instalación
Para ejecutar el programa es preciso instalar Python, junto con las bibliotecas *Pandas* y *NumPy*.
Se proporciona el archivo shell.nix para facilitar la instalación de las dependencias, con el gestor de paquetes [[https://nixos.org/][Nix]]. Tras instalar la herramiento Nix, únicamente habría que ejecutar el siguiente comando en la raíz del proyecto:
#+begin_src shell
nix-shell
#+end_src
*** Ejecución
La ejecución de ambos algoritmos se realiza mediante el siguiente comando:
#+begin_src shell
python src/main.py <dataset> <algoritmo>
#+end_src
Los parámetros posibles son:
| dataset | algoritmo |
| Cualquier archivo de la carpeta data | greedy |
| | local |