please see instructions in the attached file. #include #include using namespace std; const int ROWS = 8; const int COLS = 9; //P(sense obstacle | obstacle) = 0.8 float probSenseObstacle = 0.8; //P(senses no obstacle | obstacle) = 1 – 0.8 = 0.2 float probFalseNoObstacle = 0.2; //P(sense obstacle | no obstacle) = 0.15 float probFalseObstacle = 0.15; //P(senses no obstacle | no obstacle) = 1 – 0.15 = 0.85 float probSenseNoObstacle = 0.85; //Puzzle including a border around the edge int maze[ROWS][COLS] = { {1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,1}, {1,0,1,0,0,1,0,0,1}, {1,0,0,0,0,0,0,0,1}, {1,0,1,0,0,1,0,0,1}, {1,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1}, }; //Matrix of probabilities float probs[ROWS][COLS]; //Temporary matrix float motionPuzzle[ROWS][COLS]; float sensingCalculation(int evidence[4], int row, int col) { float result = 1.0; //If obstacle sensed to the west if (evidence[0] == 1) { //If obstacle to the west in maze if (maze[row][col – 1] == 1) result *= probSenseObstacle; //If no obstacle to the west in maze else result *= probFalseObstacle; } //If no obstacle sensed to the west else { //If obstacle to the west in maze if (maze[row][col – 1] == 1) { result *= probFalseNoObstacle; } //If no obstacle to the west in maze else { result *= probSenseNoObstacle; } } //If obstacle sensed to the north if (evidence[1] == 1) { //If obstacle to the north in maze if (maze[row – 1][col] == 1) result *= probSenseObstacle; //If no obstacle to the north in maze else result *= probFalseObstacle; } //If no obstacle sensed to the north else { //If obstacle to the north in maze if (maze[row – 1][col] == 1) { result *= probFalseNoObstacle; } //If no obstacle to the north in maze else { result *= probSenseNoObstacle; } } //If obstacle sensed to the east if (evidence[2] == 1) { //If obstacle to the east in maze if (maze[row][col + 1] == 1) result *= probSenseObstacle; //If no obstacle to the east in maze else result *= probFalseObstacle; } //If no obstacle sensed to the east else { //If obstacle to the east in maze if (maze[row][col + 1] == 1) { result *= probFalseNoObstacle; } //If no obstacle to the east in maze else { result *= probSenseNoObstacle; } } //If obstacle sensed to the south if (evidence[3] == 1) { //If obstacle to the south in maze if (maze[row + 1][col] == 1) result *= probSenseObstacle; //If no obstacle to the south in maze else result *= probFalseObstacle; } //If no obstacle sensed to the south else { //If obstacle to the south in maze if (maze[row + 1][col] == 1) { result *= probFalseNoObstacle; } //If no obstacle to the south in maze else { result *= probSenseNoObstacle; } } return result; } //Use evidence conditional probability P(Zt|St) void sensing(int evidence[4]) { float denominator = 0; //Calculates denominator for (int r = 0; r < ROWS; r++) { for (int c = 0; c < COLS; c++) { if (maze[r][c] != 1) { denominator += sensingCalculation(evide
nce, r, c) * probs[r][c]; } } } for (int row = 0; row < ROWS; row++) { for (int col = 0; col < COLS; col++) { //If the current space isn't an obstacle if (maze[row][col] != 1) { float currentProbabilty = probs[row][col]; float numerator = sensingCalculation(evidence, row, col) * currentProbabilty; float result = numerator / denominator; probs[row][col] = result; } } } } //Use transition probability P(St|St-1) void motion(int direction) { for (int row = 0; row < ROWS; row++) { for (int col = 0; col < COLS; col++) { if (maze[row][col] != 1) { float total = 0.0; //north if (direction == 1) { //checking west if (maze[row][col - 1] != 1) { total += probs[row][col - 1] * 0.1; } else { total += probs[row][col] * 0.1; } //checking north if (maze[row - 1][col] != 1) { total += probs[row - 1][col] * 0; } else { total += probs[row][col] * 0.8; } //checking east if (maze[row][col + 1] != 1) { total += probs[row][col + 1] * 0.1; } else { total += probs[row][col] * 0.1; } //checking south if (maze[row + 1][col] != 1) { total += probs[row + 1][col] * 0.8; } else { total += probs[row][col] * 0; } } //west else if (direction == 0) { //checking west if (maze[row][col - 1] != 1) { total += probs[row][col - 1] * 0; } else { total += probs[row][col] * 0.8; } //checking north if (maze[row - 1][col] != 1) { total += probs[row - 1][col] * 0.1; } else { total += probs[row][col] * 0.1; } //checking east if (maze[row][col + 1] != 1) { total += probs[row][col + 1] * 0.8; } else { total += probs[row][col] * 0; } //checking south if (maze[row + 1][col] != 1) { total += probs[row + 1][col] * 0.1; } else { total += probs[row][col] * 0.1; } } motionPuzzle[row][col] = total; } else { motionPuzzle[row][col] = -1; } } } for (int r = 0; r < ROWS; r++) { for (int c = 0; c < COLS; c++) { probs[r][c] = motionPuzzle[r][c]; } } } void printPuzzle(float puzzle[ROWS][COLS]) { for (int row = 0; row < ROWS; row++) { for (int col = 0; col < COLS; col++) { if (puzzle[row][col] == -1) cout << "##### "; else cout << setprecision(2) << fixed << puzzle[row][col] * 100.0 << " "; } cout << endl; } } int main() { //Initial probability matrix for (int row = 0; row < ROWS; row++) { for (int col = 0; col < COLS; col++) { if (maze[row][col] == 0) { probs[row][col] = (1.0 / 38); } else { probs[row][col] = -1; } } } printPuzzle(probs); cout << endl; int s1[4] = { 0, 0, 0, 0 }; sensing(s1); printPuzzle(probs); cout << endl; //1 = north motion(1); printPuzzle(probs); cout << endl; int s2[4] = { 1,0,0,0 }; sensing(s2); printPuzzle(probs); cout << endl; //1 = north motion(1); printPuzzle(probs); cout << endl; int s3[4] = { 0,0,0,0 }; sensing(s3); printPuzzle(probs); cout << endl; //0 = west motion(0); printPuzzle(probs); cout << endl; int s4[4] = { 0,1,0,1 }; sensing(s4); printPuzzle(probs); cout << endl; //0 = west motion(0); printPuzzle(probs); cout << endl; int s5[4] = { 1,0,0,0 }; sensing(s5); printPuzzle(probs); cout << endl; return 0;