Você está na página 1de 32

Simulação modular

sequencial
• Estrutura geral de um programa de simulação:
Um programa executivo que se comunica com o usuário permitindo a
entrada dos dados desejados e emite um relatório com os resultados
da simulação;
Deve ser dotado de subprogramas (módulos);

• Tipos de módulos (subprogramas):


i) módulos que incluem os modelos de cada uma das operações
unitárias;
ii) biblioteca de dados físicos e termodinâmicos com programas que
permitem estimar propriedades;
iii) módulos para o dimensionamento de cada um dos equipamentos e
seus custos;
iv) módulos de otimização.
Características da estrutura modular de programação:

• Permite estabelecer subprogramas (programas para cada uma das


operações unitárias) sólidos;
• Subprogramas capazes de comprovar as condições utilizadas,
selecionar os algoritmos de cálculo mais adequados para uma
convergência rápida e estabilidade da solução;
• Permite a atualização de forma simples para os subprogramas dentro
dos blocos do programa;
• Às vezes emprega métodos de cálculo rígidos, o que pode levar a
iterações desnecessárias;
Problemas de grande escala: estratégia de decomposição
• Processos industriais reais: grande quantidade de operações unitárias
interligadas entre si por meio de correntes de processo;
• Estratégia: decompor o problema em subproblemas mais fáceis de
manejar.
• Análise de processos: uso de gráficos e matrizes;
• Grafo: coleção de vértices (nós, pontos, elementos ou subsistemas)
unidos entre si por linhas (arestas, bordas);
Exemplo de um grafo
• Dois vértices são adjacentes se existe uma linha que os une;
• O grau (valência) do vértice é dado pelo número de linhas que a ele
chegam;
• Grafo completo: tem seus vértices conectados com todos os demais
exatamente uma vez. O grau de um grafo completo é n-1, sendo n o
número de vértices;
• Caminho (path): sequência de arestas adjacentes entre dois vértices.
O comprimento do caminho é o número de arestas percorridas nesse
caminho;
• Ciclo (loop, laço): caminho que termina na mesma aresta em que se
inicia;
• Grafo conectado: existe ao menos um caminho conectando cada par
de vértices (existe ao menos um caminho que permite ir de um
vértice a outro).
• Dígrafo: grafo dirigido (as relações entre os vértices – arestas- estão
dirigidas). Saem de um vértice e se dirigem a outro.

Exemplo de um dígrafo
• Diferente dos grafos, os dígrafos têm arestas que saem de um vértice
e arestas que chegam a um vértice;
• Grau de entrada de um vértice: número de arestas que chegam a ele;
• Grau de saída de um vértice: número de arestas que saem dele;
• dE(vj): grau de entrada do vértice j;
• dS(vj): grau de saída do vértice j;
• deve valer a seguinte relação:
• No caso da figura:
• Dígrafo assimétrico completo: existe exatamente uma aresta entre
cada par de vértices;
• Dígrafo simétrico completo: cada par de vértices está conectado por
um par de arestas de direções opostas;
• Caminho dirigido: sequência de arestas adjacentes entre dois vértices
que seguem a direção marcada pelas arestas;
• Circuito (loop, ciclo) dirigido: sequência de arestas adjacentes que
iniciam e terminam no mesmo vértice;
• Dígrafo fortemente conectado: se para dois vértices quaisquer do
dígrafo existe pelo menos um caminho dirigido que une o primeiro
vértice ao segundo;
• Componente forte (rede cíclica máxima): máximo (maior ou com mais
vértices) sub-grafos fortemente conectados em um dígrafo;
• Condensação: operação que permite unir em um único vértice um ou
mais subconjuntos de vértices fortemente conectados de um dígrafo:
Representação matricial de dígrafos
• No caso de pequenos grafos a representação gráfica pode ser
conveniente;
• Para problemas grandes é mais conveniente a representação
matricial;
• Os cálculos com matrizes estão bem estabelecidos na literatura;
• Uma vez estabelecidas as propriedades entre grafos e matrizes pode-
se utilizar o cálculo linear para analisar os dígrafos;
Matriz de relação (matriz booleana de
relação ou matriz de adjacências)
• Forma conveniente e extremamente útil para representar um dígrafo;
• Os vértices são representados tanto por linhas como por colunas;
• Cada entrada (i,j) da matriz indica a existência de um arco (aresta) que sai
do nó i para chegar ao nó j;
• Características da matriz de adjacências:
i) os auto-laços são representados como elementos na diagonal principal;
ii) arestas em paralelo dentro do dígrafo não podem ser representadas;
iii) o número de elementos diferentes de zero em uma coluna
indica o grau de entrada de um determinado vértice;
iv) o número de elementos diferentes de zero em uma linha indica
o grau de saída de um determinado vértice;
v) o número de arestas do dígrafo é igual ao número de elementos
diferentes de zero na matriz;
vi) a matriz booleana de relação (matriz de adjacências) é uma
matriz quadrada.
Exemplo de uma matriz booleana de relação associada a um dígrafo:

Sequência, na matriz de adjacências, partindo do vértice i e indo até o


vértice j, mostrando as entradas (quando o elemento na matriz é 1).
• Propriedade interessante das matrizes booleanas de relação:
Tomando a potência de grau n da matriz de relação denominada R, se o
elemento da matriz rij for igual a 1, então existe um caminho de n
etapas entre i e j.
As potências da matriz de relação são obtidas pelas regras normais de
multiplicação de matrizes.
Porém, a soma e a multiplicação dos elementos individuais é feita
utilizando-se a álgebra Booleana.
Regras da álgebra de Boole:

Ex.:
• Para o exemplo da matriz booleana de relação do dígrafo anterior, a
segunda potência de R é:

Portanto, o único caminho em duas etapas é do vértice 1 para o vértice 4.


A matriz R3 é nula.
• A matriz de adjacências indica quando há redes cíclicas ou ciclos
dirigidos:

Um dígrafo que não contém ciclos é dito acíclico. Então, existe um número
N que corresponde ao caminho mais longo dentro do grafo, tal que:
RN+m = 0, sendo ! ≥ 1 .
• Como cada vértice de um ciclo pode ser alcançado a partir dele
mesmo, na diagonal principal da matriz Rnp aparecem elementos
iguais a 1, sendo n o comprimento do ciclo e p um número inteiro.
• No caso da figura anterior, a matriz R2 indica que o elemento 2 pode
ser alcançado em duas etapas a partir dele mesmo. O mesmo vale
para o elemento 3.
• Tomando a soma booleana de todas as potências de R, até a potência
n, (incluindo n), obtém-se uma matriz que representa todos os
caminhos de comprimento n ou inferior a n em dois vértices.
• À medida que n aumenta a soma booleana de matrizes leva
finalmente a uma matriz que não varia quando n aumenta.
• Esta matriz recebe o nome de matriz de alcançabilidade R* pois indica
que um elemento rij =1 indica que o vértice j pode ser alcançado a
partir do vértice i por algum caminho.
• Propriedade importante da matriz de alcançabilidade:
A intersecção lógica de R* e sua transposta R*T mostra na linha i todos
os vértices que se encontram no mesmo laço fechado com o vértice i.
No caso do exemplo anterior:
Algoritmo de particionamento
Procedimento de cálculo que permite decompor o sistema em um
subconjunto de unidades interconectadas entre si, de maneira que, se
agrupadas em uma única unidade, o sistema é acíclico.
Dado um fluxograma na forma de um dígrafo em que os nós fazem
referência às diferentes operações unitárias e as arestas fazem
referência a fluxos de informação, pode-se determinar a ordem de
cálculo se o sistema é acíclico.
Se o sistema possuir um ou mais ciclos estes ciclos precisam ser
identificados antes de determinar a ordem de cálculo.
O método matricial apresentado anteriormente é uma alternativa para
a identificação dos ciclos e determinação da ordem de cálculo. Porém,
à medida que o número de nós aumenta, aumenta também a
complexidade em resolver o problema.
Algoritmo de decomposição de Tarjan
• Baseia-se em traçar caminhos no dígrafo associado à matriz e
identificar os ciclos;
• Utiliza uma pilha de nós visitados, que é construída usando a técnica
de busca em profundidade (depth-first search);
• Armazena tanto o caminho atual como todos os ciclos fechados que
tenham sido identificados no caminho;
• Cada ciclo aparece como um grupo de nós na parte superior da pilha;
• Quando um ciclo máximo é identificado, ele é removido da pilha;
• Exemplo:

Passo 1 2 3 4 5 6 7 8 9 10 11 12 13
73 7 7 7 7
64 64 63 6 6 6
5 5 5 5 53 5 5
Pilha 4 4 4 4 4 4 43 4
3 3 3 3 3 3 3 3 3
2 2 2 2 2 2 2 2 2 2 2
1 1 1 1 1 1 1 1 1 1 1 1 1
• Inicia-se traçando um caminho na direção das setas, passo a passo;
• Nos seis primeiros passos vai-se registrando os diferentes nós do
caminho;
• No passo 6 se detecta a presença de um arco que une o nó 6 ao nó 4;
• Registra-se este fato introduzindo um sub-índice no caminho 6 com o
nó 4: 64;
• Sabendo-se que existe um ciclo entre 4, 5 e 6, segue-se adiante, sem
eliminar nem apagar nada;
• O passo 7 se vincula ao nó 3, com outro sub-índice: 73;
• Detecta-se outro ciclo: 3,4, 5, 6, 7;
• Como do nó 7 não saem novos arcos, elimina-se o nó 7 do caminho.
Como faz parte de um ciclo, não é eliminado fisicamente, mas
marcado em negrito;
• Em seguida, estuda-se o nó 6, que agora é o último do caminho,
imediatamente abaixo do 7. Atribui-se o vínculo de 7 com 3 ao 6: 63;
• Verifica-se se existe algum arco que saia do nó 6 e não tenha sido
levado em consideração. Como não existe, elimina-se o nó 6
(negrito);
• Estuda-se o nó 5 e, faz-se o vínculo de 5 com 3;
• Similarmente, estuda-se o nó 4 e faz-se o vínculo de 4 com 3, e
elimina-se o nó 5;
• Agora, além de eliminar o nó 4, desvincula-se de 3;
• Elimina-se o nó 3, o 2 e, finalmente o nó 1.
Exemplo:
Passo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

87 87 87 8

7 7 7 7 77

Pilha 61 61 61 61 61 61 61 6 6

51 5 5 5 5 5 5 5 5 5 5 5

42 42 41 4 4 4 4 4 4 4 4 4 4

2 2 2 2 21 21 21 21 21 21 21 21 21 2

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3
• Inicia-se pelo nó 1, indo em direção ao nó 2;
• No nó 2 há duas alternativas, ir para o nó 4 ou para o 6. O resultado
final deve ser o mesmo, independente da escolha. Decisão: ir ao nó 4;
• O nó 4 tem um vínculo com o nó 2 (sub-índice);
• Do nó 4 vai-se ao nó 5, que tem vínculo com o nó 1 (sub-índice);
• O nó 5 não tem outros caminhos a seguir, a não ser o próprio laço.
Então, o nó 5 deve sair da análise (fica em negrito);
• Como o nó 5 não tem outros caminhos, retrocede-se ao nó 4 e o
vínculo do nó 5 com o nó 1 é transferido ao nó 4 (sub-índice);
• O nó 4 não tem caminhos adicionais e deve-se retroceder ao nó 2 e
transfere-se o vínculo com o nó 1 ao nó 2 (sub-índice) e o nó 4 fica
em negrito;
• Do nó 2, ainda há um caminho não explorado, que é o nó 6;
• O nó 6 tem dois vínculos, com os nós 5 e 1. Marca-se apenas o vínculo com
o valor mais baixo na pilha (no caso, o nó 1, que vai ficar como sub-índice);
• O nó 5 não tem caminhos adicionais e deve ser eliminado do laço (passa a
negrito);
• No próximo passo adiciona-se o nó 7 à pilha, devido ao caminho não
explorado entre os nós 6 e 7;
• Em seguida, coloca-se o nó 8, caminho de 7 a 8. o nó 8 tem um vínculo com
o nó 7 (sub-índice);
• Do nó 8 vai-se ao nó 9 (passo 10). O nó 9 não tem mais caminhos nem
vínculos com outros nós. Então, elimina-se o nó 9 (passo 11);
• O nó 8 não tem caminhos não visitados e deve ser eliminado do caminho
mas não da pilha, devido ao seu vínculo com o nó 7. Por isso, fica em
negrito;
• Agora, o nó 7 tem um vínculo consigo mesmo (passo 12);
• Como o nó 7 não tem caminhos adicionais não explorados e não tem
vínculos com nós abaixo na pilha, comprova-se a existência de um ciclo
entre os nós 7 e 8;
• No passo 13, esses nós são eliminados da pilha e retrocede-se ao nó 6, que
não possui caminhos inexplorados e, portanto, deve ser eliminado do
caminho mas não da pilha, devido ao seu vínculo com o nó 1.
• No passo 14, o nó 6 passa a ser escrito em negrito e seu vínculo é
transferido ao nó inferior na pilha (nó 2). O nó 2 já tem vínculo com o nó 1.
Portanto, já está colocado na pilha.
• No passo 15 retrocede-se ao nó 1. Como o nó 2 não tem caminhos
adicionais, é eliminado do caminho (negrito) mas não da pilha, devido ao
vínculo com o nó 1. Neste ponto, identifica-se um ciclo entre os nós 1-2-4-
5-6;
• Depois do passo 15, a pilha está vazia. Porém, ainda há o nó 3, que não foi
visitado. Como ele não possui vínculo com outros nós nem há caminhos
adicionais a seguir. Assim, o algoritmo deve terminar.
• Algoritmo de Tarjan: busca-se o caminho seguinte (aresta)
inexplorado que leve a outro nó e deve-se considerar:
i) O caminho leva a um novo nó que não está na pilha. Neste caso o
novo nó deve ser incorporado à pilha e designa-se a ele um vínculo
consigo mesmo, que não precisa ser indicado na tabela;
ii) O caminho leva a um nó situado mais abaixo na pilha que o nó de
partida. Neste caso o vínculo do nó de partida é substituído (se não
há nenhum vínculo, se supões um vínculo consigo mesmo) pelo nó
mais abaixo na pilha;
iii) Se o caminho leva a um nó mais acima na pilha, marca-se este nó
como visitado e não é necessário nenhuma outra ação;
iv) Se o nó atual não tem caminhos inexplorados e tem algum vínculo
com um nó situado abaixo na pilha, deve-se eliminar o nó do caminho
mas não da pilha e seu vínculo deve ser transferido ao nó
imediatamente inferior, que vai manter só o vínculo com o nó que
ocupe posição mais abaixo na pilha;
v) Se o nó atual não possui caminhos inexplorados e não há vínculos
com outros nós além de si mesmo, um ciclo foi encontrado. Neste caso
o nó atual e todos os nós situados acima dele que tenham sido
eliminados do caminho mas não da pilha (nós em negrito) formam um
ciclo máximo. Se não há nós acima, elimina-se este nó da pilha.
• Uma vez identificados os ciclos máximos, determinar a sequência de
cálculo não é uma tarefa difícil;
• Em um ciclo máximo todas as unidades devem ser resolvidas
simultaneamente. Assim, um ciclo pode ser condensado em um único
nó. Assim, o dígrafo resultante não apresentará ciclos e começando
por um nó que recebe informações de entrada pode-se calcular a
sequência de unidades.
• Por exemplo: no caso anterior, a sequência seria: 3 – C1(1,2,4,5,6) –
C2(7,8) – 9.

Você também pode gostar