Balancing Scientist Needs and Volunteer Preferences in Volunteer Computing Using Constraint Optimization