用于从一组条件中查找所选匹配症状的算法

时间:2012-04-30 18:44:27

标签: java algorithm

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

虽然我在制作伪代码/算法时遇到了困难,但这个想法很简单。

由于

3 个答案:

答案 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