OU prédicat d'optimisation

0

La question

Supposons que j'ai une entité avec 3 attributs: A1, A2, A3, tels que:

  1. A1 ne peut avoir les valeurs: 1, 2, 3
  2. A2 peut seulement avoir des valeurs: 10, 20, 30, 40, 50
  3. A3 ne peut avoir les valeurs suivantes: 100, 200

Et un certain nombre de règles, par exemple:

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))

Ensuite, il ya un prédicat: R = R1 or R2 or R3que je tiens à minimiser. Le truc, c'est que A1=1 couvre toutes les variantes possibles de l' A2 et A3, de sorte que nous pouvons l'introduire dans un alinéa distinct: R = (A1=1) or (the rest)

J'ai essayé la minimisation booléenne méthodes en déclarant des variables comme a=(A1=1), b=(A1=2), ..., k=(A3=200)toutefois, il ne semble pas fonctionner, parce que:

  1. boolean optimiseur n'est pas au courant de toutes les valeurs d'Un attribut
  2. les variables booléennes ne sont pas indépendants Lorsque vous essayez de répondre à ces questions, l'expression est devenue trop complexe et ni QMC, pas l'Espresso n'est pas en mesure de réduire de la manière désirée.

J'ai aussi essayé de stocker chaque à chaque les mappages et dans le cas où l'un d'eux toutes les valeurs de l'autre, l'utiliser comme une agrégation d'ancrage, puis l'enlever et de le répéter, mais il faut de l'éternité et de beaucoup de RAM.

Peut-être que l'on peut représenter les valeurs d'attribut comme un ensemble et de l'aborder à partir de la théorie des ensembles point de vue.

Avez-vous jamais été confronté à ce qu'un problème? Connaissez-vous des meilleures façons de le résoudre? (les heuristiques sont ok aussi)

1

La meilleure réponse

1

Une méthode d'optimisation de l'expression pour l'évaluation pourrait être de diviser les règles à plusieurs reprises sur l'attribut avec le moins de valeurs. Après cette extension vous de collecter les valeurs de nouveau pour ceux qui ont les mêmes sur la dernière phrase.

  1. Faire 2 groupes, l'un pour les règles qui acceptent A3 = 100 et un pour les règles qui acceptent A3 = 200. Une règle peut se retrouver dans les deux groupes. Puis modifier la règle dans le groupe afin qu'il accepte uniquement la valeur pour le groupe et pas l'autre.

  2. Groupe de ces groupes à nouveau sur les valeurs de A1 à l'aide de la même logique.

Vous vous retrouvez avec une expansion de l'expression comme ceci:

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)))

Fondamentalement, nous construisons un arbre avec les valeurs de l'A3 à la profondeur 1 et les valeurs de A1 à une profondeur de 2 et les valeurs de A2 à la profondeur 3. Si il y a un chemin de la racine à la feuille en utilisant les valeurs des attributs de la règle est acquitta sinon, il n'est pas.

Après cela, vous pouvez fusionner tous les nœuds avec le même sous-arbre et de la même mère. Pour cela, vous pouvez comparer les feuilles de tous les nœuds ayant le même parent et si elles correspondent, vous pouvez fusionner les nœuds. Après que vous passez d'un niveau et de comparer les nœuds ayant le même parent et ainsi de suite.

Pour votre exemple, vous vous retrouvez avec cette expression:

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)

Ce processus est assez simple et pourrait également réduire l'expression, non seulement de l'optimiser pour l'évaluation. Il serait peut-être pas parfait, mais il pourrait être une façon de commencer.

2021-11-22 20:45:00

Dans d'autres langues

Cette page est dans d'autres langues

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