Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



Mostrando entradas con la etiqueta algoritmos. Mostrar todas las entradas
Mostrando entradas con la etiqueta algoritmos. Mostrar todas las entradas

viernes, 4 de julio de 2014

Ejemplo de Uso de función recursiva: Obtener lista de archivos y directorios

Ejemplo de Uso de función recursiva: Obtener lista de archivos y directorios

Básicamente es una función que se llama a si misma, hasta llegar a una cierta condición la cual hace que termine el proceso.

El ejemplo típico es el cálculo del factorial de un número:



También se usa para crear  fractales:




Os dejo un simple ejemplo, con el cual consigo que se liste los archivos, subdirectorios y archivos de estos dada una ruta, usando la recursividad:




Saludos


Jsbsan

viernes, 23 de mayo de 2014

Resolución del problema de la mochila en varias estrategias, algoritmos voraces



Resolución del problema de la mochila en varias estrategias, algoritmos voraces





En algoritmia, el problema de la mochila, comúnmente abreviado por KP (del inglés Knapsack problem) es un problema de optimización combinatoria, es decir, que busca la mejor solución entre un conjunto de posibles soluciones a un problema. Modela una situación análoga al llenar una mochila, incapaz de soportar más de un peso determinado, con todo o parte de un conjunto de objetos, cada uno con un peso y valor específicos. Los objetos colocados en la mochila deben maximizar el valor total sin exceder el peso máximo



Estrategias para resolverlo, llenar la mochila:
1) Con los elementos más costosos
2) Con los elementos menos pesados
3) Con los elementos que tenga mayor beneficio por unidad de peso ( coeficiente entre valor y peso)
4) Algoritmo Backtracking (o vuelta atrás):
     Es  un recorrido en profundidad dentro de un grafo dirigido. El grafo en cuestión suele ser un árbol. El objetivo del recorrido es encontrar soluciones para algún problema. Esto se consigue construyendo soluciones parciales a medida que progresa el recorrido; estas soluciones parciales limitan las regiones en las que se puede encontrar una solución completa. El recorrido tiene éxito si, procediendo de esta forma, se puede definir por completo una solución. En este caso el algoritmo puede, o bien detenerse (si lo único que se necesita es una solución del problema) o bien seguir buscando soluciones alternativas (si deseamos examinarlas todas). Por otra parte, el recorrido no tiene éxito si en alguna etapa la solución parcial construida hasta el momento no se puede completar. En tal caso, el recorrido vuelve atrás exactamente igual que en un recorrido en profundidad, eliminando sobre la marcha los elementos que se hubieran añadido en cada fase. Cuando vuelve a un nodo que tiene uno o más vecinos sin explorar, prosigue el recorrido de una solución.

A continuación, este problema resueldo aplicando las distintas estrategias, usando Gambas3
Estructura del Proyecto:



Clase Elemento:
--


Clase ProblemaMochila:
--

Programa Principal:
-
-


Resultados:
.......................................
Estrategia: mayor_valor
Nombre: TV Valor:300 Peso:15
Nombre: VideoBeam Valor:200 Peso:4
Nombre: ipod Valor:150 Peso:1
-------------
Peso:   20
Valor:  650
.......................................
Estrategia: menos_peso
Nombre: DVD Valor:5 Peso:0.5
Nombre: Blu-Ray Valor:50 Peso:0.5
Nombre: Balon Valor:30 Peso:0.5
Nombre: BlackBerry Valor:150 Peso:0.5
Nombre: Libro Java Valor:10 Peso:1
Nombre: ipod Valor:150 Peso:1
Nombre: ipad Valor:150 Peso:2
Nombre: PS3 Valor:100 Peso:3
Nombre: Laptop Valor:20 Peso:3
Nombre: Printer Valor:20 Peso:4
Nombre: VideoBeam Valor:200 Peso:4
-------------
Peso:   18
Valor:  885
.......................................
Estrategia: coeficiente_valor/peso
Nombre: BlackBerry Valor:150 Peso:0.5
Nombre: ipod Valor:150 Peso:1
Nombre: Blu-Ray Valor:50 Peso:0.5
Nombre: ipad Valor:150 Peso:2
Nombre: Balon Valor:30 Peso:0.5
Nombre: VideoBeam Valor:200 Peso:4
Nombre: PS3 Valor:100 Peso:3
Nombre: PC Valor:100 Peso:5
Nombre: Libro Java Valor:10 Peso:1
Nombre: DVD Valor:5 Peso:0.5
-------------
Peso:   16
Valor:  945
.......................................
Algoritmo Backtracking
Nombre: VideoBeam Valor:200 Peso:4
Nombre: ipod Valor:150 Peso:1
Nombre: ipad Valor:150 Peso:2
Nombre: BlackBerry Valor:150 Peso:0.5
Nombre: PS3 Valor:100 Peso:3
Nombre: PC Valor:100 Peso:5
Nombre: Blu-Ray Valor:50 Peso:0.5
Nombre: Balon Valor:30 Peso:0.5
Nombre: Laptop Valor:20 Peso:3
Nombre: DVD Valor:5 Peso:0.5
-------------
Peso:   18
Valor:  955



Enlace de descarga del código fuente: enlace a box.com

Fuentes:

http://es.wikipedia.org/wiki/Problema_de_la_mochila
http://es.wikipedia.org/wiki/Vuelta_atr%C3%A1s
http://cala.unex.es/cala/epistemowikia/index.php?title=Backtracking
http://jorgep.blogspot.com.es/2010/11/problema-de-la-mochila.html
http://jorgep.blogspot.com.es/2010/11/problema-de-la-mochila-algoritmos.html
http://jorgep.blogspot.com.es/2010/11/problema-de-la-mochila-backtracking.html




domingo, 11 de agosto de 2013

Cálcular el dígito de control del código de barras EAN13




Cálcular el dígito de control del código de barras EAN13

He encontrado en la wikipedia (http://es.wikipedia.org/wiki/European_Article_Number) , como se calcula el digito de control de estos códigos de barras, os dejo como se haría con  Gambas3:




Public Sub calculodigitocontrol(cadena As String) As Integer
'Cálculo del dígito de control EAN
Dim iSum As Integer = 0
Dim iDigit As Integer = 0
Dim EAN As String = cadena
Dim i As Integer
For i As Integer = Len(EAN) To 1 Step -1
iDigit = Val((Mid$(EAN, i, 1)))
If (Len(EAN) - i + 1) Mod 2 <> 0 Then
iSum += iDigit * 3
Else
iSum += iDigit
End If
Next
Return (10 - (iSum Mod 10)) Mod 10
End

Nota:
La variable cadena, seria los 12 primeros dígitos, devolviendo la función el dígito nº 13, que es el de comprobación.

Código fuente del programa:  enlace de descarga box.net

lunes, 17 de diciembre de 2012

8 reinas: solución en gambas

8 Reinas:

Solución en Gambas


Os dejo aqui una solución del clásico problema de poner 8 reinas (mejor dicho, damas) de ajedrez en un tablero sin que se ataquen entre ellas.

 
Basicamente el programa lo que hace es:
      1-Coloca una reina en el tablero
      2-Comprueba que no esta en una casilla atacada por otra reina
      3- Si esta atacada la quita, y va al paso 1.
      4- Si no lo esta, marca en el tablero las casillas que ataca esta reina
      5- Si lleva 8 reinas termina el programa sino, va al paso 1.



Código fuente:Enlace

Nota:
Como vereis en la wikipedia, existen un total de 92 soluciones a este problema, el programa da la solución que primero encuentra.


Fuentes:
http://es.wikipedia.org/wiki/Problema_de_las_ocho_reinas
http://spaz.ca/aaron/SCS/queens/Board.java


jueves, 22 de noviembre de 2012

IA y gráficos para juegos de tipo TYCOON

Inteligencia Artificial 

y gráficos isometricos

 para juegos 

tipo TYCOON



He encontrado un proyecto sobre como programar la Inteligencia Artificial de juegos tipo tycoon además de explicar como realizar las gráficas en perspectiva isométrica usando SDL

Por lo que he leído fue un proyecto entre varios compañeros de clase, aunque la fuente donde he obtenido los pdf es el blog de Sergio Hidalgo, se trata de un juego parecido a Tycoon Hospital, pero referido a la universidad.

He encontrado muy poca información sobre como se programan este tipo de juegos, y esta muy interesante la documentación.

Os dejo aqui el enlace del blog donde lo podeis descargarlo: http://www.wired-weasel.com/users/serhid/blog/?page_id=4

Una captura del juego:


Ademas os dejo los enlaces de una copia espejo que he hecho:

Inteligencia Artificial en juegos:
1) Diseño de IA en juego tipo Tycoon: se definen las clases y como interactúan entre ellas.

2) Tecnicas a aplicar en la IA de juegos



SDL: desarrollo de gráficos isométricos
    ( 1 ) - Introducción - (PDF)
    ( 2 ) - Todo lo que quisiste saber sobre las superficies y nunca te atreviste a preguntar - (PDF)
    ( 3 ) - Bliteando más y mejor - (PDF)
    ( 4 ) - Tilemapping - (PDF)
    ( 5 ) - Tilemapping Isométrico - (PDF)
    ( 6 ) - Mousemapping y optimizaciones - (PDF)
    ( 7 ) - Más sobre tilesets - (PDF)
    ( 8 ) - Bichos y tochos - (PDF)
    ( 9 ) - Picking y Dirty Rectangles - (PDF)




Nota:
Tycoon: Son tipos de videojuegos en el que se debe dirigir algún tipo de empresa u organización, y el objetivo es convertirte en el magnate del negocio. Como en todo videojuego la dificultad es variable, en este tipo de videojuegos la dificultad depende de la cantidad de variables de gestión involucradas
 



Fuentes:
http://www.wired-weasel.com/users/serhid/blog/?page_id=4
http://es.wikipedia.org/wiki/Tycoon

viernes, 26 de octubre de 2012

Mi primer juego de IA en Gambas3: Damas Inglesas Checkers

 Mi primer juego de Inteligencia Artificial en Gambas3

Damas Inglesas o Checkers

Aplicando el algoritmo MiniMax


Os traigo aqui mi último programa, se trata de un juego de damas inglesas, cuidado porque hay muchos juegos derivados de las damas, y las reglas son muy distintas.

El programa que he realizado se basa en un programa escrito en SmallBasic por Ken Goldberg ( codigo fuente original ). Aunque en principio me parecio fácil, he tardado varias semanas ya hay diferencias entre como se tratan las listas en SmallBasic y en  Gambas3, teniendo que usara clases, para poder "traducir a Gambas" el programa.

En el programa original (y en la versión de gambas) se podia jugar entre jugadores humanos o diversos niveles de I.A.

Le he añadido varias mejoras:
- Se pueden editar las piezas del tablero, para crear diversas situaciones a analizar
- Guardar la partida y recuperarla.
- Ver como se ha desarrollado la partida con los tipicos botones de adelante y atras.
- Configuraciones: colores del tablero y distintos tipos de piezas.

Para que veas la diferencia de como queda, os dejo un pantallazo de como es la version en SmallBasic y en Gambas3




He hecho un pequeño video de como funciona:



Para más información:

http://damasinglesas.blogspot.com.es/




jueves, 20 de septiembre de 2012

Resolver puzzles deslizantes de 8 y 15 piezas con Gambas3








He desarrollado un pequeño programa donde se pueden definir la posición de las piezas y resolver tableros de 8 piezas (3x3) y tableros de 15 piezas (4x4) y  se puede resolver automáticamente (si tiene solución ) usando el algoritmo A estrella (A *).

Se basan en este algoritmo, aunque los tableros de 15 piezas (y en general los de orden superior a 4x4), se resuelven con un paso "intermedio"... os explico...



Tenemos que llegar a la posición de la figura 1, para resolver el puzzle.


El primer paso es conseguir que la columna 1 y fila 1 queden ordenadas:

Figura 2



Una vez conseguido esto, resolvermos el puzzle 8 (3x3) que nos queda.


En mi programa uso el algoritmo A* para resolver el puzzle. Haciendo los siguientes pasos.
  1. El usuario define el tablero, y pulsa el botón de "Resolver"
  2. Con el tablero ya  definido, se  lleva a la posicion de las fichas que indica en la figura 2. Para ello definimos el tableroFin como el de la figura 2 (teniendo en cuenta solo la fila 1 y columna 1, el resto me da igual lo que valgan)
  3. Luego resuelvo el puzzle de 3x3, que ha quedado, llevandolo al estado final de la figura 3
Figura 3
 Al terminar estos dos procesos, conseguimos ordenar el puzzle 15 (4x4).

En mi caso los cuadros se numeran del 1 al 16, siendo el 16 el cuadro "vacio".


He "aprovechado" , las mismas funciones de calculo algoritmo Start, F, H, para los dos tipos de tablero, añadiendo un parametro opcional que indicaba como era el tablero (de 8 o 15) y asi conocer cual es el estado fin al que hay que llegar.ç

 De ese modo el programa puede resolver los dos tipos de de puzzles.






Aqui os dejo los archivos del código fuente y el ejecutable en gambas3.2:

Código Fuente: codigo 0.0.12 (actualizado)
Ejecutable Gambas 3.2: .gambas


Notas:
Mejoras Rendimiento:
Si se ejecuta como root y con el comando nice se le dice que le de la maxima prioridad se mejora el rendimiento de la aplicacion:
$nice -n -19 ./Puzzle15slide.gambas

21/9/12: Actualizado. Corregido bug a la hora de introducir datos en el tablero, y añadido un reloj para indicar el tiempo que se ha tardado en encontrar la solución.

Fuente:
  Resolucion de puzzle deslizantes de Lara Rojo Celemín e Iván Suárez Morejudo 


Nota:
Si no ve completo este articulo es que tienes adblock activado. Por favor desactive adblock para este blog. Gracias

sábado, 15 de septiembre de 2012

Algoritmo MiniMax-Poda Alfa Beta: Creando la IA de los juegos



¿como piensa un ordenador que juega al ajedrez?
Esta es una de las cuestiones que siempre me plantee cuando tuve mi primer ordenador y empece a programar en Basic....

Pues bien, gracias a internet, he encontrado mucha información... el algoritmo que se usa es el minimax  (o variantes sobre este)...

En la wikipedia, en ingles,  encontre el algoritmo, ademas de varios enlaces interesantes... entre ellos uno que desarrolla gráficamente cualquier "arbol" que le demos...




Me hecho un pequeño esquema, con los pasos y los cambio de valores: Enlace

PseudoCódigo:

function alphabeta(node, depth, α, β, Player)         
    if  depth = 0 or node is a terminal node
        return the heuristic value of node
    if  Player = MaxPlayer
        for each child of node
            α := max(α, alphabeta(child, depth-1, α, β, not(Player) ))     
            if β ≤ α
                break                             (* Beta cut-off *)
        return α
    else
        for each child of node
            β := min(β, alphabeta(child, depth-1, α, β, not(Player) ))     
            if β ≤ α
                break                             (* Alpha cut-off *)
        return β


(* Llamada INicial: *)
alphabeta(ORIGEN NODO, depth, -infinity, +infinity, MaxPlayer


Aqui teneis un código de ejemplo realizado en java:
intart/source/browse/trunk/juegos/base/_AgenteHeuristico.java?r=35





Enlaces:
http://en.wikipedia.org/wiki/Alpha-beta_pruning
http://homepage.ufp.pt/~jtorres/ensino/ia/alfabeta.html
http://joshi.ueuo.com/proyectoU1.php
Programacion de Ajedrez mediante minimax poda alfa beta.Pdf

lunes, 10 de septiembre de 2012

A* Pathfinder Algoritmo A estrella: Usandolo en Gambas3 El León y la Gacela

 Pathfinder Algoritmo A Star A estrella A*


 
El algoritmo A estrella (A*), se usa para hallar el camino más corto (de menor coste) entre dos puntos de un mapa dado, teniendo encuentra los obstáculos. (ver wiki  ). Se usa mucho por ejemplo en los juegos gráficos.



Explicación gráfica del Algoritmo:


Documento donde se describre la resolución del diagrama: Descarga Hoja de Calculo




He encontrado un blog ( ver fuente) , donde su autor lo codifica en javascript.

Lo he podido traducir a Gambas3, haciendo un pequeño ejemplo, donde se crea el mapa de forma aleatoria y la posición inicial (un león) y la posición final (una gacela), imprimiéndose el camino que une a los dos, e informando de cuando pasos se dán.

Enlace de descarga código fuente: Descarga vesion inicial



Versión: 2.2
He mejorado algunas cosas:
-> Ahora incluyo en el mapa celdas que dejan pasar pero con dificultades (hierva y agua). El arbol no deja pasar al leon, como en la primera versión.

-> Puedes ver distintas funciones heuristicas (Por defecto, Manhathan, Euclidea o sin uso de función), y se puede ver el  coste de cada opción (valoración del camino) y un parámetro que mide el número de operaciones que se realizan (exactamente no es eso), pero sirve para darse cuenta cuanto "trabaja" el ordenador para encontrar la solución.

-> La ruta es marcada con flechas, indicando la dirección que toma el león hasta llegar la Gacela.


Enlace de descarga código fuente: fuente 2.2

Enlace Version 3.2: fuente 3.2
Corregido el algoritmo, ya que no daba el camino más óptimo.


Espero que os sea útil, sobre todo para el desarrollo de juegos !!!




Paginas web fuente o de referencia:
 http://46dogs.blogspot.com.es/2009/10/star-pathroute-finding-javascript-code.html

http://devpro.it/code/137.html

iconos:  http://animales.m-y-d-s.com/animal/


martes, 24 de enero de 2012

Algoritmos: Para Juegos (IA) y dibujo 2d

Os dejo 2 enlaces donde os podeis descargar unos documentos .pdf, donde podeis ver algunos algoritmos para juegos- Inteligencia Artificial (minimax, por ejemplo), y dibujo 2d (relleno de areas)



Saludos

jueves, 27 de octubre de 2011

Mi primer programa en Lazarus: Calculo del area de un poligono irregular (version para Windows y GNU/Linux)


Cálculo de área de un polígono irregular 
Realizado en Lazarus
(version para Windows y Gnu/linux)

Hola, os traigo mi primer programa realizado en Lazarus, que es un IDE para FreePascal. Tiene algunas ventajas frente a Gambas, ya que es multiplataforma, osea que puedes crear el programa y compilarlo para varios sistemas operativos (no solo para gnu/linux).  Os he dejado al final los enlaces tanto del código fuente como los ejecutables para gnu/linux y windows. 

El programa, es  una utilidad para el cálculo del area de un poligono irregular (una de las entradas que ha tenido mas visitas en mi blog).


El programa en el ide (ubuntu 10.04)




Os dejo aqui parte del código (el completo esta en el enlace del final del articulo).
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, ExtCtrls, Grids, Buttons,LCLType;

type

{ TForm1 }

TForm1 = class(TForm)
BotonTablaNueva: TBitBtn;
BotonBorrarFila: TBitBtn;
BotonIntroducirPar: TButton;
Button1: TButton;
ButtonSalirPrograma: TButton;
CalcularArea: TButton;
FilaBorrar: TEdit;
EditX: TEdit;
EditY: TEdit;
GroupBox1: TGroupBox;
LabelAREA: TLabel;
LabelX: TLabel;
LabelY: TLabel;
StringGrid1: TStringGrid;

procedure BotonBorrarFilaClick(Sender: TObject);
procedure BotonIntroducirParClick(Sender: TObject);
procedure BotonTablaNuevaClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ButtonSalirProgramaClick(Sender: TObject);
procedure CalcularAreaClick(Sender: TObject);
procedure EditXChange(Sender: TObject);
procedure EditYChange(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure GroupBox1Click(Sender: TObject);
private
{ private declarations }
public

{ public declarations }
end;

var
Form1: TForm1;

// variables que van a tener los puntos que forman el poligono (maximo 101 puntos)
var x: array [0..100] of Extended;
var y: array [0..100] of Extended;

implementation

//para que pueda abrir el formulario de Acerca de...
uses Unit2;
{$R *.lfm}

{ TForm1 }

procedure TForm1.BotonBorrarFilaClick(Sender: TObject);

var a,fila: integer;

begin
if filaBorrar.text='' then
showmessage('Debe de introducir algun numero')
else
begin
fila:=StrToInt(FilaBorrar.text) ;
if (fila>stringgrid1.rowcount-1) or (fila<1) then
begin
ShowMessage('No puedes borrar esa fila');
FilaBorrar.text:='' ;
end
else
begin

for a:=(StrToInt(FilaBorrar.Text)+1) to stringgrid1.rowcount-1 do
begin
// stringgrid1.Cells[0, a-1]:= stringgrid1.Cells[0, a];
stringgrid1.Cells[1, a-1]:= stringgrid1.Cells[1, a];
stringgrid1.Cells[2, a-1]:= stringgrid1.Cells[2, a];

end;

stringgrid1.rowcount := stringgrid1.rowcount-1;
showmessage('borrado linea') ;

end;
end;
end;



procedure TForm1.BotonIntroducirParClick(Sender: TObject);
begin
stringgrid1.RowCount:= stringgrid1.RowCount+1;
stringgrid1.Cells[0, stringgrid1.RowCount-1]:= FloatToStr(stringgrid1.RowCount-1);
stringgrid1.Cells[1, stringgrid1.RowCount-1]:=editx.text;
stringgrid1.Cells[2, stringgrid1.RowCount-1]:=edity.text;
editx.text:='';
edity.text:='';

end;

procedure TForm1.BotonTablaNuevaClick(Sender: TObject);
begin
stringgrid1.rowcount :=1;
ShowMessage('Reiniciada la tabla de datos');
end;

procedure TForm1.Button1Click(Sender: TObject);

begin
try Form2.show;
finally

end;
end;


procedure TForm1.ButtonSalirProgramaClick(Sender: TObject);
begin
close;
end;

procedure TForm1.CalcularAreaClick(Sender: TObject);

var s: double;
var s1: double;
var super: double;
var x_count: integer;
var I,j : integer;

begin
//carga el contenido del gridviews en un array

for I:=1 to stringgrid1.rowcount-1 do
begin
x[I-1]:=StrToFloat(stringgrid1.Cells[1,I]);
y[I-1]:=StrToFloat(stringgrid1.Cells[2,I]);

end;

x_count:=stringgrid1.rowcount-1;
//pasa los datos a una funcion que devuelva el calculo del area
s:=0;
s1:=0;
for j:=0 to x_count-1 do

s:= s+x[j]*y[j+1];

s:=s+x[x_count-1]*y[0] ;

for j:=0 to x_count-1 do s1:=s1+y[j]*x[j+1];

s1:=s1+y[x_count-1]*x[0];

super:= (1/2)*(s-s1);

if super<0 then super:=-super;

LabelAREA.caption:= 'El area es ...' + floattostr(super);
end;

procedure TForm1.EditXChange(Sender: TObject);
begin

end;

procedure TForm1.EditYChange(Sender: TObject);
begin

end;


procedure TForm1.FormActivate(Sender: TObject);
begin
stringgrid1.cells[0,0]:='Coord';
stringgrid1.Cells[1,0]:='X';
stringgrid1.Cells[2,0]:='Y';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

procedure TForm1.GroupBox1Click(Sender: TObject);
begin

end;



initialization
{$I unit1.lrs}

end.   


Os dejo los enlaces de descarga:

Saludos

Nota:
6/nov/2011: Os dejo un video para mostrar como funciona el programa