病状を格納するテーブルと症状を格納するテーブルを持つデータベースがあります。それぞれの状態には多くの症状があります。ユーザーはデータベースからいくつかの症状を選択し、アルゴリズムは各状態に一致する症状の数を見つけます。それぞれの一致条件と一致する症状の数を返したい(例:Cold 4/8)
擬似コード/アルゴリズムを理解するのに苦労していますが、これは非常に単純なアイデアです。
ありがとう
ゼロからコーディングする必要がある場合(たとえば、宿題の割り当てなど)、Reteアルゴリズムを確認することをお勧めします。それはあなたが与えられた結論に到達するために最小限の数のテストをするのを助けようとします。さまざまな病状とそれぞれの一連の症状を調べるという強引な解決策を採用し、各状態の各症状をテストしてスコアを割り当てると、同じ症状を何度もテストすることになります。異なる条件内の時間。鼻水、咳などが何百もの症状リストに表示される場合があります。Reteはそれを攻撃し、各症状を1回だけテストしてから、結論に到達します。
ただし、これを最初から構築する必要がない場合は、DroolsやJessのような既成のソリューションを検討することをお勧めします。これにより、必要な種類のデータベースを簡単に構築できるルールエンジンが提供されます。また、Reteアルゴリズム(またはそのようなもの)を組み込んで、潜在的に膨大な数のルールに直面した場合のパフォーマンスを最適化します。
症状ごとに、状態のリストを保存します。症状が見られたら、対応するすべての状態のカウントを増やします。
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}
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