WPI Worcester Polytechnic Institute

Computer Science Department
------------------------------------------

CS4341 Introduction to Artificial Intelligence 
HOMEWORK 1 - SOLUTIONS - C 2000

By Kannan Gangadharan, Weiyang Lin, Jason Reposa, and Prof. Carolina Ruiz 

------------------------------------------


Problem 1 (40 points + extra-points): Problem Solving Strategies

Consider the following puzzle (taken from Russell and Norvig's textbook, 1995)

This puzzle consists in finding a substitution of the letters F, O, R, T, Y, E, N, S, I, X by digits such that when each of these letters is replaced by the corresponding digit, the following sum is still arithmetically correct.

FORTY
+ TEN
+ TEN
-----
SIXTY

This puzzle has solutions. One of them is

F = 2, O = 9, R = 7, T = 8, Y = 6, E = 5, N = 0, S = 3, I = 1, X = 4

since:

29786
+ 850
+ 850
-----
31486

is arithmetically correct. Solutions to the puzzle should not repeat digits.

Your mission is to:

  1. Design a computer system that uses the generate-and-test strategy to solve this puzzle.
  2. Write a computer program using any high level programming language (Lisp, Prolog, C, C++, ...) that implements the system you designed to solve this puzzle. Your program must run in the CCC machines.
  3. You will receive extra credit if:
  4. For this problem, you need to "turnin" the following material by the deadline:

Solution - By Kannan Gangadharan

We need to generate and test every possible combination of digits from 0 to 9 to the alphabets F, O, R, T, Y, E, N, S, I and X. However it is possible to optimize the solution by loking carefully at the problem.

N and E both can take each one of two values 0 or 5. But since in the tens digit addition we need T + 2E + (carry over from units digit) = T or (10+T) hence N = 0. It follows that E = 5. Further in the thousands digit addition we have O + (carryover from hundreds place) = 10 + I. Since N = 0 hence I = 1. It follows that 0 = 9. Using this knowledge helps us to develop an informed generator. The generator is complete if we test and exhaust all possible permutations of values for the alphabets that satisfy the contraints mentioned above.

The code presented below implements a complete, informed generator. Each combination generated is tested on the fly instead of storing the combinations. The generator is non-redundant as it produces all the possible combinations in a proper sequence thus making sure that no combination is generated twice.

The code is as follows.


#include"stdio.h"
#include"math.h"


// By nature of the problem some variables can have only selected values.
// N = 0; E = 5; O = 9; I = 1;
// Using this in the generator makes it informed.

int N = 0;
int E = 5;
int O = 9;
int I = 1;
int F, R, T, Y, S, X;

main()
{
  generate();
}

generate()
{
  for(F=2;F<=8;F++) {
    if (F==E) F++;
    for(R=2;R<=8;R++) {
      if ((R==F)||(R==E)) R++;
      if ((R==F)||(R==E)) R++;
      if (R>8) continue;
      for(T=2;T<=8;T++) {
	if ((T==F)||(T==R)||(T==E)) T++;
	if ((T==F)||(T==R)||(T==E)) T++;
	if ((T==F)||(T==R)||(T==E)) T++;
	if (T>8) continue;
	for(Y=2;Y<=8;Y++) {
	  if ((Y==F)||(Y==R)||(Y==T)||(Y==E)) Y++;
	  if ((Y==F)||(Y==R)||(Y==T)||(Y==E)) Y++;
	  if (Y>8) continue;
	  for(S=2;S<=8;S++) {
	    if ((S==F)||(S==R)||(S==T)||(S==Y)||(S==E)) S++;
	    if ((S==F)||(S==R)||(S==T)||(S==Y)||(S==E)) S++;
	    if ((S==F)||(S==R)||(S==T)||(S==Y)||(S==E)) S++;
	    if ((S==F)||(S==R)||(S==T)||(S==Y)||(S==E)) S++;
	    if ((S==F)||(S==R)||(S==T)||(S==Y)||(S==E)) S++;
	    if (S>8) continue;
	    for(X=2;X<=8;X++) {
	      if ((X==F)||(X==R)||(X==T)||(X==Y)||(X==E)||(X==S)) X++;
	      if ((X==F)||(X==R)||(X==T)||(X==Y)||(X==E)||(X==S)) X++;
	      if ((X==F)||(X==R)||(X==T)||(X==Y)||(X==E)||(X==S)) X++;
	      if ((X==F)||(X==R)||(X==T)||(X==Y)||(X==E)||(X==S)) X++;
	      if ((X==F)||(X==R)||(X==T)||(X==Y)||(X==E)||(X==S)) X++;
	      if ((X==F)||(X==R)||(X==T)||(X==Y)||(X==E)||(X==S)) X++;
	      if (X>8) continue;
	      test();
	    }
	  }
	}
      }
    }
  }
}

test()
{
  int FORTY, TEN, SIXTY,RHS;
  FORTY = (F*10000+O*1000+R*100+T*10+Y);
  TEN = (T*100+E*10+N);
  SIXTY = (S*10000+I*1000+X*100+T*10+Y);
  
  RHS = FORTY + TEN + TEN;
  if (SIXTY == RHS)
    printf("FORTY - %d\nTEN - %d\nSIXTY - %d\n\n", FORTY,TEN,SIXTY);   
}

The only solution generated is -
FORTY - 29786
TEN - 850
SIXTY - 31486

Additional Comments: By Weiyang Lin

  1. S should be F + 1;
  2. Your tester only need to test R + T + T = 20 + X.

Problem 2: Search (60 points)

Consider the graph on page 634 (figure E4.1) of your textbook. S denotes the starting state and G denotes the goal state. The number attached to each edge in the graph represents the COST of traversing the edge. Assume also that the ESTIMATED distances to the goal are given by the following table:
FROM TO ESTIMATED DISTANCE
S G 10
A G 8
B G 5
C G 1.4
D G 9
E G 6
F G 2
G G 0
For EACH of the following search methods show the search tree as it is explored/expanded by the method until it finds a path from S to G. Number the nodes in the order in which they are expanded by each method. Show your work.
  1. Depth 1st
  2. Breadth 1st
  3. Depth-limited Search (depth-limit = 3)
  4. Iterative Deepening Search
  5. Branch-and-bound (= Uniform Cost Search)
  6. Greedy Search (= Best 1st Search)
  7. A*
  8. Hill-climbing
  9. Beam Search (m = 2)

Solutions - By Jason Reposa (a student in the course) Thanks Jason!!

    Depth 1st
         

         
    Breadth 1st
     

         
    Depth-limited Search (depth-limit = 3)
     

         
    Iterative Deepening Search
     

         
    Branch-and-bound (= Uniform Cost Search)
     

         
    Greedy Search (Best 1st Search)
     

         
    A*
     

         
    Hill-climbing
     

         
    Beam Search
     

         

Problem G: Additional Graduate Credit Problem (20 points)

We have computed optimal paths under the assumption that COSTS are non-negative. Suppose that we remove that assumption. Discuss how allowing some of the costs to be negative would affect the search methods below, and illustrate the effects of this change with examples.
  1. Depth 1st
  2. Breadth 1st
  3. Depth-limited Search
  4. Iterative Deepening Search
  5. Branch-and-bound (= Uniform Cost Search)
  6. Greedy Search
  7. A*
  8. Hill-climbing
  9. Beam Search
  10. Best 1st Search (= Greedy Search)

Solutions - By Weiyang Lin