ࡱ>  I)); ); @FOR( TASKS( I): SLACK( I) = LS( I) - ES( I)); ES( 1) = 0; LTASK = @SIZE( TASKS); LS( LTASK) = ES( LTASK); ENDMODEL: SETS: TASKS: TIME, ES, LS, SLACK; PRED( TASKS, TASKS); ENDSETS DATA: TASKS = @ODBC( 'PERTODBC', 'TASKS', 'TASKS'); PRED = @ODBC( 'PERTODBC', 'PRECEDENCE', 'BEFORE', 'AFTER'); TIME = @ODBC( 'PERTODBC'); @ODBC( 'PERTODBC', 'SOLUTION', 'TASKS', 'EARLIEST START', 'LATEST START') = TASKS, ES, LS; ENDDATA @FOR( TASKS( J)| J #GT# 1: ES( J) = @MAX( PRED( I, J): ES( I) + TIME( I)) ); @FOR( TASKS( I)| I #LT# LTASK: LS( I) = @MIN( PRED( I, J): LS( J) - TIME(Root EntryCONTENTS Root Entry*0_^ 6e Contentsd   \par LTASK = \cf1 @SIZE\cf2 ( TASKS); \par LS( LTASK) = ES( LTASK); \par \cf1 END\cf2 \par } {\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Courier New;}} {\colortbl ;\red0\green0\blue255;\red0\green0\blue0;} \viewkind4\uc1\pard\cf1\f0\fs20 MODEL\cf2 : \par \cf1 SETS\cf2 : \par TASKS: TIME, ES, LS, SLACK; \par PRED( TASKS, TASKS); \par \cf1 ENDSETS\cf2 \par \par \cf1 DATA\cf2 : \par TASKS = \cf1 @ODBC\cf2 ( 'PERTODBC', 'TASKS', 'TASKS'); \par PRED = \cf1 @ODBC\cf2 ( 'PERTODBC', 'PRECEDENCE', 'BEFORE', 'AFTER'); \par TIME = \cf1 @ODBC\cf2 ( 'PERTODBC'); \par \cf1 @ODBC\cf2 ( 'PERTODBC', 'SOLUTION', 'TASKS', \par 'EARLIEST START', 'LATEST START') = \par TASKS, ES, LS; \par \cf1 ENDDATA\cf2 \par \par \cf1 @FOR\cf2 ( TASKS( J)| J #GT# 1: \par ES( J) = \cf1 @MAX\cf2 ( PRED( I, J): ES( I) + TIME( I)) \par ); \par \par \cf1 @FOR\cf2 ( TASKS( I)| I #LT# LTASK: \par LS( I) = \cf1 @MIN\cf2 ( PRED( I, J): LS( J) - TIME( I)); \par ); \par \par \cf1 @FOR\cf2 ( TASKS( I): SLACK( I) = LS( I) - ES( I)); \par \par ES( 1) = 0;