1

私は Apple の GameplayKit API を調査していますが、現在、GKRuleSystem がそのルールを評価する方法に非常に混乱しています。ドキュメントによると、salience プロパティによって評価の順序が決定され、salience の高いルールが最初に評価されます ( https://developer.apple.com/library/ios/documentation/GameplayKit/Reference/GKRule_Class/index.html#// apple_ref/occ/instp/GKRule/salience )。しかし、実際には、これは起こらないようです:

let twoRuleSystem = GKRuleSystem()
let stateConditionA = "A"
let stateConditionB = "B"
let fact = "A"

let stronglyAssert = NSPredicate(format: "state.\(stateConditionA) = true")
let weaklyRetract = NSPredicate(format: "state.\(stateConditionB) = true")
let strongRule = GKRule(predicate: stronglyAssert, assertingFact: fact, grade: 1.0)
let weakRule = GKRule(predicate: weaklyRetract, retractingFact: fact, grade: 0.25)

strongRule.salience = 10
weakRule.salience = 1

twoRuleSystem.addRulesFromArray([strongRule, weakRule])

twoRuleSystem.state[stateConditionA] = true
twoRuleSystem.state[stateConditionB] = true
twoRuleSystem.reset()
twoRuleSystem.evaluate()

print("The fact \(fact) evaluates to \(twoRuleSystem.gradeForFact(fact))")
// prints "The fact A evaluates to 1.0"

2 つの事実の顕著性を逆にすると、結果は「事実 A は 0.75 と評価されます」となります。

私の strongRule の salience が 10 の場合、それが最初に評価され、事実 A が 1.0 の値でアサートされると予想します。次に、weakRule が評価され、ファクト A は値 0.25 で撤回され、ファクト グレードは 0.75 になります。ただし、これは、weakRule の顕著性が高い場合にのみ機能します。

これは私をさらに混乱させます。なぜなら、weakRule が最初に評価される場合、事実 A の値が 0 であると予想するからです。ファクトのグレードは 0 から 1.0 までの値のみです。次に、strongRule が評価され、グレード 1.0 でファクト A をアサートすることを期待します。しかし、それは起こっていることではありません。

4

1 に答える 1

1

Apple から回答がありました - これは確認済みのバグです。GKRuleSystem は、追加された順序でルールを評価しません。ルールの実行順序を保証するには、salience 値を使用する必要があります。

また、数値が小さいほど顕著性が高いことを意味します。顕著性が 1 のルールは、顕著性が 2 のルールよりも先に評価されます。

于 2016-06-03T05:38:52.377 に答える