I'm no expert on pathfinding, so I can't vouch for the integrity of these methods, but it's the system I conceived for use in my own game I've been considering making.
So you've got a dwarf or animal that suddenly decides it needs to get from point A to point B.
Step 1 is to use A* to find a path from A to B, if one exists. If a path does not exist, the dwarf cancels whatver action it needed the path for. The intelligence of the creature would have a weight on how strong the influence of the Steven van Dijk heuristic is upon the calculation. (The Steven van Dijk heuristic causes the path to follow a straight line upon the grid rather than an equally long movement along a more staggered path)
Step 2 involves finding which nodes along the generated path have an uninterrupted path between them and records only these "important" nodes. Fig. 1 illustrates the full A* path, fig. 2 demonstrates the result.
Figure 1:
#############
# xxx #
# x###x #
# x # # x ##########
# x # # xxxxxxxxB #
# A # ##############
#######
Figure 2:
#############
# X X #
# ### #
# # # ##########
# # # X B #
# A # ##############
#######
Step 3 sees the dwarf travelling a simple straight line from one node to the next.
Although this adds a bit of time for te initial computation, its effect becomes prominent when the path becomes somehow altered.
So let's suppose that the path has been interrupted - say a door locked or a bridge retracted, but for the sake of example, another, different path has been opened up. In any case, we end up with fig. 3.
Figure 3:
#############
# X#X #
# ### #
# # # ##########
# # # X B #
# A # ## ###########
#### # # #
# #### #
# #
#########
For a small example such as this, the effect is less darastic, but here's what happens.
The original path is remembered, but a new path is construced. However, this path is no longer from A to B, but rather from the node the dwarf's current position to the next node on the path. The newly constructed A* path should look like this:
Figure 4:
#############
# ☻#X #
# x### #
# x # # ##########
# x # # X B #
# Ax # ##x###########
####x # #x#
# x####x#
# xxxx #
#########
If the following node can't be reached, it does a check on B to ensure the target is still reachable, then goes down the line until it finds the next reachable node. The disadvantage is that the path ends up being longer - but the movement does become more natural and less artificial.
And, of course, the reduction is performed on this new path, as well, as portrayed in fig. 5.
Figure 5:
#############
# ☻# #
# ### #
# X # # ##########
# # # X B #
# A # ## ###########
####X # # #
# #### #
# X X #
#########