Skip to content

Commit 16daf50

Browse files
committed
Adds Decision Network
1 parent 6b3adab commit 16daf50

File tree

2 files changed

+35
-9
lines changed

2 files changed

+35
-9
lines changed

aima-core/src/main/java/aima/core/probability/DecisionNetwork.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,42 @@
11
package aima.core.probability;
22

3+
import aima.core.probability.bayes.BayesInference;
34
import aima.core.probability.bayes.BayesianNetwork;
45
import aima.core.probability.domain.FiniteDomain;
6+
import aima.core.probability.proposition.AssignmentProposition;
57
import org.junit.Test;
68

9+
import java.util.List;
10+
711
public abstract class DecisionNetwork {
812

913
private BayesianNetwork network;
1014
private RandomVariable action;
15+
private BayesInference inferenceProcedure;
16+
17+
public DecisionNetwork(BayesianNetwork network,
18+
RandomVariable action, BayesInference inferenceProcedure) {
19+
this.network = network;
20+
this.action = action;
21+
this.inferenceProcedure = inferenceProcedure;
22+
}
1123

1224
public abstract double getUtilityForAction(RandomVariable action, Object value );
1325

14-
public Object getBestAction(){
15-
double maxUtilValue = Double.MIN_VALUE;
16-
Object actionValue = null;
26+
public double getExpectedUtility(RandomVariable action,
27+
List<AssignmentProposition> evidence){
28+
double utility = 0;
29+
CategoricalDistribution distribution = inferenceProcedure.ask((new RandomVariable[]{action}),
30+
((AssignmentProposition[])evidence.toArray()),this.getNetwork());
1731
for (Object value :
1832
((FiniteDomain) action.getDomain()).getPossibleValues()) {
19-
if (maxUtilValue < getUtilityForAction(action,value)){
20-
maxUtilValue = getUtilityForAction(action,value);
21-
actionValue = value;
22-
}
33+
utility += distribution.getValue(value)*this.getUtilityForAction(action,value);
2334
}
24-
return actionValue;
35+
return utility;
36+
}
37+
38+
public Object getBestAction(){
39+
return action;
2540
}
2641

2742
public BayesianNetwork getNetwork() {

aima-core/src/main/java/aima/core/probability/InformationGatheringAgent.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import aima.core.probability.proposition.AssignmentProposition;
1010

1111
import java.util.ArrayList;
12+
import java.util.Arrays;
1213
import java.util.Collections;
1314
import java.util.List;
1415

@@ -58,10 +59,20 @@ private List<Double> vpiPerUnitCost(List<RandomVariable> variablesInTopologicalO
5859
protected abstract double getCost(RandomVariable var);
5960

6061
protected double getVpi(RandomVariable var){
62+
double vpi =0;
63+
CategoricalDistribution distribution = inferenceMethod.ask((new RandomVariable[]{var}),
64+
((AssignmentProposition[])observedEvidence.toArray()),decisionNetwork.getNetwork());
6165
for (Object value :
6266
((FiniteDomain) var.getDomain()).getPossibleValues()) {
63-
inferenceMethod.ask()
67+
double posterierProb = distribution.getValue(value);
68+
List<AssignmentProposition> modifiedEvidence = new ArrayList<>(observedEvidence);
69+
modifiedEvidence.add(new AssignmentProposition(var,value));
70+
double expectedUtilityForParticularValue = decisionNetwork.getExpectedUtility(var,
71+
modifiedEvidence);
72+
vpi+= posterierProb*expectedUtilityForParticularValue;
6473
}
74+
vpi-=decisionNetwork.getExpectedUtility(var,observedEvidence);
75+
return vpi;
6576
}
6677

6778
abstract List<AssignmentProposition> integratePercept(List<AssignmentProposition> observedEvidence, Percept percept);

0 commit comments

Comments
 (0)