My favorite tools for agile development

After a few years in this industry, and if you, like me, a fan of agile techniques for software development and addicted to testing (testing, testing, testing !!!), just collecting a series of tools, libraries and languages ​​to facilitate their work. I use those gathered here often and remember those who have used for some particular reason, they are in my utility belt:

  1. JUnit : I started with the obvious, the father of all. Unless you have been hiding in an anti-nuclear bunker for the past year, have you heard, or have used unit testing. If you're really lucky, may even have played Test Driven Development. In fact, a good reference on the subject is Test Driven Development: By Example .
  2. Refactoring : Okay, okay, I'm going to stop with the platitudes, but you can not talk about agile development without a good IDE that allows refactoring. Both the IDE Eclipse and the NetBeans , my favorite, provide excellent support. I think it is not widespread and that is falling into oblivion the fact that not only provided by your IDE refactoring are the ones that exist, and that the book that popularized these techniques was the Refactoring: Improving the Design of Existing Code . In it there are so many other ones that are not implemented by any IDE, many times not to allow the automation task. It's worth a close look.
  3. Maven : The management of builds can be a complex and error-bound if not well managed, and ultimately delivery to the client's product is a crucial moment, the culmination of months of development with their best tools and techniques and you want to give the right impression. For me, the maven is the management tool builds of my choice, gets rid of a number of problems which do not want to know details, and gives me a series of reports on the health of the project, such as test coverage report, adherence to the code formatting convention, Javadoc, etc ..., all gathered in a beautiful site of the project. Great to impress your manager.
  4. EasyMock : Ideally the test unit must have a very short run time, a few milliseconds. If you start to involve databases, services JEE platform, I / O in general, the feedback loop program refactor-brow becomes very slow, and the programmer stops testing as a natural result. Unit tests should allow to run dozens of times a day. That's where the EasyMock, which lets you replace parts of your system by fake objects with the same interface as the real object, and verify that the system is making the calls expected. Magic!
  5. DBUnit : And how popular the tables to be used in the test mass of testing? This is a task for the DBUnit allows you to insert and remove data in tables during your testing cycle.
  6. HttpUnit : the HttpUnit was first thought to enable unit testing of web applications. With it you can access a URL, fill in forms fields, send, check the answer, finally, to emulate a human user. Recently I've been giving another use for it, efficient access services Rest and checking the response data. Very good.
  7. Liquibase : I'm a fan of this project. By playing with Ruby on Rails, I was truly amazed with the schema change management database. It does this through small scripts that are part of the project itself, including keeping track of the version installed and running only necessary with each new update. When looking for something similar in the Java world, I came across this library and have used it successfully in my applications. You build XML files with changes in the bank, identified with the author and version, and the library takes care of updating the database by applying only the difference between versions. Or you can also just at the end of an iteration, generating a file with the script to be executed in an environment that require more control by a DBA. I recommend.
  8. Mercurial : I am a longtime user of CVS and Subversion. But version control systems are distributed there, and give a whole new range of possibilities in addition to being extremely fast. Mercurial is used internally by the NetBeans project, a large project, and many of its operations such as commits, updates, roolbacks, diffs are virtually instantaneous. And nothing to carry the entire repository, and to commit at the customer site.
  9. P6Spy : Ferrara too simple, useful, too, am concerned not to be upgraded since 2003. Allows you to monitor the communication between your code and the database server, plugged straight into your server, the test unit, wherever applicable a JDBC driver. Great for tuning and moments of total despair.
  10. OpenEJB : I confess that I spent a long time away from the JEE platform by trauma to the EJB specification, always preferring options that allowed me to test and agility. At this time the project was using very Apache Cactus , but really, is not the same thing. The OpenEJB is the EJB container used by the server Apache Geronimo , but can be used in any application JSE, in a standalone or bundled with Tomcat, or in their unit testing, allowing the testing of asynchronous messaging JMS, EJBs Stateless, Stateful, Singleton, Time Service, in short, everything you expect from a real server. He still makes decisions too clever to actually facilitate its use in unit tests, such as automatic creation of datasources, using the in-memory HSQLDB database. Despite the existence in the EJB 3.1 container shipped, suitable for use in standalone applications and unit testing, the specification says that providers need only provide the profile EJB Lite, which, if you need the rest as I try not to found in the profile, is insufficient.
  11. HSQLDB : And nothing better for your unit tests with a database, rather than a database that lets you create tables in memory only. That's it, simple as that.
  12. SeleniumHQ : Anyone who has ever tried to automate testing of user interfaces, know it's not an easy task. The user interface is a moving target, hard to hit. I really admire those who propose this noble task. Develop interfaces there is not my thing, but I played around with Selenium, and was very impressed. It has the same capabilities as expensive tools test, as the recording of their interaction with the system, and the ability to run the same test suite on a network of machines with various configurations of operating systems and browsers. Surely, for your next killer web app, worth the effort.
  13. Cruise Control : To find out quickly if the code sent to the repository is still working, and avoid the nightmare of the integration phase, nothing better than a continuous integration tool. I have experienced the Hudson and the Continuum , but still continue with the good old Cruise Control. Although it is harder to configure than their younger siblings, allows greater flexibility in its configuration, and has a great stability. I keep two scheduled tasks: a build after every commit code to the repository, and the construction of the project site daily.
  14. JMeter : And last but not least ... Do not let your functional tests for later why, but it may be too late. Especially the performance tests. The JMeter allows you to simulate the behavior of hundreds of users raging against its application, and find bottlenecks and where those leaks are hidden.

Far from being a complete and definitive list, is my list. And of course, one last important tool is a bit of common sense, after all, nothing of trying to get in 100% test coverage. It may sound ideal, but it is certainly naive. And always remember the immortal words of Dijkstra:

Testing shows the presence, not the Absence of bugs.

Bookmark and Share
3 comments so far, add yours

Blog elevated to first-class citizen

I would like to warn all who follow this blog I just raise it a first class citizen! For those accustomed to the domain www.architecteam.com.br / people / frank / blog , and the www.architecteam.net / people / frank / blog , you can now follow this blog at the same www.smallthoughts.com.br . I want the blog to grow in importance, and this could not happen while it was so badly treated. I will keep working the other addresses indefinitely, but if your only interest is to follow the blog, I suggest you update your feed reader client to the new domain. No hurry.

Bookmark and Share
2 comments so far, add yours

Translating the book by Pharo Examples for the Portuguese!

In the coming months I will lead the effort to translate the book by Pharo Examples for the Portuguese, my little contribution to make this language and environment that both taste better known by students and Portuguese-speaking developers, who may have as a major obstacle to language and not language.

I believe that both the environment and the language is completely different from anything we have in the corporate environment, and although many of the ideas raised in this environment have more than 30 years, is always an invigorating environment to keep in contact.

As all code is open and in Smalltalk, everything is accessible and able to be changed. Everything is objects. Major researchers in languages, compilers and software engineering test their ideas first in this environment and its variants, as with unit testing, aspect-oriented programming, and other closures. Your community is certainly exciting and it has to say.

I created a new page to keep updated with the partial result of the translation work. Everyone who wants to contribute, feel invited. Are all welcome.

Bookmark and Share
Leave the first comment

Cultural Balance January

This month should be an atypical month, perhaps for the sense of "vacation" (despite not having had a real vacation ...). I'm almost feeling guilty by the score:

  • 13 films
  • 1 trip
  • 1 book

Starting with the movies, something like a chronological order ... I saw Norbit , and gave some good laughs ... I thought it would be a big mess, but it was a good crap. Funny. The story of a poor orphan who discovers the love of his life in the orphanage, but soon loses a chance and fate of a giant woman, ugly glue on it, and does believe that a life of humiliation and submission is what he deserves. But soon his love around the city, more beautiful than ever, but with some problems that the knight will have to help solve. Many jokes about his wife and his brothers giant bullies, politically incorrect against fat people and blacks. Take a large bucket of popcorn and watch without compromise.

El Orphanato is more a rich piece with the participation of no more, no less than Guillermo del Toro . A thriller to be pasted in the chair, holding the hand of his wife / girlfriend / whatever. Without resorting to gore and monsters, manages to surprise and delight even those who are tired of the genre. It has a taste of El laberinto del faun , where the real and imaginary are confused lost in childish imagination. I highly recommend this must be part of the general culture of the whole film lover worth his salt!

007 Casino Royale . My father has a very complete collection of all the old 007S, and my favorites are with our friend Sean Connery. After watching the latest with Pierce Brosnan, honestly, I was tired of the overdose of action sequences completely improbable and unreal, where James Bond was practically a superhero whose super power was infinite luck. The focus also was no longer the story, to emphasize electronic paraphernalia that I swear, I was excited in the old movies, but began to be irritated by the excess. I think the directors have captured this discontent from the fans, and created a great action movie, more raw, where Bond is injured, falls, takes a beating, is wrong, and only do well by their abilities rather than their gadgets high technology. Thumbs up! Popcorn in the vein!

Final Fantasy VII: Advent Children . I am a lover of the saga video game Final Fantasy RPG always of excellent quality and amazing graphics. I played on the computer without the Final Fantasy VII however complete the game. Work, always work. When I saw this title in the rental, the nostalgia broke, and wanted to watch this long based on the game. In fact, the story goes more or less like a continuation of the events of the game in the same environment and with the same characters. Despite the excellent graphics (ok, we always give the proper proportions according to the time of production, do not expect an Avatar ...) the story is boring, no thrills, do not keep a good pace, boring dialogues ... finally, boring. A disappointment. If you are nostalgic and like a computer graphics and have nothing better to do, go and watch, otherwise pass by.

Slumdog Millionare . Or Portuguese, Who Wants to Be a Millionaire? A poor Indian begins to settle questions of a program like ours Game Million, and is arrested on suspicion of cheating. And then begins to tell his saga, and as you know the answer to all questions, and why they are participating: the search for the love of his life. The film has a very pretty picture, his story is very beautiful, but of hearing about it, expected more. But be sure to watch, it is certainly a film that makes the difference.

Kalifornia . Another movie where Brad Pitt tries to show that not only serves to heartthrob roles. And he can. An intriguing film where a couple begins their journey to California, behind material for a book about serial killers. And they find that their rides are, themselves, cold-blooded killers. A disturbing thriller, more a question that makes us human nature. Recommended to friends.

The Last King of Scotland , a film that gave the oscar for best actor for Forest Whitaker, president of the Ugandan dictator Idi Amin Dada. I think the film is pseudo-historical, poetic liberties with the necessary, but either way is also an excellent film, also showing the disturbing reality has always lived on the African continent. Very good.

Up , High Adventure! Who says cartoon is just for kids? For some time now the major studios know that the true formula for success of an animation is to involve both the public and the adult child. I have my doubts whether it was well balanced in Up, I thought the script is much appreciated by an adult than a child. Of course there are silly and funny scenes to make the kids laugh, but in quantities much smaller than, for example, Ice Age or The Incredibles . Certainly a lot of fun to watch, with scenes that make up a certain node is this what you call a dry heart. Worth it.

Trois couleurs: Rouge . I watch all the TRILOGY OF COLORS. This is the last. They may throw stones at those who are cults, but must have the courage to watch all three. Okay, beautiful, always showing the human side of passion, selfishness, love, loss, and bla bla bla ... but as a good salad of lettuce and tofu is healthy but tasteless. Just do not sleep because I am among those who want to see where the movie goes, even the worst. If you want to impress your friends, go ahead and watch! Or need to develop a taste for this kind of film, or all cinephiles gather in their wheels and lied. I tried to find a liaison between the three films, and I thought: hunchbacked old lady in the background, which is trying to put bottles in the recycling bin. It's almost a game of "Where's Waldo" see it, so do not believe anyone who claims to have seen the trilogy without saying that the old lady. Do not say I did not warn you.

All sobre mi madre . And welcome to the world of Almodóvar! And speaking of film copyright, a guy who's here every film is an invitation for a ride in his head. I'm afraid of him. I've seen movies with gay men, transvestites, priests who rape little boys, transvestite nuns who get pregnant and catch AIDS ... What twisted little world. But you can not deny that the guy knows how to tell a story and show the humanity of his characters, often in extreme situations. This film is no different. But I know many people who would not have the stomach to watch it, so go with caution. It is the biggest slap in the face Almodovar style.

Gran Torino . What can I say about Clint Eastwood? I think the world has lost an actor debatable, but won a director / producer / screenwriter of the first. His stories are simple, attacking controversial issues like euthanasia in Million Dollar Baby , a more humane vision of the vanquished in Letters from Iwo Jima , and this, on the mistakes caused by racial prejudice. I do not know why, had a wrong impression of the script, I thought Clint would be the bad guy, but it is hard not to get attached to the old man more badassmotherfucker that cinema has ever seen. I recommend!

The latest movie Star Trek gave me the impression, correct me trekkers on duty, to be a movie well worth the name. I have the highest number in my account, despite not going to the movies wearing pointy ears ... I liked the pace, I liked the action, and all references to the TV series. Not to mention the thrill of seeing my heroes, adolescents, and the beginning of everything. + Fun popcorn movie for sure!

Paris, je t'aime . What can I say ... French film to be few, and I exclude the group. In this film, a group of famous directors tell stories of love in Paris. Great movie for travel agencies or if you plan to go to the capital of the world more beautiful, but not if you want fun. Sadomasochistic moviegoers, this is for you.

And there comes a movie, I think I overdid it this month, I need to read more and spend less time in front of the screen ... All though to compensate, I made my first big motorcycle trip, through Jaguariúna, Quarry, Amparo and finally, Black Mountain. This trip has generated good pictures , and showed me that he was ready for longer trips. In fact, we only saw in passing as much Jaguariúna Amparo, even stopped Quarry and Black Mountain. Quarry has all sorts of handicrafts made of ... stones (glass, porcelain, soapstone, iron), and wooden crafts and decorative items. Although not like craft fairs, the material was actually very nice and cheap, and despite the little room, just bringing a chandelier there, iron-shaped tulip. It's coffee table. Black Mountain is a city with tourist potential, they told me to be a romantic city. I do not know if at some time or by ignorance, I missed to see more natural beauty, it was my expectation. Even so, followed by a secondary road asphalt and then land, and arrive at a particular property, which unfortunately charged for visitors to have access to Waterfall of Dreams ... It was worth the trip.

And finally, to end the cultural program, read Pragmatic Thinking and Learning: Refactor Your Wetware (Pragmatic Programmers) . Lately I've been attracted to the theme of self-understanding and accessing new creative ways of thinking. I'ma man of exact, I was trained to be logical thinking, analytical and not make mistakes (or at least push myself ...). But at this late date, some of my activities have lost their color and flavor, as if life were a great snack fast food bland. This book suggests that to achieve new levels of productivity, we exatóides, we must develop our creativity and allow our modes of thinking and learning involve both analytical thinking and logic, as holistic and creative. For many it may seem a bla bla bla of self-help book, but I decided to overcome my skepticism and began to practice drawing as a hobby. I started reading a book that was part of the reference: The New Drawing On The Right Side Of The Brain , and we'll see where I go. After all, specialization is for machine and ants.

And until next month ...

Bookmark and Share
Leave the first comment

Cultural Balance December

I'll try to start a healthy habit that I saw on some blogs, taking stock of the cultural month. This month was very weak, the score is:

  • 2 books
  • 5 movies

I started reading the Modular Java: Creating Flexible Applications with Spring and osgi (Pragmatic Programmers) , a book about modularization of applications using the OSGi framework. I found the book very good, has many practical tips, it teaches the advantages of the model and is not a book made ​​to advertise a major player in the area, such as diabetes or the Spring Equinox framework. It shows all the options and how to migrate from one implementation to another. I started working on one of my projects in order to test these ideas, as I am very traumatized by the weight of solutions using JEE servers and long work only with techniques and frameworks that will allow me more flexibility and testability.

I also read, in fact, very quickly since it is very easy to read, the book The Passionate Programmer: Creating a Remarkable Career in Software Development (Pragmatic Life) , part of the collection Pragmatic Bookshelf, which has the most famous book's excellent The Pragmatic Programmer: From Journeyman to Master . This book is almost a self-help book for programmers, people with a technical bias that have lost faith in his profession. I particularly do not like self-help books, usually the only person they help authors are their own, but this in particular caught my attention right away. Perhaps because it is a period of collective reflection, or I personally be in my moment of reflection, this book brings some truisms that are good to hear from others, and some other things not so obvious. It makes the reader reflect on your career, your decisions on it, and what paths to follow if you want a fantastic career doing what you love, and not only bring the rice and beans to the table every day. I recommend!

Moving on to movies, some good and some not so good. Finally, after everyone else, watched Transformers: Revenge of the Fallen . Very good! For those nostalgic like me, who grew up watching the drawings, a presentaos, robotic beating of excellent quality, excellent effects, all good. The story is kind of wimpy, and beat it, but so what? It's popcorn and fun for those who like a certain style. It even has a scene with a small set of robots coming together to create a larger and more complex robot, which has everything to do with the materials that I have seen the master in intelligence and swarm robotics conference. Take a look at this video and the associates and will see what I'm talking about.

This month also saw the movie Solaris , a science fiction starring, amaze, George Clooney. Honestly, my feelings about this movie were a little confused. The script is good, but gives the impression that could be better exploited. It has a hint of Gattaca , a movie that I love, in the sense that it is a fiction film without a big budget special effects, and then focuses on the story. And have enough of Sphere , another film quite like that, about the screenplay. But George Clooney did not convince a fiction, it is best to continue as a doctor in ER or in many other action movies made. Put the end of your list.

Also watched Yes Man , and only confirmed my earlier impressions, I prefer doing comedy where Jim Carrey does not have to grimace. Good little movie, but weak, I prefer Bruce Almighty or Me, Myself & Irene Jim the comic, or artwork Eternal Sunshine of the Spotless Mind , which is Jim, but explores his dramatic vein. If the video store and have nothing better you can pick which yields a laugh.

I went with some cousins ​​watch the Avatar , without great expectations, thinking it would be even a film / drawing childlike. What a mistake. Incredible visual effects, exciting script, superb! In fact, the visual effects, as described next part ... They managed to make all flora and fauna were cohesive, with similar anatomical elements between the higher creatures (after all, all the strings have symmetrical body, has the same number of eyes, lungs, and lower superioes members, etc ...) wildcards and characters, damn, was always the doubt whether it was CGI or costumed actors. I still need to research what the technique used. If you have not seen it, run! But try to see one of these 3D rooms, unfortunately I was not one of these, but I think the experience should be much richer.

And finally, The Boy in the Striped Pyjamas , very good, you can watch without fear, but I expected something ... I dunno, more. More drama involving a World War II, but now involving children, which makes it even more sad, and such. I felt that I tried to pull a few tears, but it worked for me. Whether a drama involving children in the second war, it is surprising both in script and the visual? Watch El laberinto del faun , another great film director Guillermo del Toro.

Also tried to watch Disaster Movie , but I could not, I stopped in the first 15 min. of film. I was afraid someone would see that I was watching it. Stay away from this title, or if left in the rental, should kill some neurons in the process. What a bad movie! From slapstick, meaningless and boring.

Until next month!

Bookmark and Share
2 comments so far, add yours

Remembering Those who lack

I can not help but admire people like Edsger Dijkstra , who as he made ​​a difference in the area where work and study. These people are an inspiration and should always be remembered. Dijkstra once wrote in his Notes on Structured Programming :

These notes have the status of "Letters written to myself" Them I wrote down because, without doing so, I found myself repeating The Same arguments over and over again. When reading what i had written, I too was not always satisfied.

This little snippet has already shown all his preoccupation with perfection and his quest for continuous improvement as a researcher.

Oh I have so many good things to write for myself as this giant.

Bookmark and Share
Leave the first comment

Pills in Erlang - Compiling a Program

Knowing enter and exit the Erlang shell is the first step, but not very useful. The fun begins when we build our own programs.

I've been using Emacs to write my programs in Erlang, it has an atmosphere that colors the elements and helps close parentheses and complete expressions.

Functional languages ​​are recursive in nature, then nothing Hello World, nothing better than to start with a recursive function as an example. How about the factorial:

-module(lib).
-export([fac/1]).

fac(0) ->
    1;
fac(N) ->
    N * fac(N-1).

O código acima pode ser escrito num arquivo e compilado, e demonstra algumas coisas básicas da linguagem. Primeiro, todo comando deve terminar com um ponto ".". Na linha 1 e 2 estão algumas diretivas obrigatórias de todo código fonte, module e export . Toda diretiva de compilação começa com o sinal de "-". A diretiva module declara o nome do módulo deste arquivo. Em Erlang, cada arquivo é um módulo, ou seja, um conjunto coeso de funções. Normalmente se o módulo se chama "lib" como o exemplo, então o arquivo precisa se chamar "lib.erl", porque com esta convenção o compilador consegue encontrá-lo automaticamente. Em Erlang, uma lista de elementos é representada usando colchetes "[]" com cada elemento separado por vírgulas. Alguns exemplos de listas:


[3,78,2,7,3].
["hello", "world"].
[hello, world].

A primeira lista contêm 5 números inteiros, a segunda 2 cadeias de caracteres, e a terceira 2 átomos. Então como podemos perceber a segunda diretiva de compilação export recebe como argumento uma lista, onde cada elemento é o nome de uma função que o módulo exporta para uso externo e o número de argumentos. Em Erlang, funções com mesmo nome mas número diferente de argumentos são funções completamente diferentes. Toda função em Erlang precisa retornar algum valor.

Uma função em Erlang sempre tem o formato Assinatura -> CódigoParaExecução. A primeira parte determina o nome e os argumentos da função, enquanto a segunda contêm o que será executado. Em Erlang a execução de uma função sempre envolve comparação de padrões, e uma função pode declarar vários padrões separados por ";". Cada padrão é testado contra os argumentos, em sequência, até que algum se aplique ou caso contrário, é lançado um erro.

No caso do fatorial, o primeiro padrão é "fac(0) -> 1". Ao se chamar esta função com o primeiro argumento igual a zero, será retornado zero. O segundo padrão é "fac(N) -> N * fac(N - 1)". Ou seja, para qualquer valor de parâmetro diferente de zero, o segundo padrão é invocado, e faz uma chamada recursiva para a mesma função, até que o parâmetro seja igual a zero, e então é executado o código do primeiro padrão, e a recursão pára.

Ok, hora de compilar e executar esse código. Salve um arquivo com o nome "lib.erl" com o conteúdo acima e no mesmo diretório execute:

fbdo@Marvin:~/Projetos/Erlang$ erl
Erlang (BEAM) emulator version 5.5.5 [async-threads:0] [kernel-poll:false]

Eshell V5.5.5 (abort with ^G)
1> c(lib).
{ok,lib}
2> lib:fac(10).
3628800
3>

Como pode ser visto, invoquei o shell usando o comando "erl", compilei o código usando "c(lib)", recebi a mensagem de que a compilação teve sucesso "{ok,lib}" e então invoquei a função que acabei de compilar usando a convenção modulo:função "lib:fac(10)". E agora, para impressionar os amigos, que tal calcular o fatorial de 1000?


3> lib:fac(1000).
402387260077093773543702433923003985719374864210714632543799910429938512398629020592044\\
208486969404800479988610197196058631666872994808558901323829669944590997424504087073759\\
918823627727188732519779505950995276120874975462497043601418278094646496291056393887437\\
886487337119181045825783647849977012476632889835955735432513185323958463075557409114262\\
417474349347553428646576611667797396668820291207379143853719588249808126867838374559731\\
746136085379534524221586593201928090878297308431392844403281231558611036976801357304216\\
168747609675871348312025478589320767169132448426236131412508780208000261683151027341827\\
977704784635868170164365024153691398281264810213092761244896359928705114964975419909342\\
221566832572080821333186116811553615836546984046708975602900950537616475847728421889679\\
646244945160765353408198901385442487984959953319101723355556602139450399736280750137837\\
615307127761926849034352625200015888535147331611702103968175921510907788019393178114194\\
545257223865541461062892187960223838971476088506276862967146674697562911234082439208160\\
153780889893964518263243671616762179168909779911903754031274622289988005195444414282012\\
187361745992642956581746628302955570299024324153181617210465832036786906117260158783520\\
751516284225540265170483304226143974286933061690897968482590125458327168226458066526769\\
958652682272807075781391858178889652208164348344825993266043367660176999612831860788386\\
150279465955131156552036093988180612138558600301435694527224206344631797460594682573103\\
790084024432438465657245014402821885252470935190620929023136493273497565513958720559654\\
228749774011413346962715422845862377387538230483865688976461927383814900140767310446640\\
259899490222221765904339901886018566526485061799702356193897017860040811889729918311021\\
171229845901641921068884387121855646124960798722908519296819372388642614839657382291123\\
125024186649353143970137428531926649875337218940694281434118520158014123344828015051399\\
694290153483077644569099073152433278288269864602789864321139083506217095002597389863554\\
277196742822248757586765752344220207573630569498825087968928162753848863396909959826280\\
956121450994871701244516461260379029309120889086942028510640182154399457156805941872748\\
998094254742173582401063677404595741785160829230135358081840096996372524230560855903700\\
624271243416909004153690105933983835777939410970027753472000000000000000000000000000000\\
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\
000000000000000000000000000000000000000000000
4>

Uau, isso foi rápido. E o mais impressionante: este número gigante que no meu terminal ocupa 30 linhas e que foi calculado por uma função recursiva não estourou a pilha de execução, nem o tamanho da variável. Para pessoas que, como eu, têm mais experiência com C/C++ ou Java, é quase mágico o que acaba de acontecer. Mas as magias tem nome, e se chamam otimização da recursão em cauda e conversão implícita de tipos.

Em Erlang só existem dois tipos numéricos, o inteiro e o número de ponto flutuante. E eles nunca estouram porque não têm tamanhos fixos, e sim crescem enquanto houver memória disponível.

Para linguagens funcionais, a recursão é parte essencial, já que não existem operadores de laços. Então quase todas otimizam o quanto podem as chamadas recursivas, e no caso do fatorial a otimização é trivial, já que não existem operações a serem realizadas após a chamada recursiva, o que é chamado de recursão em cauda. O que a máquina virtual Erlang faz, ao invés de empilhar a chamada recursiva, é sempre substituir o endereço de retorno da função pelo endereço da função chamada, mantendo a pilha com tamanho constante. Nada de "StackOverflowException". É como se substituíssemos a função recursiva por uma interativa equivalente:


função fatorial(x: inteiro): inteiro
var i, aux: inteiro
inicio
aux <- 1;
para i de 1 até x faça
aux <- aux * i
fim_para
fatorial <- aux
fim

E por hoje chega de diversão com funções recursivas.

Bookmark and Share
Leave the first comment

E o reconhecimento de voz/imagem se tornam commodities...

Ao abrir minha Communications ACM deste mês, vi um artigo na sessão BLOG@CACM que me chamou a atenção. O artigo de Tessa Lau Hello Computer comentava sobre sua satisfação com seu novo GPS, um Garmin Nüvi 850. Não por simplesmente ser um excelente GPS, mas sim por ter uma interface ativada por voz.

Isso me fez lembrar de um pequeno projeto em que me envolvi com alguns amigos, a algum tempo, por nós chamado de projeto MONOH (MOmmy, NO Hands!). Resumindo, o objetivo do projeto era criar um plugin para a IDE Netbeans que fornecesse a capacidade da ativação por voz de alguns comandos normalmente acessíveis via teclas de atalho. Cá entre nós, e que ninguém nos ouça, confesso que a razão principal de investir neste projeto era, na época, a de poder ganhar o NetBeans Innovators Grants Contest , o que conseguimos com relativo sucesso. Eu acredito que um fator determinante para nossa vitória foi exatamente o fator coolness da proposta, afinal de contas todo mundo acha muito legal parar de usar o mouse e o teclado e começar a falar com a máquina. De uma forma geral, o que queremos mesmo é parar de ter que nos relacionar com todas as inúmeras máquinas que nos cercam no dia-a-dia usando a linguagem delas, para poder usar a nossa. Acabar de uma vez por todas com este problema de impedância.

O que me deixa mais chateado é ter que confessar também que todo o mérito pelo reconhecimento de voz do nosso projeto não é de ninguém da equipe, e sim do projeto Sphinx4 . Este projeto, apoiado pela Carnegie Mellon University entre outros, é um reconhecedor de voz escrito em Java, estado-da-arte, livre e open source . Nosso mérito foi o de estudar a API NetBeans, estudar a API do Sphinx4, e colar os dois. É assombroso a qualidade do que se tem hoje em dia na forma de software livre e open source . Ou seja, para fazer hoje um aplicativo que reconhece a voz, não é mais necessário um doutorado. Com tempo e paciência qualquer um pode impressionar seus amigos.

Outro exemplo de como o relacionamento homem-máquina tem melhorado, mas é quase bobagem mencionar, são essas máquinas fotográficas que temos hoje que somente batem a foto quando as pessoas focalizadas sorriem. Elas são quase banais, estão a venda em qualquer loja por preços acessíveis a qualquer mortal. Será que somente eu me assombro em como um simplório chip que cabe numa máquina fotográfica é capaz de fazer o reconhecimento de face, e determinar se alguém está sorrindo?!?!

E por último, um vídeo no YouTube também fez minha cabeça explodir. O mundo foi assolado pela febre do Wii, mas isso poderá ser nada comparado ao Project Natal . O Project Natal , que tem seu nome em homenagem a, pasmem, nossa cidade de Natal no Rio Grande do Norte graças ao brasileiro que comanda o projeto, leva a iteratividade a um outro patamar: não há controles! Somente você, balançando suas mãos e pernas na frente do console, tendo seus movimentos reproduzidos na tela. Droga, serei obrigado a comprar um XBox 360 (além de um PS3 quando sair o God of War III).

Tudo isso me faz ver que estamos no momento histórico onde aquelas inúmeras pesquisas que a décadas não passavam de estudo acadêmico estão chegando às prateleiras, estão aí nas ruas, não assombram mais ninguém. Provavelmente nossos filhos vão achar engraçado nossas histórias de como era usar uma bugiganga com 102 teclas e uma outra com 2 teclas que movíamos na mesa pra lá e pra cá para fazer nossos computadores nos entenderem. Finalmente estamos no ponto histórico onde estudos do guarda chuva de inteligência artificial, por muitos considerados distantes e áridos, viraram commodities , na mão de todo mundo, sem que ninguém nem precise saber o quão sofisticado aquilo na verdade é para poder usar, e poder usufruir.

Não espere mais, comece a falar com seu computador hoje! Ele um dia poderá entender.

Bookmark and Share
Leave the first comment

Erlang em Pílulas - Entrando e saindo do shell

Como muitas vezes é dito por Andrew Hunt, autor do livro The Pragmatic Programmer: From Journeyman to Master (recomendo!) é muito bom para todo programador aprender pelo menos duas novas linguagens por ano. Já a algum tempo tenho flertado com Erlang, e uma das razões é todo o alvoroço na comunidade de desenvolvedores a volta de linguagens funcionais, e outra pelos meus interesses em desenvolvimento de código paralelo e concorrente.

E é justamente nestes pontos em que Erlang mostra a que veio, e é por este motivo todo o alvoroço. Erlang foi desenvolvido nos laboratórios da Ericsson para o desenvolvimento de centrais telefonicas, num ambiente com requisitos de tempo real mais leves e alta disponibilidade. O fato de ser uma linguagem funcional faz ter uma característica muito comum em muitas linguagens funcionais: a ausência de efeitos colaterais em suas funções, não existindo, com isso, a necessidade da existência de mecanismos de sincronização para áreas de memória compartilhada. Existem primitivas na linguagem que permitem o desenvolvimento de software paralelo e concorrente de forma muito mais simples do que no mundo procedural das principais linguagens como Java, Python ou C/C++, usando passagem de mensagens, implementando o modelo de atores ( Actor Model ). Quem já teve que implementar um programa concorrente usando múltiplas threads sabe que não é uma das tarefas mais triviais. Mas isso tudo é muito bem explicado em qualquer sítio na internet sobre Erlang, o que eu gostaria mesmo é de demonstrar um pouco de como é desenvolver programas usando esta linguagem.

Primeiro, instale uma versão de Erlang na sua plataforma preferida. Eu uso linux/Ubuntu, então meus exemplos vão ter a cara desta plataforma. Ao executar o comando erl na linha de comando, você verá algo como isto:


Erlang (BEAM) emulator version 5.5.5

[/source]

[async-threads:0] [kernel-poll:false]

Eshell V5.5.5 (abort with ^G)
1>

Agora digite o seguinte:


1> 2 + 5.
7
2>

Primeira coisa a perceber é que o shell do Erlang numera as linhas conforme você dá entrada. Todo comando em Erlang deve terminar com ponto "." e um enter . Todo comando devolve alguma coisa, e ao digitar 2 + 5 ele corretamente devolveu 7.

Para terminar com o shell do Erlang, basta um Control-C. Você verá a seguinte saída:


BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution

Digite "a" para deixar o shell.

Outra forma de deixar o sistema, é digitando "halt()":


1> halt().
fbdo@Marvin:~$

Na próxima pílula de Erlang, vou falar um pouco sobre como compilar um programa nesta linguagem.

Bookmark and Share
3 comments so far, add yours

Usos de Computação Paralela e Distribuída em Computação Evolutiva

Evolution, from Man to Evolutionary Algorithms

Evolution, from Man to Evolutionary Algorithms

O texto abaixo foi apresentado pelo grupo Ariel Malves, Rodrigo Marques e Fabio Oliveira como trabalho final no curso de Algoritmos Evolutivos, sigla IA770, ministrado no Departamento de Engenharia da Computação e Automação Industrial da Universidade Estadual de Campinas (Unicamp).

Resumo: Os Algoritmos Evolutivos(AEs) têm se mostrado muito eficientes em diversos problemas extremamente difíceis de serem atacados por métodos mais clássicos, e por serem naturalmente paralelizáveis e necessitarem de muitos recursos computacionais, diversas técnicas estão sendo utilizadas para melhorar seu desempenho, elevando ainda mais a utilidade prática desta ferramenta. No entanto, muitas vezes a paralelização do algoritmo leva a alterações estruturais que mudam o seu comportamento comparado a um AE seqüencial, ou então aumentam mais ainda o leque já vasto de parâmetros para ajuste do mesmo. Pretendemos mostrar uma taxonomia dos AEs paralelos e distribuídos, suas principais diferenças, parâmetros e ganhos com relação aos seqüenciais, e construir um arcabouço para comparação do desempenho de um algoritmo representativo contra um semelhante porém seqüencial, demonstrando com um exemplo prático suas características.

Introdução

Os Algoritmos Evolutivos(AEs) mantêm uma população de possíveis soluções que competem entre si seguindo a metáfora da Teoria Evolutiva Moderna. Os operadores envolvidos em AEs para problemas não triviais precisam de muitos recursos computacionais, e por isso a busca por melhores técnicas para a melhora de seu desempenho, como o uso de computação paralela e distribuída.

Em geral, os operadores dos AEs como a recombinação e a mutação, e mesmo a avaliação do fitness , se concentram em um ou em alguns poucos indivíduos da população, tornando os AEs muito propícios a paralelização. Mesmo o operador seleção, que em geral avalia todos os indivíduos simultaneamente, e por isso mesmo seria um gargalo a paralelização, pode ser alterado para se adaptar melhor a este paradigma, ou então podemos nos ater a somente ao subconjunto das suas variantes que se utilizam da informação de poucos indivíduos, como por exemplo o operador torneio.

Normalmente, quando se aplica técnicas de paralelização, busca-se tão e somente diminuição do tempo necessário para a execução do algoritmo. No entanto, no caso de AEs, há evidências [ 1 ][ 2 ] não somente da redução do tempo necessário, mas também da maior manutenção da diversidade, da melhora na capacidade de busca de múltiplas soluções em problemas multi-modais, e na maior qualidade do resultado.

A melhora da qualidade do resultado merece uma discussão mais detalhada. Ao se executar um algoritmo usando N threads de execução ou então ao se executar em N nós (máquinas) diferentes em uma rede no caso de sua distribuição, pode-se esperar uma redução no tempo de execução proporcional a N. No entanto, esta expectativa idealizada é muitas vezes ingênua, já que tanto uma técnica quanto a outra dependem de instrumentos de comunicação e sincronização que no caso seqüencial não são necessários, e sobrecarregam a execução do algoritmo. Mas no caso dos AEs, ao se executar o mesmo algoritmo de forma seqüencial e de forma paralela até que encontrem uma solução de mesma qualidade, muitos experimentos têm mostrado uma melhora super linear do tempo de execução [ 3 ][ 4 ].

Taxonomia

De acordo com o trabalho de Erick Cantú-Paz [ 5 ], há três tipos principais de AEs paralelos:

  1. População única, mestre/escravo: A população é única como nos AEs seqüenciais, mas a avaliação do fitness é distribuída em múltiplos processadores. Como os operadores consideram a população inteira, também são conhecidos como AEs paralelos globais.
  2. População única, modelo celular: Muito utilizado em computadores massivamente paralelos, consiste de uma população estruturada distribuída. A seleção e a recombinação são restritas a uma pequena vizinhança, mas como há a sobreposição de vizinhanças, há iterações entre todos os indivíduos. Busca ter idealmente um único indivíduo por processo.
  3. Múltiplas populações, modelo ilha: Consiste em sub-populações que trocam indivíduos ocasionalmente. Esta troca de indivíduos é chamada migração. É o tipo mais popular por permitir o uso de hardware comum e acessível, porém não é completamente compreendido, e introduz mudanças fundamentais na operação dos AEs.

É claro que neste espectro, existem muitas abordagens híbridas, como por exemplo com arquiteturas combinando múltiplas populações com mestre/escravo. Estas abordagens híbridas são também chamadas de AEs paralelos hierárquicos.

Modelo Mestre/Escravo

O modelo mestre/escravo sugere que a cada geração o processo mestre contendo a população delegue a tarefa de cálculo do fitness para cada um dos processos escravos (ver figura 1) para então devolver esta informação para o mestre. Cabe então ao mestre, assim que todos os escravos retornarem suas informações, as tarefas de seleção dos pais para a próxima geração e criação de novos indivíduos utilizando operadores de recombinação e mutação. É uma técnica simples, que pode ser aplicada em problemas onde a avaliação do fitness no problema atacado seja computacionalmente onerosa.

Figura 1. Modelo Mestre/Escravo

Figura 1. Modelo Mestre/Escravo

Como a população é única e os operadores consideram a população total para atuar, esta é a técnica de paralelismo que mais se assemelha a abordagem clássica de um AE seqüencial e uma aplicação pouco cuidadosa dessa abordagem pode levar a uma imprecisa interpretação dos ganhos em desempenho ou precisão.

Entre o processo mestre e os escravos podemos ter uma comunicação síncrona, onde o mestre interrompe sua execução e aguarda que os escravos retornem a ele todos os resultados, mesmo que existam diferenças de desempenho entre os nós. Obviamente, este tipo de implementação resulta em tempo ocioso de máquina, aproveitando inadequadamente o hardware disponível.

Sempre temos duas comunicações entre mestre-escravo para cada nó adicional, primeiramente no envio da fração da população para avaliação e depois no retorno do fitness avaliado.

Este tempo de comunicação gasto proporcional ao número de escravos pode, dependendo da infra-estrutura utilizada, ser inclusive maior que o ganho efetivo de desempenho conseguido pelo paralelismo. Podemos então ver que quanto maior o número de escravos nesta topologia, melhor a distribuição da tarefa de avaliação de fitness e portanto menor tempo computacional gasto na mesma. Por outro lado, a mesma condição implica em um maior tempo gasto na comunicação entre mestre e escravos.

Este é um compromisso que depende do tempo necessário para avaliar um indivíduo, da quantidade de escravos utilizada e de constantes que dependem do hardware utilizado, mas sugere que existe um número ótimo de escravos que minimize este tempo de execução [ 6 ].

Uma implementação assíncrona pode ser considerada, embora perca um pouco da analogia e das características que assemelham o algoritmo a um AE seqüencial, introduzindo outros fatores que podem ser benéficos de acordo com a classe do problema minimizando os gastos com o tempo de comunicação.

Numa implementação assíncrona o mestre não esperaria pela resposta dos escravos, e trabalharia com as informações que estivessem disponíveis no momento. Cada escravo ainda teria uma fração de população a avaliar mas devolveria os valores de fitness assim que o processamento estivesse concluído. Neste caso a avaliação em um processador mais lento atuaria em gerações espaçadas de acordo com a velocidade do mestre.

Outros operadores como a recombinação e a mutação também são sugeridos como passíveis de execução paralela por terem as mesmas características de independência entre indivíduos, mas por serem operadores normalmente pouco custosos a perda com o aumento das comunicações entre mestre-escravo faz com que esta abordagem seja pouco promissora na maioria dos casos.

Modelo Celular

Um AE celular ou de paralelismo massivo é uma proposta que difere significativamente de um AE tradicional. Neste modelo temos uma população distribuída em uma rede, um indivíduo por nó, como por exemplo num espaço bidimensional, formando uma grade que limita as interações entre os indivíduos, permitindo apenas a interação entre elementos vizinhos (ver figura 2). Como vimos no caso mestre-escravo, existe um custo alto na comunicação entre nós, e esta abordagem só se mostra vantajosa com o uso de hardware específico, como computadores ou processadores massivamente paralelos.

Figura 2. Modelo Celular

Figura 2. Modelo Celular

Os operadores genéticos de seleção e recombinação ocorrem apenas entre indivíduos próximos. Por esta característica, e por representar cada indivíduo na forma de um processo independente interagindo com o meio, oferece uma metáfora mais próxima da real para pesquisadores interessados no estudo de vida artificial.

A forma de implementação varia de acordo com a aplicação de interesse, podendo ter regiões de vizinhança sobrepostas, estruturas multidimensionais, ou mesmo migrações distantes ou disseminação dos melhores indivíduos de forma que não se limitem apenas a sua vizinhança.

Podemos pensar no AE celular como sendo uma adaptação de um AE tradicional que tenha em paralelo componentes do algoritmo como seleção dos indivíduos para recombinação, a própria recombinação, mutação, e a avaliação de fitness . Neste caso o modelo muito se assemelha aos outros modelos propostos tendo um foco maior na topologia e na distância relativa entre os indivíduos.

Portando uma mudança fundamental no AE é remoção da seleção global dos pais para recombinação, limitando-os a vizinhança. O comportamento é alterado significantemente com novos resultados e novos parâmetros como o tamanho da população e as fronteiras de vizinhança, que assumem papel importante nesta abordagem, controlando inclusive a pressão seletiva do algoritmo.

A parametrização ainda contaria com a topologia da rede, os métodos de seleção, recombinação, mutação, tamanho da população e sua distribuição entre múltiplos processadores e número de novos indivíduos gerados a cada iteração, considerando seu espaço de atuação.

Modelo Ilha

A característica fundamental deste modelo é o uso de algumas poucas populações relativamente grandes e do operador de migração. Cada sub-população é processada por um nó e atua como se fosse uma população totalmente independente, mas de acordo com uma política de migração, recebe e envia indivíduos de/para outros nós, distribuindo as informações sobre as soluções candidatas até o momento (ver figura 3).

distribuido

Figura 3. Modelo Ilha

Experimentos considerando a razão de migração mostraram que para populações isoladas (sem migração), a qualidade do resultado final era pior do que o de uma única população. Para taxas de migração altas, a qualidade era igual a de uma única população.

O excesso de comunicação, da mesma forma como no caso mestre/escravo, degrada o tempo de execução do algoritmo. Existem também indícios de que existe para cada problema e tamanho da população, uma quantidade ideal de nós.

Olhando pela ótica da metáfora natural, pode-se dizer que o modelo ilha reproduz o comportamento e a comunicação entre ecossistemas separados por barreiras naturais, e o resultado se assemelha a teoria do equilíbrio pontual ( punctuated equilibria ) da biologia evolutiva [ 2 ], onde os diversos ecossistemas e seus organismos vivem em equilíbrio a maior parte do tempo, e a alteração do ambiente produz um rápido movimento evolucionário. O modelo ilha adiciona um novo operador de migração aos demais operadores clássicos, e este operador, ao trazer novos indivíduos a uma população estável, gera um impulso evolucionário semelhante. O aumento da capacidade de exploração deste modelo, a evolução de sub-populações isoladas e este mecanismo de perturbação por migração são as chaves para explicar referências apontando melhoras de desempenho super lineares [ 3 ].

A popularidade desse modelo advém da sua simplicidade, facilidade de implementação e possibilidade de aplicação em hardware acessível, como em uma rede de estações de trabalho comuns.

Este modelo ainda oferece muita área para estudo, com muitas questões ainda não respondidas, como por exemplo qual a melhor forma da topologia de rede, ou então qual a melhor taxa e o intervalo de migração.

Migração

Na maioria dos esquemas de migração, ela é síncrona, ocorrendo em intervalo constante. Nesta forma de implementação, todos os nós pulsam numa mesma geração, parando no ponto de sincronização onde ocorre a troca de indivíduos. Pode também ser assíncrono, e neste caso cada nó mantêm uma fila de indivíduos recebidos, numa metáfora de caixa postal, nunca tendo que aguardar o envio/recebimento de indivíduos para continuar com o processamento, perdendo-se com isso o conceito de geração da população como um todo. Alguns esquemas aplicam a migração somente quando a sub-população está próxima de convergir, restaurando a diversidade.

Aliás, uma questão recorrente é de quando deve ocorrer a migração. Ocorrendo muito cedo, os migrantes podem ter building blocks pequenos demais para influenciar a população. Ocorrendo tardiamente, cada nó pode perder diversidade e estagnar num ótimo local, também consumindo preciosos recursos computacionais.

Há referências de um esquema diferente desenvolvido [ 5 ], onde processadores escravos evoluíam suas sub-populações e enviavam seus melhores indivíduos para o mestre, e este então aplicava a seleção com viés para os melhores, e enviava os selecionados para os escravos. Mostrou aumento de desempenho super-linear.

Topologia de rede

A topologia da rede do modelo ilha determina o quão rápido ou quão devagar uma boa solução é disseminada para as demais populações. Também determina o custo de comunicação da rede.

Normalmente são usadas topologias estáticas, que são usadas do começo ao fim do algoritmo, mas já foram feitos experimentos com topologias dinâmicas, onde a migração é realizada entre populações de acordo com algum critério, como diversidade da população, ou então a distância genotípica entre populações, ou até mesmo de forma aleatória.

Híbridos

E, como não poderia deixar de ser, como com os demais parâmetros dos AEs seqüenciais, existe muito espaço para a criatividade em termos de topologias e hibridizações.

Na figura 4, podemos ver um modelo híbrido ilha/celular, onde computadores massivamente paralelos desenvolvem suas sub-populações de forma quase independente, trocando informações de seus indivíduos de tempos em tempos como no modelo ilha.

Figura 4. Modelo Híbrido Ilha + Celular

Figura 4. Modelo Híbrido Ilha + Celular

Já na figura 5 podemos ver um modelo híbrido ilha/mestre-escravo, onde cada nó do modelo ilha delega a tarefa do cálculo da função de avaliação para uma outra coleção de computadores.

Figura 5. Modelo Híbrido Ilha + Mestre/Escravo

Figura 5. Modelo Híbrido Ilha + Mestre/Escravo

E finalmente, na figura 6 uma possível configuração ilha/ilha, onde em cada nó do modelo ilha existe um outro modelo ilha, com uma rede mais densa e de maior velocidade.

Figura 6. Modelo Ilha + Ilha

Figura 6. Modelo Ilha + Ilha

Cada modelo e suas variantes sempre devem ser criados e parametrizados de acordo com o problema atacado, como já é hábito no modelo seqüencial.

Problema de Teste

Para confirmar os dados teóricos até agora expostos, realizamos alguns experimentos. E para tanto buscamos na literatura um problema conhecido usado para realizar a comparação entre as diversas implementações.

Usamos o problema subset sum como detalhado em [ 9 ]. O problema subset sum é NP-Completo, e tem diversas formas, entre elas as mais conhecidas são: dado um conjunto de números W = \ {w_1, w_2 ,..., w_n \} de n inteiros e uma constante M, encontrar um subconjunto V \ subseteq W tal que a soma dos elementos em V é igual a M. Esta versão é basicamente um problema de decisão. Já um problema de otimização seria o de encontrar V tal que a soma dos elementos em V se aproxime de M, sem nunca ultrapassá-lo. A segunda forma será a usada por nós em nossos experimentos.

Nossas instâncias do problema foram criadas com 100000 elementos que foram aleatoriamente escolhidos com distribuição uniforme no intervalo [0.10 ^ 6] . Como pode ser notado, nossa variante é maior do que descrito em [ 9 ], e isto foi feito propositalmente pois as instâncias na forma descritas não se mostraram desafiadoras tanto para o algoritmo seqüencial quanto para o distribuído, obrigando-nos a aumentar seu tamanho e usar o procedimento de criação descrito como inspiração.

Para podermos comparar a nossa implementação quanto a eficiência contra metodologias clássicas, implementamos também um algoritmo para cálculo exato e outro para cálculo aproximado dado um percentual de erro aceitável, como descrito em [ 10 ]. Como o algoritmo para cálculo exato precisa de tempo e memória exponenciais em relação ao tamanho do problema, e lembrando que no caso do subset sum estamos falando de 2 ^ n possíveis subconjuntos, o algoritmo exato só é viável para instâncias muito pequenas. Em estações de trabalho típicas de hoje, fomos capazes de resolver instâncias com até 40 elementos, para instâncias maiores não houve memória suficiente. Já o algoritmo aproximado precisa de tempo e memória polinomiais, e resolveu uma instância com 10000 elementos em 68 minutos em uma estação de trabalho típica. Para uma instância de 100000 elementos, dois dias de execução não foram suficientes para se encontrar uma boa solução com o algoritmo aproximado.

Detalhes de implementação

De todos os modelos apresentados, escolhemos o modelo ilha para ser implementado, por ser bem diferente do AE seqüencial, e ao mesmo permitir a implementação em hardware facilmente acessível.

A representação escolhida foi de uma cadeia binária C com 100000 bits. Cada n-ésimo bit ativo indicava o uso do elemento n do conjunto original. Seja C = (\ vec {x} = (x_1, x_2 ,..., x_ {100000})) e P (\ vec {x}) = \ sum_ {i = 1} ^ {100,000} w_i x_i , a função objetivo utilizada foi:

f (\ vec {x}) = a \ cdot P (\ vec {x}) + (1 - a) \ cdot \ lfloor (M - 0.1 \ cdot P (\ vec {x})) \ rfloor

onde a = 1 quando \ Vec {x} é factível, i.e., quando M - P (\ vec {x}) \ geq 0 , e a = 0 nos outros casos. Dessa maneira, o valor obtido como fitness é a própria soma do sub-conjunto representado por C, ou então o valor objetivo e uma penalidade de um décimo de P (\ vec {x}) para soluções infactíveis.

Para que obtivéssemos um maior controle do processo de seleção, usamos o operador de torneio para escolha dos indivíduos que iriam compor a lista de pais para criação de uma nova geração.

Importante também salientar que, no processo de seleção, os filhos substituem os pais em uma configuração (\ Mu, \ lambda) . Através de testes preliminares, fora constado que o tempo de convergência estava sendo excessivamente prejudicado pela perda de boas soluções, fato que nos motivou a implementar o operador de elitismo, que mantinha na população a melhor solução encontrada.

Na recombinação utilizamos o operador de crossover de pois pontos e a mutação pontual. A importância do operador de crossover em um AE distribuído não pode ser ignorado, especialmente quando se usa um operador de migração para disseminar a informação genotípica dos elementos através das ilhas.

Nesse experimento utilizamos o operador de migração para transportar os n melhores indivíduos de uma ilha para outra. A ilha receptora elimina seus n piores indivíduos para receber os migrantes. Nos testes, o valor que mostrou melhores resultados foi de n = 2.

A topologia implementada foi a anel com passagem de token . Cada ilha possui outra como destino de suas migrações, mas a todo momento apenas uma ilha pode realizar o processo de migração, exatamente aquela que possuir o token . O token é enviado a ilha alvo junto com os indivíduos migrantes. Essa topologia apresentou-se interessante pois conseguimos ajustar a periodicidade da migração para que ocorresse quando as ilhas já estivessem perto de, ou já estivessem entrado em um estado de equilíbrio, quando atingiam um máximo local.

O software desenvolvido para os testes foi dividido em dois componentes: o AE propriamente dito, realizando o processo de seleção, recombinação, mutação, migração, etc..., e um controlador, um componente que servia para registrar os nós (instâncias dos AEs), configurá-los remotamente, iniciá-los, finalizá-los e coletar dados estatísticos. Este segundo componente proporcionou uma grande versatilidade, possibilitando inúmeras execuções a fim de se testar diferentes parâmetros.

Vale ressaltar também que foram implementados outros operadores e topologias que não foram utilizados na execução final. Um dos operadores criados implementava um algoritmo greedy (guloso) que basicamente colocava os organismos em ótimos locais de maneira bem rápida. Tal operador pode ser muito interessante para resolver instâncias do problema subset sum cujo conjunto possua uma boa quantidade de números de pequena ordem, mas ineficaz para outros tipos de instâncias.

Como topologias adicionais, foram implementadas a dinâmica, onde cada ilha migrava organismos para outra escolhida de forma aleatória, podendo todas as ilhas efetuar o processo de migração de forma simultânea, e o anel sem passagem de token , que é a mesma que a topologia utilizada em nossos experimentos, porém possibilitando migrações simultâneas. Tanto uma como outra forma se mostraram densas demais, fazendo surgir um comportamento de população única.

Ambiente de testes

Foram utilizados 17 computadores, cada qual com CPUs de dois núcleos a 2,2 GHz e 2Gb de memória RAM.

Em cada computador executamos uma instância do AE (ilha). O fato dos computadores possuírem um núcleo adicional auxiliou o transporte dos indivíduos migrantes e do envio de estatísticas para o controlador, visto que essas operações foram concebidas de forma assíncrona, e em threads de execução separadas.

A rede local tinha a velocidade de 100 Mbits/s e cada computador estava ligado a um switch também de 100Mbits/s.

Análise

Para averiguar os ganhos obtidos com as técnicas de paralelização e distribuição descritas, comparamos os tempos de execução para a obtenção de resultados de mesma qualidade confrontando a versão paralela contra sua versão seqüencial com parametrização similar. Obtemos os resultados mostrados na tabela 1.

Execução Seqüencial Modelo Ilha
1 4m50s 2m03s
2 12m41s 2m04s
3 25m16s 1m15s
4 8m42s 1m12s
5 5m37s 0m42s
6 6m36s 0m29s
7 32m54s 0m25s
8 33m18s 0m32s
9 38m17s 1m25s
10 18m14s 0m59s
11 5m25s 1m11s
12 15m47s 1m11s
13 24m22s 2m28s

Nas execuções seqüenciais, a mais rápida execução obteve uma solução em 4m50s, e a mais lenta levou 38m17s. O tempo médio para obtenção de uma solução foi de 17m51s.

Para as execuções em paralelo temos um ganho considerável, onde a mais rápida execução concluiu em 25s e a mais lenta em 2m28s, com tempo médio de execução de 1m10s.

A análise dos resultados visivelmente satisfatórios leva ainda a um Speedup alcançado de 15.28 (praticamente linear), que é definido como sendo o tempo médio das execuções seqüenciais dividido pelo tempo médio das execuções paralelas, neste caso específico utilizando 17 nós.

Conclusões

Foi visto durante o experimento que múltiplas populações isoladas ajudam a manter a diversidade.

O operador de migração, ao disseminar a informação dos indivíduos de melhor fitness gera perturbações na ilha receptora, fazendo com que esta realize um salto para um novo ótimo local.

Foi observado que as sob-populações colaboram entre si para a fuga de máximos locais.

Foi constatado um aumento significativo no número de parâmetros do AE, o que dificulta ainda mais o acerto para um problema específico. O novo parâmetro de periodicidade de migração se mostrou fundamental para alcançar o resultado favorável.

Referências

[ 1 ] E. Alba and J. M. Troya, “An analysis of synchronous and asynchronous parallel distributed genetic algorithms with structured and panmictic islands,” in Parallel and Distributed Processing, ser. Lectures Notes in Computer Science. Berlin: Springer, oct 1999, pp. 248–256.
[ 2 ] T. Baeck, D. B. Foegel, and Z. Michalewicz, Eds., Evolutionary Computation: Advanced Algorithms and Operators, 1st ed. Dirac House, Temple Back, Bristol BS1 6BE, United Kingdom: Institute of Physics Publishing, November 2000, vol. 2, ch. 15, 16, 26, pp. 101–124; 125–133; 253–263.
[ 3 ] S. R., “Parallel genetic algorithms,” in Proceedings of the Fifth International Conference on Genetic Algorithms. San Mateo, CA: Morgan Kaufmann, 1993, pp. 334–341.
[ 4 ] “Speedup,” 2009. [Online]. Available: http://en.wikipedia.org/wiki/Speedup
[ 5 ] E. Cant ́ -Paz, “A survey of parallel genetic algorithms,” Calculateurs Paralleles, vol. 10, 1998.
[ 6 ] ——, “Designing efficient master-slave parallel genetic algorithms,” Illinois Genetic Algorithms Laboratory, University of Illinois at Urbana-Champaign, Tech. Rep. 97004, May 1997.
[7] ——, “Efficient and accurate parallel genetic algorithms.”
[8] X. Li and M. Kirley, “The effects of varying population density in a fine-grained parallel genetic algorithm.”
[ 9 ] M. Jelasity, “A wave analysis of the subset sum problem,” in Proceedings of the Seventh International Conference on Genetic Algorithms, T. Baeck, Ed. San Francisco, CA: Morgan Kaufmann, 1997, pp. 89–96.
[ 10 ] T. H. Cormen, C. E. Leiserson, R. L. Rivest, and C. Stein, Introduction to Algorithms, 2nd ed. Cambridge, Massachusetts 02142: MIT Press, 2001, pp. 1043–1049.

Bookmark and Share
One comment so far, add another