I think an anecdote would be most useful here.
This summer, I was a mentor for x264 under Google Summer of Code. We had four projects and four students total. One student, who I considered the most promising and who did the best job on the qualification tasks, literally disappeared without warning on the first week. The worst part is that he was assigned to the task I considered the most important.
I complained about this for quite a while. Who was he to pick up and leave after receiving the initial stipend? But despite this, I looked at the project and didn't do it. Because despite it being the most important of any project on my TODO list, and despite the fact that it probably wasn't that difficult, I just had subconsciously convinced myself that I didn't want to do it.
One day, about halfway through August, when I had few other obligations at work (and yes, I was working on x264 for a job), I woke up and told myself that I was going to do this project. I talked with the main developer, discussed a dynamic programming solution to the problem, and conversed until I fully understood the concept. I talked to a coworker and mapped it out on a whiteboard. I wrote an extremely simple Java prototype that used arbitrary costs for each possible solution path and tested the dynamic programming solution against the exhaustive exponential-time search. The output matched perfectly.
Then I copied the Java code and converted it to C. It matched perfectly, after some debugging.
Then I finally wrote a function to pass actual costs to the path-finding function, rather than arbitrary values.
And then it worked.
It had taken a week of hard work, but I had done it, despite having convinced myself repeatedly that I was never going to do this project. How did it happen? I think the solution is that eventually you have to get up, tell yourself that you are going to do something. Do every step of the process as if it was the only step; coming up with a plan isn't too hard, so just do that now. Oh, you have a plan done? Now you can write a prototype, converting pseudocode into Java isn't very hard. Oh, the Java's done and working? Come on, you can port that to C, that's trivial. Oh, the C's done? Well all you have to do is write an interface to the already-existing cost function! Of course you can do that.
And by telling myself that, I managed to actually do it. Somehow.