If the goal is:
1) Minimize number of edges.
2) Minimize distance.
In that order, then one thing you can try like this:
1) Draw a line from start to end.
2) Calculate every object that your line collides with.
3) For each of those objects, calculate both points perpendicular to the object that allow you to split the path into two path segments. You can do this for rectangles by splitting the line into two segments, for the segment A seeing which of the four corners it can pass through, for the segment B seeing which of the four corners it can pass through and trying all combinations until you find the two that gives the least displacement. For circles, I forget how to do it, but there's only one solution on either side where the two path segments are flush to the circle, so you can do it using trigonometry or something (I'll try and figure it out :) )
For both new paths, call 4) in a recursive branching fashion.
4) For both line segments you've generated, repeat the calculation until there are no collisions left. Similar to A*, you should calculate for paths that seem the best, first (have the fewest collisions left, or just do shallowest first if that's too hard).
5) Pick the best path via whatever metric you please. In an A* fashion you should keep your list sorted so the path that's the best via your metric is on top, and so you can just pick the first path to finish.
I can't prove in my head that this will always work, but I've seen something similar to it before.
EDIT
To calculate the closest path of two line segments in one direction around a circle, do for each line segment
-Side A: Goes from start of line (or end of line) xs,ys to circle's center xc,yc, length = a
-Side B: goes from center xc,yc to somewhere on the circumference, so length = r
-Side C: goes from side B's endpoint to xs,ys (hypotenuse)
The angle formed by A and B is a right angle, and we know A and B's length, so we can calculate C's length as sqrt(A^2+B^2)
Finally, we know C's length = A's length/sin(angle(B to C)) = B's length/sin(angle(A to C)), meaning we can do trigonometry to find out the angle A to C and the angle B to C.
This lets us fully construct one side of the path segment. Repeat for the other side, and we have the path split in two that is flush on both segments against the circle -> minimizes distance added.