给定输入的规则匹配(算法)

Mik*_*ier 5 algorithm pattern-matching

假设我有以下类别(带有可能的值):

animal: any, cat, dog
color: any, white, black, gray
gender: any, male, female
[...]
Run Code Online (Sandbox Code Playgroud)

或更一般地......

category: <array of values>
Run Code Online (Sandbox Code Playgroud)

(1)假设我有一组可配置的规则,例如:

when animal is any, color is gray, gender is male, call x
when animal is dog, color is gray, gender is male, call y
when animal is any, color is any, gender is any, call z
[...]
Run Code Online (Sandbox Code Playgroud)

(2)和一些输入值.

问:是否有一种算法可以根据给定的输入解决找到匹配规则(优先考虑最具体的规则)的问题?

第Ex.I:

input (animal:dog, color:gray, gender:male)
Run Code Online (Sandbox Code Playgroud)

它会叫"y"

例2:

input (color:gray, gender:female)
Run Code Online (Sandbox Code Playgroud)

它会叫"z"

更合适的方法是根据规则构建搜索树(树的每个级别是一个类别)?

喜欢:

- any animal
  - any color
    - any gender => z
  - gray
     - male => x
- dog
  - gray
     - male => y
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

谢谢!

ElK*_*ina 1

经过以下修改的决策树将起作用:

  1. 使用所有规则以正常方式创建决策树,以“任意”作为边
  2. 递归遍历时,遍历“value”和“any”,并跟踪每个解决方案中的“any”数,返回“any”最少的那个

    def traverse(values, level, tree,anyCount): 如果树是叶子: return (appr_func, anyCount)

    v1 = None
    if values[level] in tree:
        v1 = traverse(values, level+1, tree[values[level]]], anyCount)
    
    v2 = None
    if 'any' in tree:
        v2 = traverse(values, level+1, tree['any'], anyCount+1)
    
    if v1!=None:
        if v2!=None:
            if v1[1]<v2[1]:
                return v1
            else:
                return v2
        else:
            return v1
    elif v2!=None:
        return v2
    else:
        return None
    
    Run Code Online (Sandbox Code Playgroud)