distributed problem solving