;;;;assign-tasks
;;;
;;; A program to assign a given list of tasks to people
;;; depending on their skills and time they have available.
;;; There is no real error checking that initial parameters
;;; are in the proper format.
;;;
;;; Author: Zach Tomaszewski
;;; Date: 21 October 2002
;;;
;;;assign-tasks
;;; Takes a list of tasks to do: (taskname tasktype tasktime)
;;; followed by a list of people and their hours: (person . hours)
;;; followed by a list of people capable of each task type:
;;; (tasktype (person person))
;;; Returns a list of assigned tasks: (taskname person)
;;; if all tasks can be assigned, otherwise return 'FAIL
(defun assign-tasks (tasks people capable)
(cond
((null tasks)())
(t
(assign-one-task
(car tasks) ;the one task
(cadr (assoc (cadr(car tasks)) capable )) ;those capable of it
(cdr tasks) people capable ;the rest of the tasks and info
)
)
)
)
;;;assign-one-task
;;;Takes:
;;; a single task to assign: (taskname tasktype tasktime)
;;; a list of people eligible/capable to do that task: (person ...)
;;; the list of the rest of the tasks to assign: (taskname tasktype tasktime)
;;; the list of times each person has: (person . hours)
;;; and the list of people capable of each task type:
;;; (tasktype (person person))
;;;Returns:
;;; the assignment of the current single task (taskname person)
;;; concatanated to the assignments of rest of the tasks
;;;; (by calling assign-tasks).
;;; If assignment of all tasks is impossible, returns fail.
(defun assign-one-task (onetask eligible tasks people capable)
;;if eligible is null or no time for the person, we can't assign this task
(if (or (null eligible) (null (assoc (car eligible) people) ))
'FAIL
;;...otherwise
;;if first eligible person has enough time
;; and such an assignment doesn't throw everything off
(if (and (>= (cdr (assoc (car eligible) people))
(caddr onetask))
(not (equal 'FAIL (assign-tasks tasks
(reduce-hours (car eligible) (caddr onetask) people)
capable))
)
)
;;then return this match along with the next
(cons (list (car onetask)(car eligible))
(assign-tasks tasks
(reduce-hours (car eligible) (caddr onetask) people)
capable)
)
;;else move along the eligible list
(assign-one-task onetask (cdr eligible) tasks people capable)
)
)
)
;;;Given a name, an amount to reduce by, and list of (people . hours) pairs,
;;; this function will return the list with that person's hours reduced.
(defun reduce-hours (name hours people)
(substitute (cons name (- (cdr (assoc name people)) hours))
(assoc name people)
people
)
)
| ~ztomasze Index : TA
: Assignment 2 : Solution http://www2.hawaii.edu/~ztomasze |
Last Edited: 27 Nov 2002 ©2002 by Z. Tomaszewski. |