OU o predicado de otimização

0

Pergunta

Suponhamos que eu tenha uma entidade com 3 atributos: A1, A2, A3 tais que:

  1. A1 só pode ter os valores: 1, 2, 3
  2. A2 só pode ter valores: 10, 20, 30, 40, 50
  3. A3 só pode ter os valores: 100, 200

E um número de regras, por exemplo:

R1: (A1 in (1, 2)) AND (A2 in (20, 40, 50)) AND (A3 IN (100))
R2: (A1 in (1, 3)) AND (A2 in (10, 30)) AND (A3 in (200))
R3: (A1 in (1, 2)) AND (A2 in (10)) AND (A3 in (100))

Em seguida, há um predicado: R = R1 or R2 or R3, o que eu gostaria de minimizar. A única coisa é que A1=1 cobre todas as variações possíveis de A2 e A3, assim que nós pode trazê-lo em separado cláusula: R = (A1=1) or (the rest)

Eu tentei boolean minimização de métodos declarando variáveis como a=(A1=1), b=(A1=2), ..., k=(A3=200)no entanto , ele não parece funcionar, porque:

  1. boolean optimizador não está ciente de todos os valores de atributo de Um
  2. boolean variáveis não são independentes Ao tentar abordar esses problemas, a expressão está a tornar-se muito complexa e nem QMC, não de café Expresso não é capaz de minimizá-lo da maneira desejada.

Eu também tentei de armazenamento de cada um-para-cada mapeamentos e no caso de um deles ter todos os valores de um outro, de usá-lo como uma agregação de âncora, em seguida, remova-o e repita, mas leva a eternidade e um monte de RAM.

Talvez possamos representam os valores de atributo como um conjunto e endereço-a partir da teoria dos conjuntos ponto de vista.

Alguma vez você já enfrentou um problema isso? Você está ciente de melhores formas de resolvê-lo? (heurística são bem)

1

Melhor resposta

1

Um método para otimizar a expressão para a avaliação poderia ser a de dividir as regras várias vezes no atributo com o menor número de valores. Após essa expansão, você pode coletar os valores de novo para aqueles que têm as mesmas na última cláusula.

  1. Fazer 2 grupos, um para as regras que aceitar A3 = 100 e outra para as regras que aceitar A3 = 200. Uma regra pode acabar em ambos os grupos. Em seguida, modificar a regra, no grupo, de modo que ele só aceita o valor para o grupo e não a outro.

  2. Grupo os grupos novamente sobre os valores de A1 usando a mesma lógica.

Você iria acabar com um expandida expressão como esta:

A3 = 100 AND (
    (A1 = 1 AND A2 IN (10, 20, 40, 50)) OR
    (A1 = 2 AND A2 IN (10, 20, 40, 50)))
OR A3 = 200 AND (
    (A1 = 1 AND A2 IN (10, 30)) OR
    (A1 = 3 AND A2 IN (10, 30)))

Basicamente, estamos a construção de uma árvore com os valores para a A3 em profundidade 1 e os valores de A1 em profundidade 2 e os valores de A2 na profundidade de 3. Se existe um caminho da raiz às folhas, utilizando os valores do atributo, em seguida, a regra é cumprida caso contrário, não.

Depois que você pode mesclar todos os nós com a mesma subárvore e o mesmo pai. Para isso, você pode comparar as folhas de todos os nós com o mesmo pai e se elas corresponderem, você pode mesclar os nós. Depois que você passar para um nível acima e compare os nós com o mesmo pai e assim por diante.

Para o exemplo, você iria acabar com esta expressão:

A3 = 100 AND A1 IN (1, 2) AND A2 IN (10, 20, 40, 50) OR
A3 = 200 AND A1 IN (1, 3) AND A2 IN (10, 30)

Esse processo é muito simples e pode também reduzir a expressão, não só otimizá-lo para avaliação. Ele pode não ser perfeito, mas pode ser uma forma de começar.

2021-11-22 20:45:00

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................