I think there is a technical fix: two orthogonal upvotes. One upvote/downvote pair for agreement, another for whether the post/comment added value. It's a pretty simple fix and I think it would work, but it could have other unwanted side-effects.
This could still perhaps be solved technically, although it would take a lot of effort and is probably not worth it.
You can detect cheaters. People who give up/downvotes on the "value add" dimension that are not well correlated with the community's opinion of value add would be detected as cheaters, or at least detected as users who do not share the same values as the community.
Much harder to do, but possible, is to detect cheating in agreement by analyzing trends. Users who agreed with story A, B, and C may have a 90% chance of agreeing with story D. A user who bucks these trends enough can be detected as cheating or randomly voting.
The best rule on whether to upvote I've seen is this:
http://wiki.lesswrong.com/wiki/FAQ#What_are_the_moderation_r...
"Please do not vote comments up or down based mainly on whether you agree with them, unless the comment consists of a proposal and you wish to register your opinion regarding the proposal.
"Instead, vote on comments to the degree to which they improve the accuracy of your map. For example, a comment that you agree with that says nothing new should be voted down or left alone. A comment you initially disagree with that causes you to update some in favor of the author's opinion should be voted up."