我有一个数据库,其中有一个存储医疗状况的表和另一个存储症状的表。每种情况都有很多症状。用户将从数据库中选择许多症状,算法将找出每种情况的症状匹配程度。 我想返回每个匹配条件和匹配症状的数量,例如Cold 4/8
虽然我在制作伪代码/算法时遇到了困难,但这个想法很简单。
由于
答案 0 :(得分:2)
如果您必须从头开始编码(例如,在家庭作业中),那么您可能需要查看Rete算法。它将尝试帮助您进行最少数量的测试以获得给定的结论。如果你只是采取强力解决方案,查看一堆不同的医疗条件和每个症状的一组症状,并通过测试每个症状的每个症状,为其分配一个分数,你将最终测试相同的症状许多在不同条件下的时间。流鼻涕,咳嗽等可能会出现在数百种症状列表中。 Rete攻击并且只测试每个症状一次,然后逐步得出结论。
但是,如果您不必从头开始构建,那么您可能希望查看像Drools或Jess这样的现成解决方案,它为您提供了一个规则引擎,可以构建您想要的数据库类型。它们还构建了一个Rete算法(或类似的东西),以便在面对潜在的大量规则时优化其性能。
答案 1 :(得分: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}
答案 2 :(得分: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