我有一个数据库,其中有一个存储医疗状况的表和另一个存储症状的表。每种情况都有许多症状。用户将从数据库中选择一些症状,算法将找出每个条件有多少症状匹配。我想返回每个匹配条件和匹配症状的数量,例如 Cold 4/8
这是一个非常简单的想法,尽管我很难计算出伪代码/算法。
谢谢
如果您必须从头开始编写代码(例如,在家庭作业中),那么您可能需要查看 Rete 算法。它将尝试帮助您进行最少数量的测试以得出给定的结论。如果您只是采用蛮力解决方案,即查看一堆不同的医疗状况和每种症状的一组症状,然后滚动测试每种症状的每种症状并为其分配分数,那么您最终会测试许多相同的症状不同条件下的时间。流鼻涕、咳嗽等可能会出现在数百种症状列表中。Rete 攻击只测试每个症状一次,然后得出结论。
但是,如果您不必从头开始构建它,那么您可能希望查看像 Drools 或 Jess 这样的现成解决方案,它为您提供了一个规则引擎,可以轻松构建您想要的那种数据库。他们还内置了 Rete 算法(或类似的算法),以在面对潜在的大量规则时优化其性能。
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
对于每个症状存储一个条件列表。当您看到一个症状时,增加所有相应条件的计数。
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}