• Nenhum resultado encontrado

Nesta se¸c˜ao faremos uma revis˜ao da abordagem proposta por “Morabito, Arenales e Arcaro (1992)” [4] na qual foi usada a estrat´egia da cria¸c˜ao de um grafo And-Or, onde cada n´o representa um subproblema e cada aresta a rela¸c˜ao entre esses n´os. ´E poss´ıvel definir o problema como uma busca, especificando o n´o inicial, os n´os finais e as regras que definem os movimentos legais.

No Problema do Corte Bidimensional Guilhotinado a placa retangular de dimens˜oes (L,W ) ´e o n´o inicial, as pe¸cas menores de tamanho (li,wi) s˜ao os n´os finais e as arestas

representam os cortes de guilhotina que s˜ao definidos como os movimentos legais para obten¸c˜ao daquelas pe¸cas menores a partir de uma placa maior.

Em um grafo And-Or podemos representar a placa a ser cortada como um n´o pai, que pode ter mais de um corte guilhotinado feito em cima dela, e que ap´os aquele corte, sempre ser´a dividida em duas outras novas placas, que por sua vez ser´a feito a mesma coisa at´e que se encontre a pe¸ca desejada no problema com os cortes feito em cima da pe¸cas. Na figura 3.3 podemos ver n´os OU (OR), que s˜ao aqueles que a partir de uma placa, tem-se arestas de sa´ıdas que representam os cortes que podem ser feitos em cima daquela em cima daquela placa. Por exemplo: a placa “A” pode ter suas arestas de sa´ıda para “B” OU “C”, caso a aresta que leva a “B” seja escolhida, o corte que ser´a feito ser´a “b” ( vertical). Caso seja “C”, ser´a “c” (horizontal).

Figura 3.3: Exemplo de n´os OU - Grafo And-Or .

Na figura 3.4 podemos ver os n´os E (AND), que representam que sempre ap´os receber um corte guilhotinado, a placa ir´a se dividir em duas novas placas, que por sua vez poder´a ser feitos novos padr˜oes de cortes e que se repetira o processo at´e n˜ao poder ser mais dividida ou encontrar a pe¸ca desejada. Por exemplo : ao ser feito o corte guilhotinado “a” na placa “A” ela ser´a dividida em “B” E “C”, por isso suas arestas de saidas para as

duas. Do mesmo jeito o corte “c” dividi a placa em “D” e res´ıduo.

Figura 3.4: Exemplo de n´os E - Grafo And-Or .

Um subgrafo solu¸c˜ao atrav´es do grafo, do n´o inicial at´e os n´os finais, representam os padr˜oes de corte que devem ser feitos nas placas para obten¸c˜ao da solu¸c˜ao do problema. Abaixo na figura 3.5 podemos ver uma imagem ilustrativa onde a placa P ´e mostrada

no item (a), as pe¸cas que queremos obter no item (b) e as pe¸cas obtidas atrav´es do corte Guilhotinado ilustradas no item (c).

Figura 3.5: (a) Placa. (b) Pe¸cas. (c) Pe¸cas obtidas. .

Na figura 3.6 podemos ver o subgrafo solu¸c˜ao em vermelho onde encontramos a solu¸c˜ao para o problema obtendo as pe¸cas 3,4,5 e 7. Assim como no item (c) da figura 3.5.

Figura 3.6: Exemplo Grafo And-Or e o caminho com a solu¸c˜ao. .

Na abordagem de “Morabito, Arenales e Arcaro (1992)” [4] , os grafos And-Or na verdade s˜ao ´arvores que ilustram a ´arvore de recorrˆencia do algoritmo proposto. Assim sendo, ´e feito uma constru¸c˜ao implicita dessa ´arvore And-Or e ao mesmo tempo o pro- cedimento Top-Down proposto decide recursivamente se para um dado n´o, iniciando a partir de uma ra´ız que representa a placa P, “vale a pena”continuar na busca ou n˜ao. Os n´os que ser˜ao expandidos e continuar˜ao no processo s˜ao chamados de n´os abertos, j´a os n´os que n˜ao continuar˜ao no procedimento e, consequentemente os seus filhos tamb´em n˜ao ser˜ao, s˜ao chamados de n´os fechados.

Para cada n´o que representa uma placa Rpq(p,q) faremos um procedimento para

descobrir, se devemos consider´a-lo como n´o aberto ou fechado, isto ´e, ele e seus filhos devem continuar na busca ou n˜ao.

• Devemos descobrir um limite inferior referente a cada subplaca analisada, ou seja, a solu¸c˜ao ´otima para essa subplaca est´a acima desse limite encontrado. O limite inferior utilizado ´e obtido pela f´ormula abaixo:

δ(p,q) = max{π ∗ [p/li] ∗ [q/wi], i ∈ Rpq}

A f´ormula tem como o resultado o m´aximo de pe¸cas com maior valor utilit´ario de um mesmo tipo, que a placa (p,q) pode dar, pois ´e uma solu¸c˜ao vi´avel para Rpq.

Figura 3.7: Limite inferior na estrat´egia de Grafo And-Or para resolu¸c˜ao do Problema do Corte Bidimensional Guilhotinado.

O limite inferior de qualquer n´o (p,q) sempre ´e atualizado quando os n´os sucessores fornecerem melhores padr˜oes de corte, assim sendo, se δ(r,q) + δ(p − r,q) > δ(p,q), entao δ(p,q) ser´a substitu´ıdo por δ(r,q) + δ(p − r,q), ou seja, o limite inferior das duas novas placas obtidas por uma padr˜ao de corte.

• O limite superior referente ao n´o pode ser encontrado a partir do problema relaxado para Rpq. µ(p,q) = max X i∈Rpq πi∗ ai s.t. X i∈Rpq (li∗ wi) ∗ ai ≤ (p ∗ q) 0 ≤ ai, i ∈ Rpq.

Podemos notar pela f´ormula acima que todos os factiv´eis padr˜oes de cortes na placa (p,q) precisam seguir as restri¸c˜oes de que as pe¸cas cortadas precisam ser menor ou igual ao retˆangulo (p,q), esta condi¸c˜ao ´e imposta pelo inteiro ai que prov´em o limite superior

para o problema relaxado, ou seja, agora o espa¸co ´e unidimensional, as pe¸cas poderiam ser “dobradas”suas estruturas, e ainda sim poderiam caber em um espa¸co, que em duas dimens˜oes n˜ao conseguiriam. Consideram-se apenas o espa¸co que ela ocupa e n˜ao as dimens˜oes. Assim sendo o problema relaxado se torna o Problema da Mochila estudado no cap´ıtulo 2, sess˜ao 2.5.

Para cada n´o iriamos necessitar executar uma programa¸c˜ao linear na f´ormula des- crita acima, e descobrir o limite superior do mesmo. Mas como podem existir milhares de n´os a serem examinadas e rodar uma programa¸c˜ao linear em cada uma delas teria um alto custo, ´e adotada uma solu¸c˜ao mais relaxada do problema, onde agora o problema permite n´umeros reais, isto ´e, n˜ao existe mais o inteiro ai que restringe o problema a

pe¸cas inteiras.

Assim, atrav´es da formula abaixo podemos obter o limite superior desejado.

Como podemos ver na f´ormula acima, p ∗ q ∗ (πi/li ∗ wi) = (p ∗ q/li ∗ wi) ∗ πi,

onde podemos inferir que agora como o problema aceita n´umeros reais, o resultado ser´a o m´aximo de pe¸cas com maior valor utilit´ario de um mesmo tipo poss´ıvel assim como no limite inferior. A diferen¸ca entre os dois, ´e que agora podemos considerar a menor parte de lucro por unidade de ar´ea da pe¸ca que tiver o maior valor utilit´ario em πi/li∗ wi.

Assim, no caso onde o corte teria res´ıduo, agora ser´a preenchido com esse valor unit´ario j´a que no problema relaxado aceitam-se n´umeros reais.

• Agora que possu´ımos o limite inferior e limite superior podemos verificar se um ramo do grafo pode ser descartado, ou seja, um n´o ir´a se tornar fechado. Assim sendo, se µ(r,q) + µ(p − r,q) ≤ δ(p,q) ?, ent˜ao o corte em r pode ser descartado sem perder a solu¸c˜ao ´otima, uma vez que o melhor padr˜ao para os n´os (r,q) e (p − r,q) n˜ao podem ser melhor do que j´a sabemos para (p,q).

Figura 3.8: Verifica¸c˜ao de corte na estrat´egia de Grafo And-Or para resolu¸c˜ao do Problema do Corte Bidimensional Guilhotinado.

Cap´ıtulo 4

Um algoritmo pseudo-polinomial

Nesta se¸c˜ao iremos apresentar a principal contribui¸c˜ao deste trabalho, isto ´e, um novo algoritmo para o problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhotinados em Placas cujo tempo de execu¸c˜ao ´e pseudo-polinomial com rela¸c˜ao ao tamanho da entrada. Na solu¸c˜ao proposta por esta monografia para o problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhotinados em Placas, iremos considerar assim como no problema estudado no cap´ıtulo anterior, que o valor utilidade de cada objeto pi ´e igual a ´area do objeto, ou

seja, devemos maximizar o valor utilidade ou minimizar o desperd´ıcio de material. Para o estudo e solu¸c˜ao do problema, iremos considerar a constru¸c˜ao de um grafo And-Or ac´ıclico dirigido, isto ´e, suas arestas tem dire¸c˜ao e n˜ao formam ciclos direcionados no grafo. A constru¸c˜ao ser´a usada para melhor visualiza¸c˜ao do problema e entendimento do algoritmo proposto.

Primeiramente, a partir da placa inicial (L,W ), iremos gerar os v´ertices do grafo, fazendo o produto cartesiano entre os intervalos fechados [1,L] e [1,W ]. Assim os v´ertices do grafo representar˜ao elementos do produto cartesiano de [1,L] e [1,W ]. Assim temos o conjunto de todos os pares ordenados para os vertices que s˜ao as representa¸c˜oes das pe¸cas (li,wi) que podemos obter atrav´es de um padr˜ao de corte em (L,W ).

Iremos considerar a seguinte regra para reduzir o n´umero de pe¸cas/v´ertices do problema: pe¸cas iguais mas com as dimens˜oes invertidas, s˜ao consideradas a mesma pe¸ca, por exemplo p1 = (1,2) e p2 = (2,1) ser˜ao representadas por um ´unico n´o. Tal regra ´e

segura pois para obtermos a pe¸ca desejada no mundo real, bastaria rotacion´a-la. Assim temos.

As arestas s˜ao as representa¸c˜oes dos cortes de uma pe¸ca, onde a dire¸c˜ao da aresta significa que a partir de uma pe¸ca obtemos a outra. Por exemplo: p1 = (3,2) → p2 = (2,2)

representa que a partir da pe¸ca 1, fazendo um corte vertical, obtemos a pe¸ca 2. Caso uma pe¸ca se divida em duas de dimens˜oes iguais, teremos duas arestas de sa´ıda de um v´ertice para o outro. Veja na Figura 4.1.

(a) Corte que resulta em duas pe¸cas diferentes

(b) Corte que resulta em duas pe¸cas iguais

Figura 4.1: Exemplo da transforma¸c˜ao do problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhotinados em Placas para grafo: em (a) podemos ver um v´ertice 3,2 tendo duas arestas de sa´ıdas apontando para outros dois v´ertices (2,2) e (1,2) que equivale ao padr˜ao de corte ao seu lado , em (b) podemos ver um v´ertice (4,4) tendo duas arestas de sa´ıda apontando para o v´ertice (2,2) que equivale ao padr˜ao de corte ao seu lado.

As arestas ser˜ao geradas a partir das seguintes regras: Defini¸c˜ao 5. Se (li,wi) n˜ao ´e uma das pe¸cas que queremos obter:

E se (li = lj E wi > wj) OU (li > lj E wi = wj):

As regras acimas levam em considera¸c˜ao que se o v´ertice j´a ´e uma das pe¸cas que queremos obter, n˜ao ´e necess´ario criar uma aresta de sa´ıda a partir deste, uma vez que ela j´a ´e o que estamos buscando e se fizermos mais cortes n˜ao haveria ganho nenhum pois sua ´area j´a ´e a desejada e seu valor utilidade n˜ao ir´a aumentar se houver mais cortes. As arestas s´o s˜ao geradas a partir de uma pe¸ca maior em dire¸c˜ao a uma pe¸ca menor, mantendo sempre uma dimens˜ao da mesma, pois s´o podem ser feito um corte guilhotinado por vez, sendo ele vertical ou horizontal.

Uma considera¸c˜ao importante ´e o caso em que a pe¸ca obtida por um corte, quebra a regra li ≥ wi∀ pi. Caso isso aconte¸ca, basta fazer a invers˜ao da pe¸ca, deixando impl´ıcito

que houve um rotacionamento na dimens˜ao da pe¸ca.

Figura 4.2: Exemplo de transforma¸c˜ao impl´ıcita do problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhotinados em Placas para grafo.

.

Uma vez obtido o grafo com as regras acima, podemos perceber que todo o al- goritmo e regras criadas apenas estruturam v´ertices do tipo Or , mas para a solu¸c˜ao do problema precisaremos da cria¸c˜ao de v´ertices And, mesmo que na estrutura j´a criada os v´ertices And estejam implicitamente estruturado.

Os v´ertices And em nosso contexto devem representar pares de placas que s˜ao geradas a partir de um ´unico corte. Assim sendo, para se criar todos os v´ertices And usaremos os v´ertices que j´a foram criados. Podemos seguir os passos abaixo para todos os n´os do grafo:

Passo 1 - Dado um n´o “v” verificamos cada aresta de entrada “e” que chega neste v´ertice.

Passo 2 - A partir desta aresta “e”, descobrimos a pe¸ca pai que gerou “v”.

Passo 3 - A partir da pe¸ca pai, descobrimos a pe¸ca complementar da pe¸ca “e”, denominado “e2”.

Passo 4 - Criar um n´o com os mesmos atributos que o n´o pai, com arestas de sa´ıda apontando para as sa´ıdas de “e”,“e2”. E uma aresta de entrada vindo do antigo n´o pai.

Passo 5 - Remover as arestas “e”,“e2”. Podemos ver um exemplo na Figura 4.3:

Figura 4.3: Exemplo de transforma¸c˜ao para grafo And-Or do problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhotinados em Placas.

.

Neste ponto, cada padr˜ao de corte poss´ıvel de ser obtido para P pode ser visualizado no grafo And-Or constru´ıdo como um subgrafo, denotado como subgrafo solu¸c˜ao, definido da seguinte forma:

• O v´ertice representando (L,W ) pertence ao subgrafo;

• Um v´ertice Or que pertence ao subgrafo possui exatamente 1 aresta de sa´ıda neste subgrafo.

• Um v´ertice And que pertence ao subgrafo possui todas suas arestas de sa´ıda neste subgrafo.

Desta forma, para solucionar o problema devemos achar o melhor subgrafo solu¸c˜ao, isto ´e, o subgrafo que representa o padr˜ao de corte que maximiza o valor utilidade.

Nosso algoritmo primeiramente ir´a gerar uma ordena¸c˜ao topol´ogica dos v´ertices do grafo And-Or criado.

Uma ordena¸c˜ao topol´ogica consiste em ordenar os v´ertices de um grafo ac´ıclico dirigido G=(V,E) de forma que, se existe um caminho do v´ertice v para o v´ertice u, ent˜ao v aparece antes de u na ordena¸c˜ao [19].

Figura 4.4: Exemplo de Ordena¸c˜ao Topol´ogica .

Para exemplificar e ilustrar o passo a passo do nosso algoritmo, escolhemos uma placa inicial (3,3) e queremos obter o melhor padr˜ao de corte que maximize o valor utili- dade das pe¸cas que desejamos obter, sendo elas p1 = (2,1) e p2 = (3,1). Na Figura 4.5,

podemos ver a estrutura do grafo preliminar montado, sem os n´os AND. A Figura 4.6 ilustra o grafo And-Or completo.

Figura 4.5: Exemplo de uma placa 3x3 para um grafo -problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhotinados em Placas.

.

Assim sendo, a partir do grafo And-Or criado na Figura 4.6 faremos uma ordena¸c˜ao topol´ogica. Assumiremos uma ordena¸c˜ao dos v´ertices de forma decrescente com rela¸c˜ao a ´area das placas que representam. Podemos ver na Figura 4.7 o grafo ordenado, onde representamos em cada n´o a sua largura, altura, ´area, e o tipo de n´o ( And ou Or) como atributos, acima de cada representa¸c˜ao.

O algoritmo ´e do tipo bottom-up, onde para todo n´o ( a partir do primeiro n´o da ordena¸c˜ao at´e o ´ultimo, em ordem crescente), devemos calcular o valor utilidade do n´o corrente a partir dos valores dos n´os filhos.

Figura 4.6: Exemplo de uma placa 3x3 para um grafo And-Or -problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhotinados em Placas.

. Segue abaixo o algoritmo:

A l g o r i t m o bottom−up ( n´os do grafo ) {

Para todo n´o, ordenados de forma crescente em rela¸c˜ao `a area fa¸ca{ Crie uma variavel auxiliar contador

(contabilizar´a a melhor ´area/utilidade acumulada para o n´o corrente)

Se o n´o n˜ao tiver arestas de sa´ıda {

auxiliar = ´area / utilidade do n´o corrente } Sen˜ao{

Cada aresta de sa´ıda do n´o levar´a a algum n´o que

j´a teve sua vari´avel auxiliar j´a calculada. Logosome os valores de todas as vari´aveis auxiliares desses n´os, e atribua

essa soma a vari´avel auxiliar do n´o corrente. }

Se o n´o for do tipo Or {

Cada aresta de sa´ıda do n´o que levar´a a algum n´o que j´a teve sua vari´avel auxiliar calculada, atribua o maior valor dentre as vari´aveis auxiliares

`

a variavel auxiliar do n´o corrente. }

} } }

Figura 4.7: Exemplo de uma placa 3x3 para um grafo And-Or ordenado topol´ogicamente -problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhotinados em Placas.

.

Figura 4.8: Passo 1 - Algoritmo -problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhotinados em Placas.

.

Figura 4.9: Passo 2 - Algoritmo -problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhotinados em Placas.

Figura 4.10: Passo 3 - Algoritmo -problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhoti- nados em Placas.

.

Figura 4.11: Passo 4 - Algoritmo -problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhoti- nados em Placas.

Figura 4.12: Passo 5 - Algoritmo -problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhoti- nados em Placas.

Figura 4.13: Passo 6 - Algoritmo -problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhoti- nados em Placas.

.

Figura 4.14: Passo 7 - Algoritmo -problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhoti- nados em Placas.

Figura 4.15: Passo 8 - Algoritmo -problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhoti- nados em Placas.

.

Figura 4.16: Passo 9 - Algoritmo -problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhoti- nados em Placas.

.

Para descobrir o subgrafo solu¸c˜ao que produz a melhor solu¸c˜ao (padr˜ao de corte), basta marcar quais n´os (valor da vari´avel auxiliar) foram escolhido atrav´es da escolha do maior valor para descobrir o valor de cada n´o OR. Assim, ap´os o algoritmo ter sido feito, teremos nos marcadores quais os n´os devemos seguir e qual ´e o subgrafo solu¸c˜ao (padr˜ao de corte) da placa P = (L,W )

Figura 4.17: Subgrafo Solu¸c˜ao - Algoritmo -problema de Gera¸c˜ao de Padr˜oes de Cortes Guilhotinados em Placas.

.

4.1

Prova do algoritmo Pseudo-Polinomial

4.1.1

O tempo de execu¸c˜ao do algoritmo

A partir de um grafo And-Or G com n v´ertices e m arestas, nosso algoritmo efetua O(n + m) passos, isto ´e, n´umero linear de passos com rela¸c˜ao ao n´umero de v´ertices e arestas do grafo G que constru´ımos.

Para verficar tal afirma¸c˜ao basta observar que uma ordena¸c˜ao topol´ogica pode ser constru´ıda em tempo O(n + m) [20]. Al´em disso, no algoritmo bottom-up criado no presente trabalho, percorremos todos os n´os do grafo de acordo com a ordem topol´ogica dada, visitando suas arestas de entrada (cada aresta de G ´e visitada exatamente uma vez), calculando assim os pesos de cada v´ertice. Dessa forma podemos concluir que o algoritmo possui complexidade O(n + m), pois para cada n´o, devemos percorrer todas arestas que chegam nele e fazer opera¸c˜oes constantes, como saber o m´aximo (Or) ou fazer a soma dos pesos das arestas (And), para assim podermos passar para o pr´oximo n´o que est´a ordenado topologicamente.

Logo, temos

|V (G)|

X

i=1

(dv−+ 1) = m + n.

4.1.2

O tempo de execu¸c˜ao da cria¸c˜ao do grafo

Dado o grafo And-Or G, o tempo de execu¸c˜ao do nosso algoritmo ´e linear com rela- ¸c˜ao ao n´umero de v´ertices e arestas de G. Sendo assim, devemos verificar o algoritmo para constru¸c˜ao de G e seu tempo de execu¸c˜ao. Dado uma placa inicial (L,W ) primeiramente criamos os n´os Or da seguinte forma:

A l g o r i t m o cria¸c˜ao n´o s Or ( L,W ) { Para i:=1 at´e L fa¸ca{

Para j:=i at´e W fa¸ca{ cria o n´o (i,j) }

} }

Assim temos que o procedimento acima demanda tempo O (L x W) e produz O (L x W) v´ertices Or. Ap´os a cria¸c˜ao dos n´os Or, iremos criar os n´os And e as arestas do grafo conforme o algoritmo abaixo (a Figura 4.18 ilustra a cria¸c˜ao):

A l g o r i t m o cria¸c˜ao dos And e das arestas ( n´os do grafo ) { Para cada n´o v (i,j) que n˜ao ´e uma pe¸ca final desejada fa¸ca{

Para l:=1 at´e bj2c fa¸ca{

cria um n´o al representando o corte [i:l , i:(j-l)];

cria uma aresta de v para al;

cria uma aresta de al para os n´os que representam (i,l) e (i,j-l);

}

Para k:=1 at´e b2icfa¸ca{

cria um n´o bk representando o corte [(i-k):j , k:j];

cria uma aresta de v para bk;

cria uma aresta de bk para os n´os que representam (k,j) e (i-k,j);

} } }

Como podemos observar o tempo de execu¸c˜ao da segunda etapa do algoritmo possui rela¸c˜ao direta com o n´umero de n´os And que ele ir´a criar, pois para cada n´o And

Figura 4.18: Cria¸c˜ao do grafo And-Or - Etapa de cria¸c˜ao dos n´os And e arestas. .

criado ´e efetuado um n´umero constante de opera¸c˜oes como cria¸c˜ao de arestas e v´ertices. Logo conclu´ımos que essa etapa de cria¸c˜ao possui tempo linear com rela¸c˜ao ao n´umero de vertices And criados.

Documentos relacionados