sorting tasks by importance and urgency

A

Alia Khouri

I recently considered the apparently simple problem is of how to
algorithmically sort a set of business tasks which have an associated
a value and a due_date, such that the most important and urgent are
pushed to the top of the stack.

The two example task types I am posing here are: (1) a bid on a
contract and (2) leaverequest from an employee.

To sort by importance: I just consider the proportional value of each
task in relation to the total value of tasks.

To sort by urgency: I used something along the lines of excel's
percentrank function (http://office.microsoft.com/en-us/excel/
HP052092121033.aspx) to rank the tasks in percentage terms of the set
of days_to delivery.

The code is pretty self-explanatory, and I think the algorithm seems
to work ok so far, but in case I have missed something or there exists
some better way of doing this...

<priority.py>
from datetime import date

weights = {
'Tender' : 1.0,
'LeaveRequest': 0.1
}

rnd = lambda x: round(x,2)

class Task(object):
"""a simple prioritizing Task class"""

def __init__(self, kind, value, due_date=None):
self.kind = kind
self.value = value
self.due_date = due_date if due_date else date.today()
self.weight = weights[kind]
self.urgency = 0.0
self.importance = 0.0

def __repr__(self):
return '<Task: %5s - %4s - %5s - %12s - %3s - %s>' % (
rnd(self.priority), rnd(self.importance), rnd
(self.urgency),
self.kind, self.days_to, self.value)

def __cmp__(self, other):
return cmp(self.priority, other.priority)

@property
def days_to(self):
return (self.due_date - date.today()).days

@property
def priority(self):
return self.weight * (self.importance + self.urgency)

def relative_urgency(self, N, due_days):
rank = due_days.index(self.days_to)
return float(rank) / (N - 1)

def relative_importance(self, total_value):
return self.value / total_value

@staticmethod
def prioritize(tasks):
print ("<Task: priority - importance - urgency - "
"kind - days_to - value>\n")
N = len(tasks)
total_value = sum(t.value for t in tasks)
due_days = sorted([t.days_to for t in tasks], reverse=True)
for i in tasks:
i.importance = i.relative_importance(total_value)
i.urgency = i.relative_urgency(N, due_days)

for i in sorted(tasks, reverse=True):
print i

tasks = [
# name value due_date
Task("Tender", 1000000.0, date(2009,4,1)),
Task("Tender", 500400.0, date(2009,5,1)),
Task("Tender", 1000000.0, date(2009,6,1)),
Task("LeaveRequest", 0.0, date(2009,7,1)),
Task("LeaveRequest", 0.0, date(2009,8,1)),
]


if __name__ == '__main__':
Task.prioritize(tasks)

</priority.py>

regards,

AK
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,772
Messages
2,569,591
Members
45,103
Latest member
VinaykumarnNevatia
Top