NEBO predikát optimalizace

0

Otázka

Předpokládejme, že mám účetní jednotka s 3 atributy: A1, A2, A3 taková, že:

  1. A1 může mít jen hodnoty: 1, 2, 3
  2. A2 může mít jen hodnoty: 10, 20, 30, 40, 50
  3. A3 může mít jen hodnoty: 100, 200

A řada pravidel, například:

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

Pak tam je predikát: R = R1 or R2 or R3, které bych rád, aby se minimalizovalo. Věc je, že A1=1 zahrnuje všechny možné varianty A2 a A3,, takže vám můžeme přinést to na samostatný článek: R = (A1=1) or (the rest)

Snažil jsem boolean minimalizace metody tím, že deklaruje proměnné jako a=(A1=1), b=(A1=2), ..., k=(A3=200)však se to nezdá do práce, protože:

  1. boolean optimizer nejsou známy všechny hodnoty atribut
  2. booleovské proměnné nejsou nezávislé Když se snaží tyto problémy řešit, výraz se stává příliš složité a ani šroubováky qmc, ani Espresso není schopen minimalizovat jej v požadovaném způsobem.

Také jsem se snažil, aby každý obchod na každé mapování a v případě, že jeden z nich má všechny hodnoty další, použít ji jako agregace kotva, a pak ji vyjměte a opakovat, ale to trvá věčnost a docela dost RAM.

Možná, že můžeme reprezentovat hodnoty atributu jako sadu a řešit to z teorie množin hlediska.

Už jste někdy čelí problém? Jsou si vědomi lepší způsoby, jak to vyřešit? (heuristiky jsou v pořádku, stejně)

1

Nejlepší odpověď

1

Metoda optimalizace pro výraz hodnocení by mohlo být rozdělit pravidla opakovaně na atribut s nejmenším počtem hodnot. Po tomto rozšíření můžete sbírat hodnoty znovu pro ty, kteří mají ty stejné na poslední větu.

  1. Udělat 2 skupiny, jedna pro pravidla, které přijímají A3 = 100 a jeden pro pravidla, které přijímají A3 = 200. Pravidlo může skončit v obou skupinách. Pak upravit pravidlo ve skupině tak, že to přijímá pouze hodnotu pro skupinu a ne ten druhý.

  2. Skupina těchto skupin opět na hodnotách A1 s použitím stejné logiky.

Byste skončit s rozšířenou výraz, jako je tento:

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

V podstatě stavíme strom s hodnotami pro A3 v hloubce 1 a hodnoty pro A1 v hloubce 2 a hodnoty A2 na hloubku 3. Pokud je cesta od kořene k listu pomocí hodnoty atributu, pak pravidlo je splněna, jinak to není.

Poté, které si můžete sloučit všechny uzly se stejným podstromu a stejné rodiče. Za to můžete porovnat listy všechny uzly se stejným rodičem a pokud se shodují, můžete sloučit uzly. Po jedné úrovni a porovnat uzly se stejným rodičem a tak dále.

Pro váš příklad by skončit s tímto výrazem:

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)

Tento proces je velmi jednoduchý a může také zkrátit výraz, a to nejen optimalizovat pro hodnocení. Možná to není dokonalé, ale mohlo by to být způsob, jak začít.

2021-11-22 20:45:00

V jiných jazycích

Tato stránka je v jiných jazycích

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