You seem to have two main issues here:
- There is not a 1-to-1 relationship between facebook accounts (id) and voting entities (people)
- Voting entities are using their votes in ways that you do not expect.
Issue #1 is solved by various forms of limiting (See: StackExchange voting success). Basically, you should choose some criteria from facebook profiles that generally distinguish "fake" accounts from "real" accounts. There are a number of possibilities for this.
- Account creation date
- Number of friends
- Total account activity
- Amount of profile information available
- Participation in a invite-only group
You can mix and match any of these items. I'm sure this problem has been tackled before in many different spheres--you might be able to find existing heuristics made publicly available to solve this. This may be only a small obstacle for many spammers, but until Facebook implements a solution for this issue, it is probably good enough to try to filter on your own.
Issue #2 is more of a social problem. There is probably not a solution to this. If you allow the freedom of voting to every person, they will vote in any way they please, for any reason. This may just be a perception issue on your part. Depending on the problem you're trying to solve with this voting system, you may be able to use another solution.
Some alternatives which may apply:
- Embrace the fact that people want to enlist friends to help. Have a Referral contest. Referral-based contests happen all the time, and work generally well.
- Don't use votes--have the contest be single-entry, random victory--Where everyone gets an equal chance to win. If part of an entry is a unique piece of information (like an address or telephone number), there will be no duplicate entries. Alternatively, judge entries instead of using vote systems.
Of course, it's possible that neither of those could help, depending on your problem. Hopefully they can help you look in the right direction, though.