Conclusão

Anterior Volta Próxima

 

Início
Volta

Implementação

Para a implementação do programa destinado a verificar a teoria estudada, escolhemos a linguagem C, tendo sido utilizada a plataforma Borland C++Builder como ambiente de desenvolvimento, disponível em versão para Windows (Win32). Os programas, porém, foram escritos em ISO/ANSI C, sem utilização de nenhuma biblioteca específica ou include files (.h) particulares do sistema operacional Windows, e portanto sua compilação em outro sistema operacional e/ou com outro compilador não deve apresentar maiores problemas.

Os seguintes módulos fazem parte da implementação, e estão disponíveis para download na página dos Arquivos:

ccr.c unidade principal, contém main(), que recebe como entrada um arquivo com as dimensões da chapa e lista de peças (círculos) a serem distribuídos, e tem como saída um arquivo MetaPost (.mp) com a distribuição obtida e (opcionalmente) um arquivo ASCII (.ccr) com log de ações, decisões e a solução.
ch.c
ch.h
implementação da heurística construtiva (CH) e respectiva abordagem construtiva (CA). Como a abordagem construtiva também é utilizada pela heurística genética, a correspondente rotina está disponível na interface.
int CH (PChapa R, Pecas I, int N);
int CA (PChapa R, Pecas I, int N);
gabh.c
gabh.h
implementação da heurística baseada em algoritmo genético (GA-BH).
int GABH(PChapa R, Pecas I, int N);
struts.c
struts.h
estruturas de dados utilizadas (peças, chapa, etc.) e correspondentes rotinas auxiliares (alocação/desalocação de memória, ordenação [quicksort], etc.). Aqui, as duas estruturas mais importantes para o programa:
typedef struct MyChapa {
  double W,
         L;
  PPeca  first,
         last;
} Chapa;
typedef struct MyPeca {
  int    i;
  double r,
         c;
  Ponto  o;
  PPeca  next;
  PAdj   adj;
} Peca;

O tipo Chapa descreve o retângulo onde se irão encaixar as Peças (círculos), e contém também ponteiros para uma lista ligada das peças que de fato estão contidas na solução.

O tipo Peca contém as propriedades de cada círculo (raio, custo, coordenadas do seu centro), bem como um ponteiro para a próxima peça contida na solução (caso ela também faça parte da mesma), e uma lista ligada das peças adjacentes a ela, para efeitos do funcionamento da abordagem construtiva.

metapost.c
metapost.h
rotinas para geração de arquivos em formato MetaPost, utilizado para exibição do layout final obtido.
int GeraMetapost(char* arquivo, PChapa R, Pecas I, int N);
log.c
log.h
rotinas para geração do arquivo de log (.CCR) contendo uma descrição detalhada dos passos, decisões e resultados obtidos pelo programa.

O programa CCR tem a seguinte sintaxe:

ccr <arquivo-de-pecas> <opcoes>

    -hC: Heuristica Construtiva (default)
    -hG: Heuristica Genetica
    -d : Modo Debug (gera arquivo .CCR)

CA: Constructive Approach
CH: Constructive Heuristics

Vamos mostrar o funcionamento do programa e seu resultado através de um exemplo pequeno, descrito abaixo. Pode-se clicar nas figuras para ampliá-las, e todas estão disponíveis para download, juntamente com os arquivos auxiliares, em Resultados.

A figura ao lado reproduz a distribuição obtida após se aplicar o algoritmo em uma lista de 21 peças. De acordo com a heurística, uma boa ordenação inicial é obtida ordenando-se as mesmas em ordem decrescente da relação c/r (custo / raio), conforme explicado em CH. O algoritmo conseguiu encaixar um total de 16 peças, obtendo 93.07% de aproveitamento do custo.
A listagem abaixo mostra o resultado final para esta distribuição (as peças marcadas com um asterisco foram incúídas na chapa). Por questões de formatação desta página, foram omitidas as colunas correspondentes às coordenadas x e y da peça na chapa (o arquivo original se encontra em exemplo1.ccr):

Chapa R: 216.00(W) x 279.00(W)
Pecas P: 21
---------------------------------------------------------------------
    i                  raio                custo                  c/r
---------------------------------------------------------------------
*   6:        10.0000000000       130.0000000000        13.0000000000
*  11:        10.0000000000       130.0000000000        13.0000000000
*  16:        10.0000000000       130.0000000000        13.0000000000
*   1:        10.0000000000       130.0000000000        13.0000000000
*   7:        20.0000000000        65.0000000000         3.2500000000
*  17:        20.0000000000        65.0000000000         3.2500000000
*  12:        20.0000000000        65.0000000000         3.2500000000
*   2:        20.0000000000        65.0000000000         3.2500000000
*   4:        40.0000000000       110.0000000000         2.7500000000
*  14:        40.0000000000       110.0000000000         2.7500000000
*  19:        40.0000000000       110.0000000000         2.7500000000
*   9:        40.0000000000       110.0000000000         2.7500000000
*   8:        30.0000000000        40.0000000000         1.3333333333
*   3:        30.0000000000        40.0000000000         1.3333333333
*  18:        30.0000000000        40.0000000000         1.3333333333
   13:        30.0000000000        40.0000000000         1.3333333333
*   0:         5.0000000000         2.0000000000         0.4000000000
   20:        50.0000000000        15.0000000000         0.3000000000
    5:        50.0000000000        15.0000000000         0.3000000000
   15:        50.0000000000        15.0000000000         0.3000000000
   10:        50.0000000000        15.0000000000         0.3000000000
---------------------------------------------------------------------
Pecas Colocadas:         16
Custo Incluido :    1342.00 (93.07%)
Area Ocupada   :   34950.19 (58.00%)

O trecho abaixo dá idéia do comportamento do programa e as decisões que são tomadas quando de sua execução (novamente, o arquivo completo está na página de arquivos, em exemplo1.ccr):

----------
Peca: P6, raio      10.00
         Ponto: trivial    (     10.00,     10.00) - OK
----------
Peca: P11, raio      10.00
         Ponto: trivial    (     10.00,     10.00) - Bateu em P6
    1-Adjacencia : P6
         Ponto: superior   (     10.00,    -10.00) - Fora da Chapa
         Ponto: inferior   (     10.00,     30.00) - OK
         Ponto: esquerda   (    -10.00,     10.00) - Fora da Chapa
         Ponto: direita    (     30.00,     10.00) - OK
----------
Peca: P16, raio      10.00
         Ponto: trivial    (     10.00,     10.00) - Bateu em P6
    1-Adjacencia : P6
         Ponto: superior   (     10.00,    -10.00) - Fora da Chapa
         Ponto: inferior   (     10.00,     30.00) - OK
         Ponto: esquerda   (    -10.00,     10.00) - Fora da Chapa
         Ponto: direita    (     30.00,     10.00) - Bateu em P11
    1-Adjacencia : P11
         Ponto: superior   (     30.00,    -10.00) - Fora da Chapa
         Ponto: inferior   (     30.00,     30.00) - Mais Longe
         Ponto: esquerda   (     10.00,     10.00) - Bateu em P6
         Ponto: direita    (     50.00,     10.00) - Mais Longe
    2-Adjacencias: P6 e P11
         Ponto: lado 1     (     20.00,     -7.32) - Fora da Chapa
         Ponto: lado 2     (     20.00,     27.32) - Mais Longe
----------

Pode-se ver, acima, a análise dos três grupos de posição para cada peça que se coloca na chapa: a posição mais próxima de (0,0) (trivial), as 4 posições em torno de cada peça já presente na chapa (1-Adjacência: superior, inferior, esquerda, direita), e as duas posições relativas a cada par de peças presente na chapa (2-Adjacências: lado1, lado2).

 

Para se ter uma idéia do efeito da ordenação proposta pela heurística construtiva, veja-se o mesmo conjunto de peças, porém ordenado aleatoriamente e disposto na chapa mediante a mesma abordagem construtiva (ou seja, a única diferença para o exemplo anterior é a ordenação das peças). Neste exemplo, obtivemos o encaixe de 16 peças também, mas que resultaram em um aproveitamento de custo de 86.48%.
 

Um exemplo maior, com 240 peças de tamanhos próximos, pode ser visto ao lado. A taxa de aproveitamento do custo foi de 96.24% (com 78.98% de aproveitamento do espaço).
A imagem à esquerda reflete uma distribuição a partir do mesmo conjunto de peças anterior, mas sem avaliar as posições tangencias duas a duas (o terceiro critério da abordagem construtiva), para efeito de comparação - neste caso, o aproveitamento do custo foi de 94.76%.
 

GA-BH: Genetic Algorithm-based Heuristics

A implementação da heurística baseada em algoritmo genético não está validada, e seus resultados ainda estão por serem verificados para apresentação. Por este motivo, não se encontra aqui uma descrição mais detalhada neste momento. Em breve, publicaremos os resultados obtidos.

Volta para o Topo

 

Personal site: http://rubens.altimari.com.br
email: rubens@altimari.com.br
Atualizado em 28/02/2005