One noted issue with a basic tree search algorithm is that:
Given a cube that is only 3 moves scrambled, and given a max depth of 7 to look into, a tree search would commonly try far too many potential solutions.
One way to solve this issue is to use an iterative deepening solution. Essentially, it's just a small wrapper around the basic tree search, raising the max depth provided by 1 in each call and hoping for some solutions.
let IDASearch scrambledState maxDepth (movesAllowed: CubeTransformation list) = let mutable solutions =  for a in 1 .. maxDepth do if solutions.IsEmpty then let treeSearchResponse = BasicTreeSearch scrambledState a movesAllowed if not treeSearchResponse.IsEmpty then solutions <- treeSearchResponse solutions
[<Fact>] let ``Scrambled cube should be solvable`` () = let depth = 3 let scrambledCube = Scramble solvedCube Movesets.MoveSets.All depth let actualCube = fst scrambledCube let response = IDASearch actualCube depth Movesets.MoveSets.All (response |> List.length) > 0 |> should equal true