Frage

Ich versuche, mein Verständnis der Semantik in dem Clip Expertensystem zu klären, so versuche ich, ein paar einfache Regeln zu schreiben, eine Liste von Fakten aggregieren die Tatsache mit dem höchsten Schlitzwert zu finden. Die Metapher ich benutze, ist, dass von einem einfachen Mittel versuchen zu entscheiden, ob es essen oder zu schlafen soll. Fakten des Agenten Zustände beschreiben, werden in potentielle Aktionen erweitert, und dann in der Regel versucht, die letzte Aktion mit dem höchsten Nutzen zu finden.

Dies ist mein Code:

(clear)

(deftemplate state 
    (slot name) 
    (slot level (type NUMBER)) 
) 
(deftemplate action 
    (slot name) 
    (slot utility (type NUMBER)) 
    (slot final (type INTEGER) (default 0)) 
) 
(defrule eat-when-hungry "" 
    (state (name hungry) (level ?level)) 
    => 
    (assert (action (name eat) (utility ?level))) 
) 
(defrule sleep-when-sleepy "" 
    (state (name sleepy) (level ?level)) 
    => 
    (assert (action (name sleep) (utility ?level))) 
) 
(defrule find-final-action "" 
    ?current_final <- (action (name ?current_final_action) (utility ? 
current_final_utility) (final 1)) 
    (action (name ?other_action) (utility ?other_utility) (final 0)) 
    (neq ?current_final_action ?other_action) 
    (< ?current_final_action ?other_action) 
    => 
    (modify ?current_final (name ?other_action) (utility ? 
other_utility)) 
) 
(assert (action (name none) (utility 0.0) (final 1))) 
(assert (state (name hungry) (level 0.5))) 
(assert (state (name sleepy) (level 0.1))) 
(run) 
(facts)

Danach läuft, würde ich die letzte Aktion erwarten zu sein:

(action (name eat) (utility 0.5) (final 1)) 

Allerdings werten Clips es an:

(action (name none) (utility 0.0) (final 1)) 

anzeigt, die Fund-final-Aktion Regel aktiviert nie. Warum ist das? Wie würden Sie iterieren über eine Gruppe von Fakten und die mit der Min- / Max-Schlitzwert finden?

War es hilfreich?

Lösung

hatte Ihre Regel ein paar Fehler drin. Hier ist die korrigierte Version:

(defrule find-final-action "" 
    ?current_final <- (action (name ?current_final_action) 
                              (utility ?current_final_utility) (final 1)) 
    (action (name ?other_action) (utility ?other_utility) (final 0)) 
    (test (neq ?current_final_action ?other_action))
    (test (< ?current_final_utility ?other_utility)) 
    => 
    (modify ?current_final (name ?other_action) (utility ?other_utility)))

Ein alternatives Verfahren, das nicht erfordert Zwischenberechnungen und mehrere Regelauslösungen Speicher ist dies:

(defrule find-final-action-2 "" 
    (declare (salience -10)) ; lower salience to allow all actions to be asserted first
    (action (name ?action) (utility ?utility)) 
    (not (action (utility ?other_utility&:(> ?other_utility ?utility))))
    => 
    (printout t "Final action is " ?action crlf))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top