Escolar Documentos
Profissional Documentos
Cultura Documentos
–
Faculdade de Ciências e Tecnologia
–
Processamento distribuı́do do algoritmo
genético compacto através de Web Services
Faro, 2005
Resumo
1 Introdução 7
1.1 Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2 Organização do relatório . . . . . . . . . . . . . . . . . . . . . 9
2 Web Services 11
2.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.1 Definição . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.2 Vantagens . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.3 Arquitectura . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4 XML Schemas . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.5 WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5.1 Estrutura . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.6 SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.7 Sumário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5 Resultados e análise 62
1
CONTEÚDO 2
A Manual do WebservCGA 69
A.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
A.2 Instalação do servidor . . . . . . . . . . . . . . . . . . . . . . 69
A.3 Instalação do cliente . . . . . . . . . . . . . . . . . . . . . . . 71
A.4 Invocação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
B WEBSERVCGA.WSDL 76
3
Lista de Tabelas
4
Agradecimentos
5
Lista de acrónimos
WS Web Services
6
Capı́tulo 1
Introdução
1.1 Objectivos
7
CAPÍTULO 1. INTRODUÇÃO 8
Web Services
Neste capı́tulo, iremos ver o que são web services, em que contexto aparece-
ram, e a que se destinam, quais são as vantagens, os protocolos e formatos
estandardizados que se criaram para lhes servir de suporte. Sendo todos
esses standards baseados em XML, faremos uma breve abordagem a esta
linguagem estruturada de transmissão de dados. Depois veremos, um a um,
cada um desses standards que servem suporte aos WS, como XML Schemas,
WSDL e SOAP.
2.1 Introdução
11
CAPÍTULO 2. WEB SERVICES 12
2.2.1 Definição
Pode-se definir WS1 como uma forma de integrar e trocar informação entre
sistemas concebidos sob linguagens de programação ou sistemas operativos
diferentes, usando um formato de texto universalmente utilizado conhecido
por XML, que serve de suporte para normas de formatação e comunicação
estandardizadas necessárias à implementação dos web services, como WSDL,
SOAP e UDDI[5].
1
Web Services
CAPÍTULO 2. WEB SERVICES 13
2.2.2 Vantagens
2.2.3 Arquitectura
localizador (UDDI7 ).
2.3 XML
Existe uma necessidade sobre um formato que possa ser utilizado univer-
salmente como veı́culo de transmissão de informação. Se todos os sistemas
utilizarem esse formato, então facilmente se poderá propagar muito mais fa-
cilmente a informação, sem haver necessidade de processamento extra para
7
Universal Description, Discovery and Integration
CAPÍTULO 2. WEB SERVICES 17
<receita>
<ingredientes>
<ingrediente>
farinha em pó
</ingrediente>
<ingrediente>
0,5 litros leite
</ingrediente>
<ingrediente>
2 ovos
</ingrediente>
</receita>
• Qualquer tag genérica <X> define uma secção lógica do documento co-
12
Document-Type Definition
CAPÍTULO 2. WEB SERVICES 20
nhecida por elemento, devendo ser terminada pela tag de fecho </X>,
de nome idêntico à que lhe deu inicio, com a diferença de possuir uma
/ à frente do nome. No caso do elemento não albergar mais nenhuma
informação para além da que consta de um atributo dentro da tag, para
não estar a usar uma tag de encerramento inutilmente termina-se a tag
com uma “/” antes do > (como em <br /> ).
• Existe uma tag principal que define o Elemento Raı́z (Root Element),
que assinala o princı́pio e o fim do documento. Por exemplo, para o
HTML o elemento raı́z é a tag <html> , para o WSDL é <definitions>
e no SOAP <envelope> , como veremos em breve. De assinalar, fi-
nalmente, que a linguagem XML é sensı́vel ao tamanho da letra.
Do que ficou dito acima, vê-se que o XML pode ser usado como metalin-
guagem, quer dizer, é uma linguagem que pode ser usada para criar outras
linguagens.
Os ficheiros XML podem ser combinados usando tags de duas ou mais
fontes diferentes, quer dizer, um documento XML partilha tag’s de duas
proveniências, respeitantes a dois ou mais DTD’s ou XML schemas. Quando
isso acontece, chamamos a cada uma das proveniências um namespace. Um
namespace é identificado por URI13 , que, na maior parte das vezes, assume
a forma de um URL14 , que é um vulgar endereço de um site na Web, que
no entanto, não precisa necessariamente de apontar para o XML Schema
ou DTD que o define. É apenas uma forma convencional de distinguir os
namespaces de acordo com o URL. Neste trabalho, por exemplo, o WSDL
é definido num namespace de URL http://ualg.wscga , que, como se
pode ver, não corresponde sequer a um nome de domı́nio válido de acordo
com as normas. Cada namespace é identificado no documento XML através
de um prefixo seguido de dois pontos identificando o namespace ao qual
pertence. Assim, por exemplo se tivermos dois namespaces A e B com as
tags <SISTEMA> e <EMPRESA> , no novo ficheiro que incorpora as duas
tags, teremos respectivamente <A:SISTEMA> e <B:EMPRESA> . É possı́vel
ainda especificar o namespace por defeito a que pertencem as tags que não
estão precedidas por um prefixo, através do uso de um atributo especial
13
uniform resource indicator
14
uniform resource locator
CAPÍTULO 2. WEB SERVICES 22
Os XML Schemas são uma linguagem baseada em XML criada para definir
as estruturas de novas linguagens em XML. Vieram substituir os DTD’s, no
que toca aos seguintes pontos:
só pode aceitar string’s nos dados que recebe. Por outro lado, vemos que
o elemento <ingredientes> recebe um número indeterminado de subele-
mentos <ingrediente> ( atributo maxOccurs="unbounded"), enquanto que
<receita> (que é o elemento raı́z) apenas recebe um subelemento <ingredientes>
(de acordo com o atributo maxOccurs="1" ). Aliás, poder-se-ia pensar em
remover o subelemento <ingredientes>, uma vez que aparece uma única
vez em todo o documento.
A tabela 2.1 mostra alguns tipos primitivos que podem ser utilizados para
definir elementos simples:
CAPÍTULO 2. WEB SERVICES 26
Tabela 2.1: Alguns valores possı́veis para os tipos de dados primitivos que
um XML schema pode definir. De referir que o namespace para estes tipos
é xsd:
2.5 WSDL
2.5.1 Estrutura
definitions{1}
types{1}
message+
part*
portType+
operation+
input{1}
output{1}
binding{1}
soap:operation+
input{1}
output{1}
service{1}
port+
guma das mensagens não precisar de parâmetro (ou não devolver nada),
o elemento <Message> não terá qualquer filho.
ficado um URL a ser utilizado para cada WS (de referir que cada
<operation> corresponde a uma função). Dentro de cada <input>
e <output> especificamos o estilo sob o qual queremos codificar a
mensagem a ser enviada através do SOAP.
2.6 SOAP
envelope{1}
header?
body{1}
fault?
2.7 Sumário
O Algoritmo Genético
Compacto
3.1 Introdução
33
CAPÍTULO 3. O ALGORITMO GENÉTICO COMPACTO 34
uma forma como certas caracterı́sticas transmitidas entre gerações podem au-
mentar a sua presença numa determinada população de certa espécie através
da sobrevivência dos mais aptos, que assim permite que os seus genes que
determinam essas caracterı́sticas vantajosas sejam transmitidos à sua des-
cendência em maior número, assegurando assim que essa mesma descendência
possa sobreviver com maior probabilidade. No entanto, Darwin e Wallace
não conseguiram explicar o processo exacto pelo qual essas caracterı́sticas
(codificadas nos genes) eram transmitidos à descendência. Quase ao mesmo
tempo que era apresentada a teoria da evolução, um monge checo de nome
Gregor Mendel, através de experiências realizadas nos jardins do seu con-
vento com ervilhas de cheiro, pôde determinar que o processo de transmissão
das caracterı́sticas dos progenitores são transmitidas através de um entre-
cruzamento de genes de dois progenitores, de forma que os seus descendentes
partilham caracterı́sticas de ambos. Nos Algoritmos Genéticos aplicamos es-
sas regras que a Mãe Natureza utiliza para salvaguardar a sobrevivência dos
seres vivos perante numa superfı́cie planetária sempre instável numa escala
de tempo de milhões de anos. Existe uma classe de problemas onde uma
resolução através de métodos tradicionais é extremamente difı́cil ou ocorre
durante uma duração de tempo extremamente elevada para que se possa
encontrar uma solução em tempo útil. É neste tipo de problemas que os
algoritmos genéticos demonstram todo o seu poder. Os primeiros algoritmos
genéticos foram desenvolvidas por John Holland na Universidade de Michi-
gan durante a década de 70, e foram apenas alvo de um estudo teórico, e só a
partir da década de 80, com a primeira conferência internacional, se começou
a pensar nas aplicações práticas dos referidos algoritmos.
CAPÍTULO 3. O ALGORITMO GENÉTICO COMPACTO 35
1 0 0 1 1 1 1 1 0 1
cromossoma do par são combinadas num novo indivı́duo, gerando assim dois
novos indivı́duos. A probabilidade de ocorrer um crossing-over é executada
de acordo é especificado de acordo com um valor de probabilidade Pc .
Mas antes de ocorrer o crossing-over tem lugar a selecção, que consiste em
seleccionar os indivı́duos para o cruzamento, sendo que neste ponto podemos
ter vários operadores possı́veis: entre os mais utilizados contam-se a roleta e
o torneio.
A roleta opera de acordo com as frequências com que determinado in-
divı́duo aparece na população, conjuntamente com o valor da função de ava-
liação. É feito o somatório dos valores da função de avaliação para todos
os indivı́duos, sendo atribuı́do a cada um deles uma “fatia” da roleta. Os
indivı́duos com maior mérito receberão uma porção maior da área da roleta
e por via disso terão maior probabilidade em serem seleccionados.
No caso do operador torneio, são seleccionados dois indivı́duos ao acaso
dentro da população, após o que são comparados ao nı́vel do seu mérito, sendo
que aquele que tiver o melhor “ganha” o torneio e envia mais uma cópia para
a população, aumentando numa unidade o seu efectivo populacional.
Existe outro parâmetro a prestar atenção, conhecido por pressão de se-
CAPÍTULO 3. O ALGORITMO GENÉTICO COMPACTO 37
• Tolerância a falhas
• Escalabilidade
3.5 Sumário
Para além do OneMax para testar a eficácia do cGA, existe uma função
conhecida por função deceptiva ou trap 1 , definida de acordo com o que está
na figura 4.1. A versão mais simples da trap atribui o valor de 1 quando
a string conter apenas uns, mas para o valor imediatamente abaixo inferior
1
armadilha, em português
46
CAPÍTULO 4. APLICAÇÃO DISTRIBUÍDA DO CGA USANDO WEB SERVICES 47
1 , o=k
trap(c) = 0 , o=k−1
d
− k−1 o+d , o<k−1
resultado final da função fitness global é a soma das fitness individuais cal-
culadas sobre cada um desses blocos. Isto é um problema que, dada a sua
complexidade, o cGA não consegue resolver, precisando de uma população
numerosa para o conseguir. Este problema foi utilizado numa simulação em
série[4] (ver secção 4.2) e também foi utilizado neste trabalho.
tabela seguinte 4.2 os nomes dos parâmetros, valores de retorno e seus res-
pectivos tipos.
Os elementos XML com o namespace wscga: foram definidos na secção
<TYPES> do ficheiro WSDL e são elementos XML que são depois serializados
(é este o termo de conversão de objectos em XML) quando se torna necessário
enviá-los usando SOAP. Dentro de cada elemento XML estão definidos alguns
subelementos, de acordo com o que está na tabela 4.3.
De notar que, ao contrário que é habitual, mas não é nenhum contra-senso,
o vector população transmitido adopta como tipo de dados base inteiros e não
números reais, como costuma ser costume na implementação do cGA, isto
deve-se ao facto de uma implementação do dito vector usando inteiros torna
mais reduzida a informação a enviar dentro da mensagem SOAP. Usando
Tabela 4.3: Elementos XML usados como parâmetros das funções web ser-
vices
CAPÍTULO 4. APLICAÇÃO DISTRIBUÍDA DO CGA USANDO WEB SERVICES 56
2. Cada uma das threads criadas pelo cliente invoca a função DownloadPopulationVector
, sinal de que pretende participar no trabalho. Os passos 2 e 3 da arqui-
tectura proposta juntam-se assim num único passo, descrito de seguida.
4. Este passo foi implementado mais ao menos nos mesmos moldes des-
critos. Não há de novo a acrecentar ou a retirar daqui.
tivo por parte do cliente. E quem faz o pedido não são as threads, mas sim
o programa cliente, que antes de arrancar todas as threads, “faz sinal” ao
servidor dando conta dessa intenção. Para tudo isto ser possı́vel tornou-se
necessário criar uma nova função ( CreateNewPopulationVector ), que ini-
cializasse um novo vector população no servidor, assim que o trabalho no
anterior estivesse concluı́do. De notar, no entanto, que enquanto o servidor
(que corresponde ao manager da arquitectura proposta) estiver ocupado a
atender clientes, recusa inicializar um novo vector população enquanto o tra-
balho no vector população actual não estiver concluı́do. Deste modo, evitou-
se que um cliente (relembrar, corresponde a um worker ) destruı́sse todo o
trabalho entretanto em processamento ao invocar indevidamente a função
CreateNewPopulationVector . Entre os valores enviados pelo cliente para
inicializar o vector, conta-se o limite de cálculos de fitness por cliente(m),
o tamanho da população(N ) e a pressão de selecção(s). Esta função de-
volve um inteiro (parâmetro de nome status-code) resultado especificando se
o vector população ”requisitado”foi inicializado correctamente (retorna 1),
se ocorreu algum erro durante esse processo (retorna 0), ou se o servidor já
estava ocupado a monitorizar algum trabalho nalgum vector entretanto já
iniciado.
4.4 Sumário
Vimos neste capı́tulo como foi possı́vel criar uma implementação usando Web
Services para fazer processamento distribuı́do do cGA. Após uma breve abor-
dagem da arquitectura proposta para a aplicação distribuı́da do cGA, vimos
CAPÍTULO 4. APLICAÇÃO DISTRIBUÍDA DO CGA USANDO WEB SERVICES 61
Resultados e análise
62
CAPÍTULO 5. RESULTADOS E ANÁLISE 63
Tt = Te + Tc
6.1 Conclusão
66
CAPÍTULO 6. CONCLUSÃO E TRABALHO FUTURO 67
Manual do WebservCGA
A.1 Introdução
69
APÊNDICE A. MANUAL DO WEBSERVCGA 70
1. instalar o Tomcat
Nada mais simples do que abrir o ficheiro zip. Isto irá descomprimir um
ficheiro principal, WSCGA.jar, que contém as classes principais do cliente, e
criar um directório de nome dep , que contém as bibliotecas necessárias à
execução do cliente. Será escusado dizer que é necessário ter instalada uma
máquina virtual Java, no mı́nimo na versão 1.5. O Ant também poderá ser
útil, para usar uns scripts que simplificam a tarefa de lançar o programa
sem estar a passar por escrever toda a linha de comandos. O script do Ant
encarrega-se de ir perguntando os dados necessários um a um.
APÊNDICE A. MANUAL DO WEBSERVCGA 72
A.4 Invocação
Como já ficou dito, o Axis deve ficar num subdirectório de webapps, sob o
nome wscga, de modo que o URL completo (considerando que o Tomcat usa
a porta 8080, por defeito) para aceder aos WS é http://nomedamaquina:
8080/wscga/services/webservcga . Para lançar o cliente faz-se:
>java -jar WSCGA.jar u=girafa:8080 t=2 m=800 N=100000 T=4
Isto irá lançar um cliente para correr duas threads que vão trabalhar
sobre um vector que representa uma população de 100 000 indivı́duos, sendo
que cada thread envia de volta um vector com as diferenças após terem sido
gerados 800 indivı́duos. Esta execução irá ser repetida ao todo 4 vezes (opção
T).
De notar que as letras que especificam cada uma das opções são separadas
dos seus respectivos valores por sinais de = . A tabela A.1 apresenta a lista
de opções possı́veis e seus respectivos valores. De assinalar que as opções refe-
ridas como ”permitindo valores múltiplos”executam repetidamente a mesma
tarefa mas com outros valores, separados entre : . Por exemplo, se se desejar
repetir o mesmo algoritmo, mas com outro valor de threads, pode-se usar a
seguinte linha de comando:
>java -jar WSCGA.jar u=girafa:8080 t=2:4:8 m=800 N=100000 T=4
no exemplo acima:
O programa informa toda uma série de resultados obtidos, desde o número
de cálculos de fitness (relembrar, é o parâmetro m) até o ao número de contac-
tos thread/servidor. Os dados antecedidos por um número e dois pontos di-
zem respeito dizem respeito a uma thread em particular. A thread assinalada
como o ”WINNER”foi a que despoletou o estado de convergência no servidor.
A partir daqui, o servidor não irá aceitar novos envios do vector população,
e assim cada thread termina o seu trabalho mostrando os dados recolhidos
durante a execução, aparecendo depois os dados globais. O programa cria
automaticamente ainda um subdirectório csv onde irá guardar todos os dados
recolhidos durante a execução em ficheiros .csv separados de acordo com o
tamanho da população utilizado (nome threadstatsx.csv), sendo x o efectivo
APÊNDICE A. MANUAL DO WEBSERVCGA 74
populacional utilizado , que são ficheiros de texto que usam um sı́mbolo para
delimitar dados diferentes contidos na mesma linha. Este formato é universal
em todas as folhas de cálculos e aplicações estatı́sticas, de modo que se possa a
proceder a uma análise. Para calcular médias dos dados recolhidos por pares
m/P, para depois traçar gráficos existem duas classes de Java que o permitem
fazer: ualg.wscga.util.CsvAverages (calcula médias e cria um novo fi-
cheiro de nome threadstatsx avg.csv) e ualg.wscga.util.CsvPlot que gera
ficheiros de dados prontos para serem processados pelo gnuplot separados
de acordo com o valor de m.
Apêndice B
WEBSERVCGA.WSDL
76
APÊNDICE B. WEBSERVCGA.WSDL 77
38 </xsd:element>
39 <xsd:element name="CreateNewPopulationVectorElement">
40 <xsd:complexType name="CreateNewPopulationVectorComplexType">
41 <xsd:sequence>
42 <xsd:element maxOccurs="1" minOccurs="1" name="popsize" type="xsd:int"/>
43 <xsd:element maxOccurs="1" minOccurs="1" name="m" type="xsd:int"/>
44 <xsd:element maxOccurs="1" minOccurs="1" name="s" type="xsd:int"/>
45 </xsd:sequence>
46 </xsd:complexType>
47 </xsd:element>
48 </xsd:schema>
49 </types>
50
51 <message name="CreateNewPopulationVectorRequest">
52 <part name="initData" element="wscga:CreateNewPopulationVectorElement"/>
53 </message>
54 <message name="CreateNewPopulationVectorResponse">
55 <part name="return_code" type="xsd:int" />
56 </message>
57
58 <message name="DownloadPopulationVectorRequest">
59 </message>
60 <message name="DownloadPopulationVectorResponse">
61 <part name="response" element="wscga:DownloadPopulationVectorElement"/>
62 </message>
63
64 <message name="SendPopulationVectorRequest">
65 <part name="newPopVect" element="wscga:IntArrayElement"/>
66 </message>
67 <message name="SendPopulationVectorResponse">
68 <part name="status_code" type="xsd:int"/>
69 </message>
70
71
72 <portType name="webservcga">
73 <operation name="CreateNewPopulationVector">
74 <input message="wscga:CreateNewPopulationVectorRequest"/>
75 <output message="wscga:CreateNewPopulationVectorResponse"/>
76 </operation>
77 <operation name="DownloadPopulationVector">
78 <input message="wscga:DownloadPopulationVectorRequest"/>
79 <output message="wscga:DownloadPopulationVectorResponse"/>
80 </operation>
81 <operation name="SendPopulationVector">
82 <input message="wscga:SendPopulationVectorRequest"/>
83 <output message="wscga:SendPopulationVectorResponse"/>
84 </operation>
85 </portType>
86 <binding name="webservcgaBinding" type="wscga:webservcga">
87 <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
88
89 <operation name="CreateNewPopulationVector">
90 <soap:operation
91 soapAction="http://viana:8080/wscga/services/webservcga/createNewPopulationVector" />
92 <input>
93 <soap:body
94 encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
95 use="literal"/>
96 </input>
97 <output>
98 <soap:body
99 encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
APÊNDICE B. WEBSERVCGA.WSDL 78
100 use="literal"/>
101 </output>
102 </operation>
103
104 <operation name="DownloadPopulationVector">
105 <soap:operation
106 soapAction="http://viana:8080/wscga/services/webservcga/downloadPopulationVector"/>
107 <input>
108 <soap:body
109 encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
110 parts=""
111 use="literal"/>
112 </input>
113 <output>
114 <soap:body
115 encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
116 parts="response"
117 use="literal"/>
118 </output>
119 </operation>
120
121 <operation name="SendPopulationVector">
122 <soap:operation
123 soapAction="http://viana:8080/wscga/services/webservcga/sendPopulationVector"/>
124 <input>
125 <soap:body
126 encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
127 use="literal"/>
128 </input>
129 <output>
130 <soap:body
131 encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
132 use="literal"/>
133 </output>
134 </operation>
135 </binding>
136 <service name="webservcga">
137 <port binding="wscga:webservcgaBinding" name="webservcga">
138 <soap:address location="http://viana:8080/wscga/services/webservcga"/>
139 </port>
140 </service>
141 </definitions>
Apêndice C
C.1 CGA.java
1 package ualg.wscga;
2
3 import ualg.wscga.util.Util;
4
5 /∗∗
6 ∗ Classe principal responsavel pela execucao do CGA. Entendeu−se implementar
7 ∗ como classe abstracta, devido ao facto de ser necessario formular um problema
8 ∗ que permitisse a demonstracao do funcionamento
9 ∗ @author Samuel Viana
10 ∗ aluno num. 18778
11 ∗
12 ∗ @since 14 Fev 2005
13 ∗ $Id: CGA.java,v 1.3 2005/11/28 16:40:37 sam Exp $
14 ∗/
15 abstract public class CGA {
16
17 // os valores destas variaveis sao inicializados pelas subclasses
18 /∗∗ comprimento do cromossoma (vector populacao) ∗/
19 protected int lchrom;
20 /∗∗ tamanho da populacao ∗/
21 protected int popsize;
22 /∗∗ pressao de seleccao ∗/
23 protected int s;
24 /∗∗ controla se mostra output para depuracao ou nao ∗/
25 boolean debug;
26 /∗∗ vector populacao∗/
27 protected PopVect pv;
28
29 /∗∗ numero maximo de calculos de fitness por ciclo
79
APÊNDICE C. CÓDIGO FONTE DO WEBSERVCGA 80
92 ∗ @param debug Variavel logica que representa se queremos ou nao que seja
93 ∗ mostrada informacao detalhada sobre o metodo durante a execucao
94 ∗ do algoritmo
95 ∗ @param max evaluations numero máximo de cálculos de fitness a serem executadas
96 ∗ antes de terminar, se for 0, apenas termina quando se verificar a convergência
97 ∗ @param pv vector população inicial, se for null, é gerado um novo de raı́z
98 ∗ @param threadName nome da thread que esta’ a correr o objecto da classe corrente, pode ser null
99 ∗ se nao estiverem a serem usadas treads
100 ∗/
101
102 public CGA(int lchrom, int popsize, int s, boolean debug, int max evaluations, PopVect pv,String threadName)
103 {
104 this.lchrom = lchrom;
105 this.popsize = popsize;
106 this.s = s;
107 this.debug = debug;
108 this.max evaluations = max evaluations;
109 this.pv = pv;
110 this.threadName = threadName;
111 }
112
113 /∗∗
114 ∗ construtor que invoca o principal e ignora se o algoritmo estar
115 ∗ a ser utilizado por uma thread
116 ∗/
117 public CGA(int lchrom, int popsize, int s, boolean debug, int max evaluations, PopVect pv)
118 {
119 this(lchrom,popsize,s,debug,max evaluations,pv,null);
120 }
121
122
123 /∗∗
124 ∗ construtor que invoca o anterior, inicializando o vector populacao
125 ∗ com valores de raı́z
126 ∗/
127 public CGA(int lchrom, int popsize, boolean debug, int max evaluations)
128 {
129 this(lchrom,popsize,2,debug,max evaluations,null);
130 }
131
132
133 /∗∗
134 ∗ construtor simplificado que inicializa o vector população
135 ∗ com valor de raı́z, sendo a pressão de selecção igual a 2, e
136 ∗ sem limitação no número de gerações
137 ∗/
138 public CGA(int lchrom, int popsize, boolean debug)
139 {
140 this(lchrom, popsize, 2, debug, 0, null);
141 }
142
143 public CGA(int lchrom, int popsize,int s)
144 {
145 this(lchrom,popsize,s,false);
146 }
147
148 /∗∗
149 ∗ Constructor que invoca o construtor principal, invocando apenas os
150 ∗ parametros lchrom e popsize. O parametro debug recebe por defeito
151 ∗ o valor false, para nao imprimir no ecra qq mensagens de depuracao
152 ∗ a pressao de selecção recebe por defeito o valor 2
153 ∗ @param lchrom comprimento do cromossoma (vector−populacao)
APÊNDICE C. CÓDIGO FONTE DO WEBSERVCGA 82
C.2 CGAmtrap.java
1 package ualg.wscga;
2
3 import java.io.PrintStream;
4
5 /∗∗
6 ∗ excepção gerada se o comprimento do cromossoma nao for um multiplo de k
7 ∗/
8 class ChromossomeSizeException extends Exception
9 {
10 public ChromossomeSizeException(String message) {
11 super(message);
12 }
13
14 }
15 /∗∗
16 ∗ Classe que implementa uma trap−functon multipla, por forma
17 ∗ a testar a eficiencia do CGA implementado
18 ∗ @author Samuel Viana
19 ∗ subclasse de CGA, implementa a função abstracta fitness
20 ∗/
21 public class CGAmtrap extends CGA {
22
23 /∗∗ numero de bits da funcao trap − caso simples igual
24 ao comprimento do cromossoma ∗/
25 int k = 3;
26 /∗∗ deceptive−to−optimal ratio ∗/
27 double d2or = 0.7;
28
29 public CGAmtrap(int lchrom, int popsize, int s, boolean debug,
30 int max generations, PopVect pv, String threadName) {
31 super(lchrom, popsize, s, debug, max generations, pv, threadName);
32 }
33
34 public CGAmtrap(int lchrom, int popsize, boolean debug,
35 int max generations, PopVect pv) {
36 this(lchrom, popsize, 2,debug, max generations, pv,null);
37 }
38
39 public CGAmtrap(int lchrom, int popsize, boolean debug, int max generations) {
40 super(lchrom, popsize, debug, max generations);
41 }
42
43 /∗∗
44 ∗ Construtor principal onde se especificam os principais
45 ∗ parâmetros
46 ∗ @param lchrom
47 ∗ @param popsize
48 ∗ @param s
49 ∗ @param debug
50 ∗ @throws ChromossomeSizeException para o caso do comprimento
51 do cromossoma nao for um multiplo de k
52 ∗ @see CGA
53 ∗/
54 public CGAmtrap(int lchrom, int popsize, int s, boolean debug)
55 throws ChromossomeSizeException
56 {
57 super(lchrom, popsize, s, debug);
58 if ((lchrom % k) != 0) throw new ChromossomeSizeException("lchrom=" +
59 lchrom + " should be a multiple of k=" + k);
APÊNDICE C. CÓDIGO FONTE DO WEBSERVCGA 85
60 }
61
62 public CGAmtrap(int lchrom,int popsize,boolean debug,int max eval,PopVect pv,String threadName)
63 throws ChromossomeSizeException
64 {
65 super(lchrom,popsize,2,debug,max eval,pv,threadName);
66 if ((lchrom % k) != 0) throw new
67 ChromossomeSizeException("lchrom=" + lchrom + " should be a multiple of k=" + k);
68 }
69 // CGAmtrap(lchrom,popsize, false,max evaluations,actualPv,this.getName());
70 public CGAmtrap(int lchrom, int popsize) throws Exception {
71 this(lchrom, popsize, 2,false);
72 }
73
74 public CGAmtrap() throws Exception {
75 this(30,100);
76 }
77
78
79 /∗∗
80 ∗ Implementação do fitness para a função de multiplas traps
81 ∗ concateandas
82 ∗ @param id o indivı́duo do qual se quer saber o fitness
83 ∗ @see CGA#fitness(Individual id)
84 ∗/
85 public Number fitness(Individual ind) {
86 double fit = 0;
87 int num blocks = ind.getChromLength() / k;
88 int [] chrom = ind.getChrom();
89
90 for (int i=0;i<num blocks;i++)
91 {
92 int [] block = new int[k];
93 System.arraycopy(chrom,k∗i,block,0,k);
94 fit += trap(block);
95 }
96
97 function evaluations++;
98
99 return new Double(fit);
100 }
101
102 /∗∗
103 ∗ calcula o valor do trap para um bloco particular
104 ∗ @param chrom bloco de k bitsdo cromossoma do qual
105 ∗ se quer saber o fitness
106 ∗/
107 private double trap(int [] chrom)
108 {
109 int oneMax = oneMax(chrom);
110 double fit;
111
112 if (oneMax == k) fit = 1.0;
113 else if (oneMax == k−1) fit = 0.0;
114 else fit = ((−d2or) / ((double) (k − 1 ))) ∗ (double) oneMax + d2or;
115 return fit;
116 }
117
118 /∗∗
119 ∗ calcula o one−max para um determinado bloco do cromossoma
120 ∗ @param chrom um bloco do cromossoma
121 ∗ @return o valor do one−max para o bloco
APÊNDICE C. CÓDIGO FONTE DO WEBSERVCGA 86
122 ∗/
123 private int oneMax(int [] chrom) {
124
125 int cont = 0;
126
127 for (int i=0; i<chrom.length; i++)
128 {
129 if (chrom[i] == 1) cont++;
130 }
131 return cont;
132 }
133
134 /∗∗
135 ∗ calcula o numero de ”building blocks” correctos
136 ∗ no fim de execução do CGA
137 ∗ @param ind o indivı́duo do qual se pretende calclar o numero de blocos
138 ∗ @return a quantidade de building blocks contabilizados
139 ∗/
140 public int correctBBS(Individual ind)
141 {
142 int numblocks = ind.getChromLength() / k;
143 int [] chrom = ind.getChrom();
144 int [] array de uns = new int[k];
145 int correctBBS = 0;
146
147 /∗ inicializa array de un’s para comparacao ∗/
148 java.util.Arrays.fill(array de uns,1);
149
150 for (int i=0; i<numblocks; i++)
151 {
152 int [] block = new int[k];
153 System.arraycopy(chrom,i∗k,block,0,k);
154 boolean arrays equal = java.util.Arrays.equals(block,array de uns);
155 if (arrays equal) correctBBS++;
156 }
157 return correctBBS;
158 }
159
160
161 }
APÊNDICE C. CÓDIGO FONTE DO WEBSERVCGA 87
C.3 CGATesterThread.java
1
2 package ualg.wscga.client;
3
4 import ualg.wscga.util.Util;
5 import ualg.wscga.wsdl.∗;
6 import ualg.wscga.CGA;
7 import ualg.wscga.CGAmtrap;
8 import ualg.wscga.PopVect;
9
10 public class CGATesterThread extends Thread {
11
12 static int thread number = 0;
13 static int total evaluations;
14 static int threads running = 0;
15 static int total communications = 0;
16 static long time calcs = 0;
17 static long time comms = 0;
18 int communication steps;
19 int function evaluations;
20
21 boolean debug;
22
23 public CGATesterThread(String name,boolean debug) {
24 super(name);
25 total evaluations = 0;
26 communication steps = 0;
27 this.function evaluations = 0;
28 this.communication steps = 0;
29 this.debug=debug;
30 thread number++;
31 }
32
33 public static void resetFunctionEvals()
34 {
35 total evaluations = 0;
36 }
37
38 public static void resetTotalCommunications()
39 {
40 total communications = 0;
41 }
42
43 public static void resetAllStatics()
44 {
45 total evaluations = 0;
46 total communications = 0;
47 time calcs = 0;
48 time comms = 0;
49 }
50 public CGATesterThread(String name)
51 {
52 this(name,false);
53 }
54
55 public static int getNumEvals()
56 {
57 return total evaluations;
58 }
59
APÊNDICE C. CÓDIGO FONTE DO WEBSERVCGA 88
184 }
Bibliografia
[2] Steve Graham. Building Web Services with Java. Developers’ Library.
Sams Publishing, 2nd edition, 2005.
[5] Carlos Jorge Lopes and José Carlos Ramalho. Web Services - Apli-
cacações Distribuı́das sobre Protocolos Internet. Lidel, 1st edition, 2005.
91