I've only had three that didn't want to go ahead. One was nervous, I stayed to try to coax him but he couldn't get there. I already had the money so gave some back and kept the rest. One freaked out when I arrived, gave me the full fee and asked me to leave. One realised I wasn't what he was expecting and was very apologetic. I said "no problem, ?50 please" which he didn't mind handing over.
(Oh actually there was one before all those where I just had to leave and didn't get any money. Turned out it was part of a game of his.)
Anyway, I don't really have experience of making people give me money, but I'm pretty sure it's just a matter of social pressure and sometimes authority.
You can get a fee out of the nervous ones, and you should because as you say they've messed with your schedule. Tell them you understand but they need to pay ?x, and they probably will as quick as they can so they can shuffle off. This should often work with the non-nervous too since people are inclined to do as they're told to an extent. If you can do authoritative it'll work on more people, but in any case be matter-of-fact and not shy or apologetic about asking. You can do this on an incall or outcall, but obviously you pay attention in case it starts looking unsafe.
If you terminate the booking then I think you need to be generous about what you give back unless they've seriously broken the rules (so being under the influence could come under that if you make it really clear that it's not tolerated), and you're only keeping money for services received, not for wasting your time. Hopefully in that case they won't think you're being unfair and will just bugger off with the money you've given back.