[kplato] pert/cpm calculation (was Re: kplato)

Dag Andersen danders at get2net.dk
Mon Mar 8 12:18:26 CET 2004


Ok, based on what we have discussed I've fleshed out some thoughts.

If we separate pert/cpm calculation code from the nodes but allow the 
code to call the nodes methods, I think the following should be 
possible. If you want to insulate the code more, we need some sort of  
interface class. It will depend as much (more?) on your code as on 
'kplato' code, I think. What do you think?
(I haven't considdered monte carlo or any other distribution methods 
as I know nothing about it:)

(Note that pert_ is prepended for all methods that is only used by 
pert/cpm calculation)

To start calculation:
pert_calculate(KPTProject &project, KPTEffort::EffortType effortType);
EffortType: Expected, Optimistic, Pessimistic.
You'll have to traverse the project to get all the data you need.

Then this pert_calculation method will have to call the following:

To find out if you shall calculate from a start date or a finish date:
direction = project.pert_direction(); 

To get the duration of a node:
node->pert_duration(effortType, direction);
The duration is calculated dependent on effort and availability of 
requested resources. If the task has slack, the duration may not be 
correct but it should always stay within duration+slack. (Duration 
will be corrected later on).
I plan to allow resource overbooking here (for now?). Then the user 
can resolve conflicts manually. 

I'm not sure where to eventually put more advanced resource analysis.

To get at the constraints of a node:
node->constraint();
If the constraint is ASAP or ALAP; no matter.
If it's StartNotEarlier, FinishNotLater, MustStartOn or MustFinishOn 
you need the time:
node->constraintTime(); 

To set earliestStart/latestFinish:
node->setEarliestStart(time);
node->setLatestFinish(time);

To get a nodes list of child relations:
node->dependChildNodes();

To get the relation type:
relation->timingRelation();

To get the lag for a relation:
relation->lag();

To set errors:
node->setError(error);
Type of 'error' to be defined...

To find out when to start/finish the node (within 
earliestStart/latestFinish) and to calculate correct duration:
node->pert_setStartFinish();

To get the type of node:
node->type();
which can be: Type_Project, Type_Subproject, Type_Task, 
Type_Milestone, Type_Periodic, Type_TerminalNode, Type_Summarytask.
Type_TerminalNode I think you will make disappear, Type_Subproject and 
Type_Periodic are not implemented yet.
Type_Project, Type_Subproject, Type_Summarytask can have children.

To get a nodes list of children:
node->childNodeIterator();

-- 
Mvh,
Dag Andersen


More information about the kplato mailing list