instructions attached below
#include <iostream>
#include <iomanip>
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(evidence, 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;
}