Algorithms Sample Test 2

Question 1. (30 points)

a) Outline (in English) a **greedy** algorithm that takes a CNF (conjunctive normal form) Boolean expression and determines a truth assignment of Boolean variables that makes the expression true. For example, a Boolean expression in CNF is

and the truth assignment of satisfies it.

(NOTE: Your greedy algorithm does not need to find this particular true assignment for this example.)

b) Will your greedy algorithm in part (a) above always find a truth assignment if one exists? (Justify your answer)

Question 2. (30 points)

Design a **backtracking** algorithm that takes a positive integer C as input and outputs all of the ways that a group of ascending positive numbers can be summed to give C. For example, if C = 10, the output should be

1+2+3+4

1+2+7

1+3+6

1+4+5

1+9

2+3+5

2+8

3+7

4+6

10

a) What should the search-space tree look like for this backtracking algorithm?

b) Describe in English how a promising function should decide if a node is to be pruned or not.

c) What state information is needed at each node in the search-space tree?

d) What information in your answer to part (c) could be kept global?

e) What information does the promising function need?

f) Write the promising function (pseudo-code) for this backtracking algorithm.

f) Below is a template for a backtracking algorithm.

- procedure checknode(v : node);

- begin

- if promising(v) then

- if v is a solution

- write the solution

- else

- for each child u of v do

- checknode(u)

- end for

- end if

- end if

- end checknode

Customize the above template for this problem.

Question 3. (30 points) Longest Common Substring ** **

Let us consider two sequences of characters S_{1} and S_{2}. For example, we could have S_{1} = A$CMA*MN and S_{2} = AXMC4ANB. Assuming that a subsequence of a sequence can be constructed by deleting any number of characters **from any position**, use the

Question 4. (10 points)

Consider the following best-first search Branch-and-Bound template.

- procedure Branch_and_Bound ( T : stateSpaceTree; var best : number)

- var

- PQ : priorityQueneOfNodes;

- u, v : node;

- begin

- initialize(PQ);

- v := root of T;

- best := value(v);

- insert(PQ, v);

- while not empty(PQ) do

- remove(PQ, v)

- if bound(v) is better than best then

- for each child u of v do

- if value(u) is better than best then

- best := value(u);

- end if

- if bound(u) is better than best then

- insert(PQ, u);

- end if

- end for

- end if

- end while

- end Branch_and_Bound

a) Describe in English what the bound value represents?

b) Suppose a student was customizing the above branch-and-bound template for the problem of making change with the fewest number of coins. For a node's bound calculation, they decided to use the following:

bound := (number of coins already returned) + greedy(remaining change to be returned),

where "greedy" returned the number of coins bases on a greedy algorithm that repeatedly gives back the highest denomiation coin possible.

For example, suppose that the initial problem was to return 78 cents using coins with denominations 1, 5, 10, 12, 25, and 50. For the node representing the partial solution of returning one 50 cent and one 12 cent coin, the bound calculated is 7, where 2 is from the partial solution and 5 is from calling greedy(16) (16 = 12 + 1 + 1 + 1 + 1).

i) After extensive testing, the student discovered that this branch-and-bound algorithm did not always find the globally optimal solution. What is the problem with this branch-and-bound algorithm?

ii) Describe a modification to the algorithm so that it will always give a globally optimal solution.