O modo de armazenamento em cluster
ibm_ilog.graphlayout.circular.CircularLayout.AUTOMATIC
pode calcular clusters e ordenar os nós em clusters para
evitar cruzamentos de links. Por padrão, ele posiciona os clusters em relação uns aos outros
com um layout de árvore (ibm_ilog.graphlayout.tree.TreeLayout
) no modo radial. Também é possível especificar outros layouts para
manipular o posicionamento de clusters. Os seguintes parâmetros funcionam apenas
no modo de armazenamento em cluster AUTOMATIC
. Ajuste fino do armazenamento em cluster
O modo de armazenamento em cluster
AUTOMATIC
considera os clusters especificados como clusters iniciais. Se
alguns ou todos os nós não tiverem nenhum cluster especificado, ele calculará os clusters
a partir da topologia do gráfico.Este modo considera vários critérios de topologia:
- Biconectividade
- Número mínimo de nós por cluster
- Número máximo de nós por cluster
- Nós de alto grau para formar clusters em estrela
Armazenamento em Cluster por Biconectividade
Se um conjunto de nós tiver muitas conexões uns com os outros, eles devem formar um cluster. A propriedade informal "muitas conexões" pode ser matematicamente descrita pelo terno biconectividade: Um conjunto de nós é biconectado se a remoção de apenas um nó ou apenas um link mantém os nós conectados. Por exemplo, um anel da conexão é sempre biconectado. É um critério adequado para os clusters. O algoritmo detecta, por padrão, primeiramente as partes biconectadas do gráfico e forma um cluster retangular (não um cluster em formato de estrela) para cada parte. Se isso não for adequado, a detecção de componentes biconectados também pode ser desativada.
Exemplo de Desativação da Detecção de Partes Biconectadas
(algoritmo CL)
Para desativar a detecção de componentes biconectados:
Use o método:
layout.setClusterByBiconnectivity(false)
Este parâmetro não terá efeito se o modo de armazenamento em
cluster for
BY_CLUSTER_IDS
ou
BY_SUBGRAPHS
. Tamanho Mínimo do Cluster
É possível especificar o tamanho mínimo de clusters regulares
(não de clusters em estrela). Se os clusters iniciais forem muito
pequenos, eles serão mesclados em clusters maiores.
Exemplo de Especificação do Tamanho Mínimo do Cluster
(algoritmo de CL)
Para especificar o tamanho mínimo do cluster:
Use o método:
layout.setMinimumClusterSize(10)
Este parâmetro não terá efeito se o modo de armazenamento em
cluster for
BY_CLUSTER_IDS
ou
BY_SUBGRAPHS
. Tamanho Máximo do Cluster
É possível especificar o tamanho máximo de clusters regulares
(não de clusters em estrela). Se os clusters iniciais forem muito grandes,
eles serão divididos em clusters menores. Este valor é apenas uma
sugestão. Se o tamanho mínimo do cluster e o tamanho máximo do cluster forem parecidos, o tamanho máximo do cluster não poderá ser respeitado sempre.
Exemplo de Especificação do Tamanho Máximo do Cluster
(algoritmo de CL)
Para especificar o tamanho máximo do cluster:
Use o método:
layout.setMaximumClusterSize(20)
A divisão de clusters é um processo iterativo. É possível
especificar o número máximo de iterações para obter o tamanho máximo do
cluster. Quanto mais iterações, melhor a qualidade e mais lento o layout.
Exemplo de Especificação do Número Máximo de Iterações
Máximas de Cluster (algoritmo CL)
Para especificar o número máximo de iterações:
Use o método:
layout.setMaximumNumberOfIterationsToReachMaxClusterSize(100)
Estes parâmetros não terão efeito se o modo de armazenamento
em cluster for
BY_CLUSTER_IDS
ou
BY_SUBGRAPHS
. Tamanho Mínimo do Cluster em Estrela
Além de clusters regulares, o algoritmo de layout também pode
detectar clusters em estrela. Ele detecta nós com alto grau que possuem
muitos vizinhos não em cluster e forma-os em clusters com o nó de alto
grau como o centro em estrela
Exemplo de Especificação do Tamanho Mínimo do Cluster em
Estrela (algoritmo CL)
Para especificar o grau mínimo para formar um nó e seu
vizinho para um cluster em estrela:
Use o método:
layout.setHighDegreeStarClusterSize(5)
Este parâmetro não terá efeito se o modo de armazenamento em
cluster for
BY_CLUSTER_IDS
ou
BY_SUBGRAPHS
. Ajuste fino da redução de cruzamentos
Se a ordem dos nós em cada cluster não for especificada pelos índices de cluster (consulte Associação de cluster e ordem dos nós em um cluster (CL)), então, o modo
AUTOMATIC
reordena
os nós em cada cluster para evitar os cruzamentos de links. Isso é uma heurística simplesmente e não pode sempre garantir o número mínimo de cruzamentos de links. Há dois tipos de links: nós de conexão de links de intracluster que pertencem ao mesmo cluster e nós de conexão de links de intercluster de clusters diferentes. Durante a redução do cruzamento, links de intracluster competem com links de intercluster. Algumas ordens de nós de um cluster produzem mais cruzamentos de links dentro do cluster, enquanto outras ordens de nó produzem mais cruzamentos de links que conectam clusters diferentes. O comportamento pode ser controlado pelos pesos de cruzamentos. Redução de cruzamento de link de intercluster
A etapa de redução de cruzamento que considera links de intercluster é a parte mais lenta da redução de cruzamento. Ela é ativada
por padrão, mas pode ser desativada. Se desativada, apenas links de intracluster são considerados para calcular a ordem dos nós em cada cluster.
Exemplo de desativação de redução de cruzamento de link de intercluster (algoritmo CL)
Para desativar a redução de cruzamento de link de intercluster:
Use o método:
layout.setInterClusterCrossingReduction(false)
Este parâmetro não terá efeito se o modo de armazenamento em
cluster for
BY_CLUSTER_IDS
ou
BY_SUBGRAPHS
. Penalidade do cruzamento de link de intracluster
A redução de cruzamentos tenta minimizar a soma de
penalidades de cruzamentos. Se dois links de intracluster se cruzarem, isso contribui para a soma com penalidade de intracluster. Aumente essa penalidade se os links de intracluster tiverem de ter um peso mais alto ao calcular a ordem de nó para cada cluster.
Exemplo de especificação de penalidade de intracluster (algoritmo CL)
Para especificar a penalidade do cruzamento de link de intracluster:
Use o método:
layout.setIntraClusterLinkCrossingPenalty(2)
Este parâmetro não terá efeito se o modo de armazenamento em
cluster for
BY_CLUSTER_IDS
ou
BY_SUBGRAPHS
. Penalidade de cruzamento de link de intercluster
Se dois links de intercluster se cruzarem, isso contribui para a soma de penalidade com a penalidade de intercluster. Aumente essa penalidade se os links de intercluster tiverem de ter um peso mais alto ao calcular a ordem de nó para cada cluster.
Exemplo de especificação de penalidade de intercluster (algoritmo CL)
Para especificar a penalidade de cruzamento de link de intercluster:
Use o método:
layout.setInterClusterLinkCrossingPenalty(3)
Este parâmetro não terá efeito se o modo de armazenamento em
cluster for
BY_CLUSTER_IDS
ou
BY_SUBGRAPHS
. Penalidade de Cruzamento de Links de Clusters Combinados
Se um link de intracluster cruzar um link de intercluster, isso contribui para a soma de penalidade com a penalidade de cluster combinado.
Exemplo de Especificação da Penalidade de Clusters
Combinados (algoritmo CL)
Para especificar a penalidade de cruzamento de links de
clusters combinados:
Use o método:
layout.setMixedClusterLinkCrossingPenalty(4)
Este parâmetro não terá efeito se o modo de armazenamento em
cluster for
BY_CLUSTER_IDS
ou
BY_SUBGRAPHS
. Layout do Gráfico de Cluster
Os nós de cada cluster são posicionados em um círculo. Em
seguida, cada círculo é posicionado no plano. Por padrão, o layout
circular usa um layout de árvore em modo radial para posicionar os
círculos.
Exemplo de manipulação de layout de gráficos de cluster
Os parâmetros de layout do layout de árvore podem ser
alterados acessando o layout de árvore:
Use o método:
var layoutOfClusterGraph = layout.getLayoutOfClusterGraph()
para acessar o layout do gráfico de cluster. Por padrão, é uma instância de
ibm_ilog.graphlayout.tree.TreeLayout
.
É
possível configurar qualquer parâmetro de layout de árvore global nesta
instância de layout. Também é possível especificar uma instância de layout
diferente para posicionar os clusters:
Use o método:
layout.setLayoutOfClusterGraph(otherLayout)
Manipulação de Gráficos Desconectados
O algoritmo de layout pode usar o mecanismo genérico para
organizar os componentes conectados. (Para obter informações adicionais
sobre este mecanismo, consulte
Layout de Componentes Conectados). Este mecanismo genérico está disponível na própria instância de layout
circular, mas também na instância de layout de árvore que organiza o
gráfico de cluster.
Exemplo de Manipulação de Gráficos Desconectados
É possível ativá-la no próprio layout circular:
Chame a instância de layout circular:
circularLayout.setLayoutOfConnectedComponentsEnabled(true); circularLayout.setLayoutOfCOnnectedComponents(someGridLayout);
Se ela estiver desativada no layout circular, o layout do
gráfico de cluster manipulará componentes desconectados. É claro que é
possível ativar a manipulação genérica de componentes desconectados, bem
como no layout do gráfico de cluster (se ele for suportado aqui, o que é
verdadeiro para o layout de árvore padrão) por meio de
circularLayout.getLayoutOfClusterGraph().setLayoutOfConnectedComponentsEnabled(true); circularLayout.getLayoutOfClusterGraph().setLayoutOfCOnnectedComponents(someGridLayout);
mas isto tem exatamente o mesmo efeito que se você
especificá-la diretamente na instância de layout circular.