miércoles, septiembre 28, 2011
Juego de la vida de Conway (parte 3):
Alguien me ha dicho que le gustaría verlo en ejecución, así que aquí va una muestra de algunas estructuras simples y otras complejas del autómata celular de Conway:
Hay formas básicas que no se mueven y otras que apenas te guiñan un ojo:
Esto lo tenéis que ver porque las formas creadas de forma totalmente aleatoria tienen su propia belleza y proporción (lo he grabado por pura casualidad. Por eso hay algún tiempo muerto y algún intento de meter más puntos en el tablero. Luego he visto que la vida evoluciona en bonitas formas similares a letras y dibujos sugerentes, así que lo he subido como está).
Por último aquí vemos que la complejidad puede ir en aumento sin límite alguno. Bueno, la limitación de mi programa es que todo se reduce a un array de 20x20.
domingo, septiembre 25, 2011
El juego de la vida de Conway (parte 2):
Posiblemente las células de los seres vivos evolucionen de forma similar. No tienen una comunicación clara con el resto de células, y tampoco hay nada que controle todas la células, pero cada una de ellas termina teniendo una función diferenciada.
Turing abrió el camino, pero luego otros se dedicaron a "diseñar" sus propios "autómatas celulares". En 1970 John Horton Conway publicó su autómata en Scientific American en la sección dedicada a juegos matemáticos.
Hoy en día es el autómata celular más conocido y se llama "JUEGO DE LA VIDA". Las reglas son muy sencillas:
Es un juego en el que tenemos un tablero dónde inicialmente colocamos una serie de células vivas.
Generación a generación las células del tablero irán naciendo o muriendo siguiente estas reglas:
1.-Si una célula viva tiene a su alrededor menos de 2 células vivas se muere por "soledad".
2.-Si una célula viva tiene a su alrededor más de 3 células vivas se muere por "superpoblación".
3.-En una celda que esté rodeada por exactamente 3 células vivas surgirá vida en forma de una célula viva.
Este es el programa que he hecho en VB.NET.
Muestra un tablero de 20 x 20, dónde podemos marcar las celdas con células vivas.
Hay tres botones:
- Haciendo clic en "Una hora más" aplicamos las reglas para pasar a ver cómo queda la siguiente generación de células.
- Pinchando "Lanzar hasta el final" vemos como evolucionan las células hasta el infinito.
- Para terminar la simulación clic en "FIN".
El código fuente:
Option Explicit On
Option Strict On
Imports System.Drawing.Drawing2D
Imports System.Math 'para truncate()
Imports System.Threading.Thread 'para usar sleep()
Public Class Form1
Dim oPen As Pen
Dim oGrafico As Graphics
Dim cuadro(20, 20) As Boolean
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Me.BackColor = Color.Gray
Dim i, j As Integer
For i = 1 To 20
For j = 1 To 20
cuadro(i, j) = False
Next
Next
End Sub
Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
Dim punto As Point
Dim cuadroX As Integer
Dim cuadroY As Integer
If e.Location.X > 30 And e.Location.X < 630 And e.Location.Y > 30 And e.Location.Y < 630 Then
cuadroX = CInt(Truncate(e.Location.X / 30))
cuadroY = CInt(Truncate(e.Location.Y / 30))
cuadro(cuadroX, cuadroY) = True
punto.X = cuadroX * 30
punto.Y = cuadroY * 30
'Dibujamos un círculo negro...
oGrafico.FillEllipse(New SolidBrush(Color.Black), New Rectangle(punto, New Size(30, 30)))
End If
End Sub
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim x, y As Integer
oGrafico = Me.CreateGraphics
oPen = New Pen(Color.White, 1)
For x = 1 To 21
'Ponemos 21 columnas:
Dim pt1 As New Point(30 * x, 30)
Dim pt2 As New Point(30 * x, 630)
oGrafico.DrawLine(oPen, pt1, pt2)
Next
For y = 1 To 21
'Ponemos 21 filas:
Dim pt1 As New Point(30, 30 * y)
Dim pt2 As New Point(630, 30 * y)
oGrafico.DrawLine(oPen, pt1, pt2)
Next
dibujarCelulas()
End Sub
Private Sub btnUnaHoraMas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUnaHoraMas.Click
nuevaGeneracion()
End Sub
Private Sub btnLanzarHastaElFinal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLanzarHastaElFinal.Click
Timer1.Enabled = True
End Sub
Private Sub nuevaGeneracion()
Dim i, j, numVecinos As Integer
Dim cuadroNuevo(20, 20) As Boolean
For i = 1 To 20
For j = 1 To 20
cuadroNuevo(i, j) = cuadro(i, j)
numVecinos = vecinos(i, j)
If cuadro(i, j) Then 'si la célula está viva...
If numVecinos <> 2 And numVecinos <> 3 Then
cuadroNuevo(i, j) = False
End If
Else 'si la célula está muerta...
If numVecinos = 3 Then cuadroNuevo(i, j) = True
End If
Next
Next
cuadro = cuadroNuevo
dibujarCelulas()
End Sub
Private Sub dibujarCelulas()
Dim punto As Point
'dibujar la nueva situación:
For i = 1 To 20
For j = 1 To 20
punto.X = i * 30
punto.Y = j * 30
If cuadro(i, j) Then
'Dibujamos círculo negro
oGrafico.FillEllipse(New SolidBrush(Color.Black), New Rectangle(punto, New Size(30, 30)))
Else 'Dibujamos círculo gris que es como borra ya que el fondo es gris.
oGrafico.FillEllipse(New SolidBrush(Color.Gray), New Rectangle(punto, New Size(30, 30)))
End If
Next
Next
End Sub
Private Function vecinos(ByVal i As Integer, ByVal j As Integer) As Integer
Dim numero As Integer = 0
If i > 1 And j > 1 Then
If cuadro(i - 1, j - 1) Then numero = numero + 1
End If
If i > 1 Then
If cuadro(i - 1, j) Then numero = numero + 1
End If
If i > 1 And j < 20 Then
If cuadro(i - 1, j + 1) Then numero = numero + 1
End If
If j > 1 Then
If cuadro(i, j - 1) Then numero = numero + 1
End If
If j < 20 Then
If cuadro(i, j + 1) Then numero = numero + 1
End If
If i < 20 And j > 1 Then
If cuadro(i + 1, j - 1) Then numero = numero + 1
End If
If i < 20 Then
If cuadro(i + 1, j) Then numero = numero + 1
End If
If i < 20 And j < 20 Then
If cuadro(i + 1, j + 1) Then numero = numero + 1
End If
Return numero
End Function
Private Sub btnFin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFin.Click
Timer1.Enabled = False
Application.Exit()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
nuevaGeneracion()
End Sub
End Class
miércoles, septiembre 21, 2011
Cómo surge la vida? Qué tiene que ver con la matemática/informática esto? Parte 1
Bueno, empezamos una serie de posts algo filosóficos, algo matemáticos, algo informáticos, algo místicos. Cada uno que reflexione y decida por sí mismo.
martes, septiembre 13, 2011
Microsoft, parte 4. El nacimiento de un imperio
Parte 1: Los inicios de Bill Gates.
viernes, septiembre 09, 2011
Microsoft, parte 3. Trabajo a todo ritmo
Parte 1: Los inicios de Bill Gates.
miércoles, septiembre 07, 2011
Microsoft, parte 2. El nacimiento de Microsoft
Según dicen, Bill Gates metía todas las horas que podía en el centro de cálculo. Steve Ballmer debía ser parecido.
viernes, septiembre 02, 2011
Microsoft, parte 1. Los inicios de Bill Gates
Normalmente, la gente cree que Bill Gates empezó en un mundo como el nuestro, y como la mayoría de nosotros. Vamos, pensamos que pertenecía a una familia de clase media y que las computadoras estaban extendidas. Por lo que he podido leer la familia de Bill en la época era de clase media-alta, y con gran influencia en su Seattle natal. Respecto a las computadoras, en la década de los 60 eran un bien valioso y de utilización limitada incluso para Bill Gates.
La familia de Bill
Hay gente que se ha molestado en obtener el árbol genealógico de Bill Gates. Lo podemos ver aquí. El autor ya dice que es un borrador, pero de lo que no hay duda, porque coincide con todas las fuentes, es que su bisabuelo era James Willard Maxwell (senior) un rico banquero, fundador del National City bank de Seattle en 1906. El hijo de este banquero fue James Willard Maxwell (junior), abuelo de Bill Gates por parte de su madre, y también banquero.
La madre de Bill Gates se llamaba Mary Maxwell (hija del banquero), y es muy importantes en esta historia. Fue muy importante para el imperio Microsoft, según se publicó en su obituario el 11 de Junio de 1994 en el New York Times: "Mary Maxwell ayudó a su hijo a crear Microsoft".
Los padres de Bill, Mary y William H. Gates (senior) eran dos figuras muy importantes en Seattle. Ella profesora en la Universidad de Washington y él un conocido abogado. Mary formó parte de varias ONG-s y por ejemplo fue la primera Presidenta de una ONG denominada "National United Way".
Y ahora empiezan las casualidades, porque mira por donde que el CEO de IBM, John Opel también pertenecía a esa organización que presidía la madre de Bill Gates.
Volvamos un poco atrás en el tiempo:
La adolescencia de Bill Gates y las computadoras:
Bill Gates y Paul Allen se conocieron en "Lakeside school". En su web podemos ver cosas tan curiosas como que hay un profesor por cada nueve alumnos, imaginaros lo que tiene que costar esto.
En 1968 el colegio con la ayuda económica de la asociación de padres, alquila un DEC PDP-10 (minicomputadora de última generación cuya primera unidad se vendió en 1966), a General Electric. Estas minicomputadoras se pagaban por uso. Lógicamente hubo chavales que en seguida se engancharon a la máquina (Bill Gates, Paul Allen y Kent Evans por ejemplo) y en pocos meses gastaron el dinero que tenían para todo el año, quedándose sin minicomputadora.
El caso es que con 14 años, Bill programaba el Tik-Tak-Toe (el tres en raya) con BASIC en un host que valía entonces varios miles de dólares.
Bill Gates el hacker:
El libro de David Marshall nos cuenta algunas anécdotas como estas:
Una empresa llamada "Computer Centre Corporation" ofreció al colegio la posibilidad de utilizar su PDP. Se contabilizaba el tiempo de uso y en función de ello se facturaba al colegio. Bill y un par de amigos encontraron la forma de aminorar la cuenta reduciendo la factura. El caso es que la empresa se dio cuenta y tras informar al colegio fueron castigados con seis semanas sin computadora. Vaya con Bill, ¡un hacker!
Bill Gates, el implacable joven de los negocios:
En 1970 la empresa "Computer Centre Corporation" quebró, y Bill y Kent Evans compraron algunas cintas de la misma. ¡Con 15 años ya pensando en negocios! Allen se enteró y se enfadó mucho, llegando a coger aquellas cintas. Bill le amenazó con denunciarle en los tribunales.
Bill Gates, el programador:
En 1971 una empresa llamada "Information Science, Inc." solicita al grupo de programadores del colegio que desarrolle un programa de nóminas. Ante las dificultades que tenían pidieron a Bill que se incorporara, haciendo un buen trabajo (siempre según David Marshall). Como pago a este trabajo consiguieron tiempo de proceso en otra computadora (en el libro no se detalla cual). El padre de Bill (el abogado) les ayudó a cumplir los trámites legales y se convirtió en su consejero jurídico.
Bill y Allen ganando dinero con la programación:
Luego a Bill y Allen se les ocurrió un programa para facilitar la lectura de los registro de pasos de vehículos en el tráfico de la ciudad. En aquella época (y ahora creo que también), se ponían unos tubitos de goma en las calles de grandes y pequeñas ciudades. Esas lecturas se recogían marcando papel continuo. Bill y Allen programaron un programa llamado Traf-O-Data con el que ganaron dinero.
Siguiendo el interés por los negocios Kent Evans y Bill Gates crean "Logic Simulation Company".
En mayo de 1972 el consejo escolar pide a Gates y Evans que hagan un programa para planificar las horas lectivas. Kent Evans falleció en esta época por un accidente en la montaña, causando una gran conmoción.
Con 17 años va a Harvard y se da cuenta de que no tan bueno en matemáticas como programando, por lo que pierde interés. Allí conocerá a Steve Ballmer.