2

我有一个数据库,其中有一个存储医疗状况的表和另一个存储症状的表。每种情况都有许多症状。用户将从数据库中选择一些症状,算法将找出每个条件有多少症状匹配。我想返回每个匹配条件和匹配症状的数量,例如 Cold 4/8

这是一个非常简单的想法,尽管我很难计算出伪代码/算法。

谢谢

4

3 回答 3

2

如果您必须从头开始编写代码(例如,在家庭作业中),那么您可能需要查看 Rete 算法。它将尝试帮助您进行最少数量的测试以得出给定的结论。如果您只是采用蛮力解决方案,即查看一堆不同的医疗状况和每种症状的一组症状,然后滚动测试每种症状的每种症状并为其分配分数,那么您最终会测试许多相同的症状不同条件下的时间。流鼻涕、咳嗽等可能会出现在数百种症状列表中。Rete 攻击只测试每个症状一次,然后得出结论。

但是,如果您不必从头开始构建它,那么您可能希望查看像 Drools 或 Jess 这样的现成解决方案,它为您提供了一个规则引擎,可以轻松构建您想要的那种数据库。他们还内置了 Rete 算法(或类似的算法),以在面对潜在的大量规则时优化其性能。

于 2012-04-30T18:57:22.550 回答
1

Java中的伪代码

enum Condition {
    CONDITON_1, CONDITION_2, CONDITION_N;
}

enum Symptom {
    SYMPTOM_1, SYMPTOM_2, SYMPTOM_N;
}

public static final int SYMPTOM_COUNT = Symptom.values().length;

static final Map<Condition, Set<Symptom>> MAP = new EnumMap<Condition, Set<Symptom>>(Condition.class);

static {
    MAP.put(Condition.CONDITON_1, EnumSet.of(Symptom.SYMPTOM_1));
    MAP.put(Condition.CONDITION_2, EnumSet.of(Symptom.SYMPTOM_1, Symptom.SYMPTOM_2));
    MAP.put(Condition.CONDITION_N, EnumSet.of(Symptom.SYMPTOM_2, Symptom.SYMPTOM_N));
}

public static void findMatches(Set<Symptom> symptoms) {
    for (Map.Entry<Condition, Set<Symptom>> entry : MAP.entrySet()) {
        Set<Symptom> matches = EnumSet.copyOf(entry.getValue());
        matches.retainAll(symptoms);
        System.out.println(entry.getKey() + ": " + matches.size() + " / " + SYMPTOM_COUNT);
    }
}

public static void main(String... _) {
    findMatches(EnumSet.of(Symptom.SYMPTOM_2, Symptom.SYMPTOM_N));
}

印刷

CONDITON_1: 0 / 3
CONDITION_2: 1 / 3
CONDITION_N: 2 / 3
于 2012-04-30T19:05:32.960 回答
1

对于每个症状存储一个条件列表。当您看到一个症状时,增加所有相应条件的计数。

Python 示例:让“A”、“B”和“C”为条件,“X”、“Y”和“Z”为症状。

symptom = {'X':['A','B'], 'Y':['A','B','C'], 'Z':['A','C'] }

def condCount(userSymptoms):
    condCnt= {}

    for sym in userSymptoms:
        for i in symptoms['sym]:
            condCnt[i]=condCnt.get(i,0)+1
    return condCnt

condCount(['X','Y'])
Answer: {'A':2,'B':2,'C':1}
于 2012-04-30T18:53:57.390 回答