«««

28 listopada 2010

Plan doskonały

Kiedy byliśmy w szkole układano za nas plan nauki. Wszystko miało swój ściśle określony czas i miejsce. Teraz samemu trzeba to ogarnąć. Powiedzmy, że masz w tygodniu kilka wolnych godzin, które chcesz przeznaczyć na naukę nowych rzeczy. Niestety te wolne godziny pojawiają się nieregularnie, więc nie sposób ustalić: "w środy o 18 biegam do wielkiego dębu". Przy jednym zadaniu to nie problem: "zajmę się tym jak będę miał wolny czas". A co jeśli takich cyklicznych zadań jest więcej? Przy założeniu, że wszystkie są dla nas jednakowo ważne, można zajmować się nimi na zmianę:
pisanie bloga, siłownia, prace społeczne...
pisanie bloga, siłownia, prace społeczne...
pisanie bloga, siłownia, prace społeczne ... itd.

W praktyce jednak są ważniejsze i mniej istotne zajęcia, a my mamy listę wypełniającą nasz czas jeszcze na długo po naszej śmierci. Nawet jeśli okroimy tę listę w granicach rozsądku, wybierając ~5 rzeczy, którymi chcemy się zająć, to pozostaje problem zaplanowania wykonania. Rozwiązaniem może być samoorganizująca się lista zajęć. Że co?! Tak, samoorganizująca. Tak mnie jakoś oświeciło banalne rozwiązanie, kiedy wpatrywałem się w słupki tańczącego histogramu z poprzedniego wpisu. Wszystko co nam potrzeba to przypisać wagi do zadań i z każdym cyklem ja pomnażać.

Przykład:
Mamy plan uczyć się w wolnym czasie o fedorze, windowsie, programowania w pythonie i powłoce oraz wyrażeń regularnych. Nie wiadomo w co ręce włożyć, prawda? Zapiszmy to jedno pod drugim z wagą na ile jest dla nas istotne:

fedora 4
windows 2
python 6
bash 3
regexp 5

Co ma największą wagę? → python

No to zajmijmy się tym, już bez różnicy czy przez najbliższe 1-2h, czy może odmierzając 3 rozdziały książki. Jednostka wedle widzi mi się.
Co teraz? Zwiększamy dorobek o początkową wagę. Tym zadaniom, które musiały czekać, waga się sumuje, a python z chwilą wybrania stracił dorobek punktowy, więc dodajemy do zera.

fedora 4 4+4=8
windows 2 2+2=4
python 6 0+6=6
bash 3 3+3=6
regexp 5 5+5=10

Co ma największą wagę? → regexp

Ciekawe jak dalej się to ułoży i czy to ma sens.

fedora 4 8 12 4 8 12 16 20 4 8 12 16 20 4 8 12
windows 2 4 6 8 10 12 14 16 18 2 4 6 8 10 12 14
python 6 6 12 18 6 12 18 6 12 18 24 6 12 18 24 6
bash 3 6 9 12 15 3 6 9 12 15 18 21 3 6 9 12
regexp 5 10 5 10 15 20 5 10 15 20 5 10 15 20 5 10

Jak widać zadania same wpadają we własny rytm. Odstępy są nieregularne, ale adekwatne do początkowej wagi. W tym systemie nawet zadanie z bardzo małą wagą, kiedyś doczeka się swojego czasu. Może się zdarzyć, że kilka zajęć uzyska taką samą sumę np. 12. Wówczas można wybrać pierwsze z brzegu, albo (bardziej matematycznie) wykonać to, które miało początkowo większą wagę.

Prosta matematyka, a jaka doskonała.

Przykład: wybierz edytor na dziś ;P

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import os, pickle

tasks={ 'geany':'7',
        'emacs':'5',
        'vim'  :'4',
        'nano' :'3',
        'gedit':'2',
        'kate' :'1'}

old={}
new={}

db=os.getenv("HOME")+"/.editor.db"

# load saved
try:
    with open(db, 'r') as f:
        old = pickle.load(f)
except Exception, e:
    old = tasks

for k,v in tasks.items():
    suma = int(v)
    try:
        suma += int(old.get(k))
    except Exception, e:
        pass
    new[k] = suma

current = max(new,key = lambda x: new.get(x))
new[current] = 0

# save new
with open(db, 'w') as f:
    pickle.dump(new,f)

# return current task
print current

Brak komentarzy: