7.7 An Application Example

In this section we will give an example for fuzzy constraint evaluation, stemming from the steelmaking environment as described in Chapter 5. In order not to get lost by the quite complex application properties, we assume a reduced process complexity. In a first step we will state the CSI(C&F) script. Beside the basic structures we have seen in 7.5 the structure of the domain data will be also described.


/* Author : Ulrich Santa


File : LD3.SCR

Project : DynaFLIP++: CSI(C&F)

Start : 13.06.1996

Last Update : 24.07.1996

Comment : Example for fuzzy constraint evaluation in a steelmaking plant

*/

/* import domain data */

IMPORT VARIABLES ld3.dat

/* define table for automatic rule generation */

TABLE ld3.table

/* define OperatorSet for fuzzy operators */

OPERATORSET

IMPORTANCE MINIMUM

AND MINIMUM

OR MAXIMUM

CERTAINTY MINIMUM

INFERENCE MINIMUM

ACCUMULATE MINIMUM

DEFUZZIFICATION COG

GAMMA 1

ACCURACY 10

END

/* define ParameterSets for fuzzy variables */

PARAMETERSET

NAME fuzzy_time

LOWER -1000

UPPER 1000

MEDIAN 0

DISTRIBUTION 0.1


DILATATION 0.5


IMPORTANCE 1.0

TERMS NB N Z P PB

END

PARAMETERSET

NAME fuzzy_chem

LOWER -3

UPPER 3

MEDIAN 0

DISTRIBUTION 0.7

DILATATION 0.7

IMPORTANCE 1

TERMS NB N Z P PB


END

PARAMETERSET


NAME fuzzy_weight

LOWER -100

UPPER 100

MEDIAN 0

DISTRIBUTION 1.0

DILATATION 0.5

IMPORTANCE 1

TERMS NB N Z P PB

END

PARAMETERSET

NAME fuzzy_format

LOWER -10

UPPER 10

MEDIAN 0

DISTRIBUTION 1.0

DILATATION 0.5

IMPORTANCE 1

TERMS NB N Z P PB

END

PARAMETERSET

NAME fuzzy_vacuum


LOWER -5


UPPER 5

MEDIAN 0

DISTRIBUTION 0.5

DILATATION 0.5

IMPORTANCE 1

TERMS NB N Z P PB

END

PARAMETERSET

NAME fuzzy_satisfaction

LOWER 0

UPPER 100

MEDIAN 50

DISTRIBUTION 0.7

DILATATION 1

IMPORTANCE 1

TERMS B Z G

END

/* define fuzzy variables */

FUZZYVAR time fuzzy_time

FUZZYVAR chem_si fuzzy_chem

FUZZYVAR chem_al fuzzy_chem

FUZZYVAR chem_mg fuzzy_chem

FUZZYVAR weight fuzzy_weight

FUZZYVAR format fuzzy_format

FUZZYVAR vacuum fuzzy_vacuum

FUZZYVAR c_vacuum fuzzy_satisfaction

FUZZYVAR c_format fuzzy_satisfaction

FUZZYVAR c_weight fuzzy_satisfaction

FUZZYVAR c_whole_duration fuzzy_satisfaction

FUZZYVAR c_tundish fuzzy_satisfaction

FUZZYVAR c_due_date fuzzy_satisfaction

FUZZYVAR c_chem_mg fuzzy_satisfaction

FUZZYVAR c_chem_si fuzzy_satisfaction

FUZZYVAR c_chem_al fuzzy_satisfaction


FUZZYVAR c_chem_si_al fuzzy_satisfaction


FUZZYVAR c_chem_all fuzzy_satisfaction


/* define structure of evaluation tree */

EVALTREE

LD3_ALL

fuzzy_satisfaction

CHEM OR

DUE_DATE AND

TUNDISH OR

WEIGHT AND

FORMAT AND

DURATION AND

VACUUM AND

END

FOR i = 1 TO domain.aggregates STEP 1

/* initialize casting duration on aggregate[i] */

LET aggregate[i].duration = 800

LET tundish_duration = 0

/* process on all items of the actual aggregate */

FOR j = 1 TO aggregate[i].items STEP 1

/* add duration of item to duration of aggregate */

LET aggregate[i].duration = aggregate[i].duration+item[j].duration

LET tundish_duration = tundish_duration +item[j].duration



/* evaluate due_date-constraint */

IF (item[j].name="JOB") THEN

LET difference = aggregate[i].duration-item[j].due_date

SET time = difference

FUZZYCOMPARE c_due_date IS time < 0

EVAL c_due_date

AGGREGATE DUE_DATE AND c_due_date aggregate[i].job[j]

/* check degassing compatibility of subsequent jobs */


IF (j=1) THEN


LET degassing = item[j].degassing

ENDIF

IF (degassing=item[j].veredelung) THEN

SET vacuum = 1

ELSE

SET vacuum = -(1)

ENDIF

FUZZYCOMPARE c_vacuum IS vacuum > 0

EVAL c_vacuum

AGGREGATE VACUUM AND c_vacuum aggregate[i].job[j]

LET degassing = item[j].degassing

ENDIF

LET succ = j+1

IF (succ>aggregate[i].items) THEN

/* no items left in this aggregate*/

ELSE

IF ((item[j].name="JOB")&(item[succ].name="JOB")) THEN

LET si.min = MAX{item[j].si.min,item[succ].si.min}

LET si.max = MIN{item[j].si.max,item[succ].si.max}

LET si.overlap = si.max-si.min

SET chem_si = si.overlap

FUZZYCOMPARE c_chem_si IS chem_si > 1.4

LET al.min = MAX{item[j].al.min,item[succ].al.min}

LET al.max = MIN{item[j].al.max,item[succ].al.max}

LET al.overlap = al.max-al.min

SET chem_al = al.overlap


FUZZYCOMPARE c_chem_al IS chem_al > 0.6



LET mg.min = MAX{item[j].mg.min,item[succ].mg.min}


LET mg.max = MIN{item[j].mg.max,item[succ].mg.max}

LET mg.overlap = mg.max-mg.min

SET chem_mg = mg.overlap

FUZZYCOMPARE c_chem_mg IS chem_mg > 0.5

FUZZYCONCAT c_chem_si_al IS c_chem_al AND c_chem_si

FUZZYCONCAT c_chem_all IS c_chem_si_al OR c_chem_mg

EVAL c_chem_all


AGGREGATE CHEM AND c_chem_all aggregate[i].job[j][j+1]




/* subsequent jobs should have the same weight */

SET weight = item[j].weight-item[succ].weight

FUZZYCOMPARE c_gewicht IS weight = 0

EVAL c_weight

AGGREGATE WEIGHT AND c_weight aggregate[i].job[j][j+1]

/* only negative format changes should be made */

LET formatchange = item[j].format-item[succ].format

SET format = formatchange

FUZZYCOMPARE c_format IS format > 0

EVAL c_format

AGGREGATE FORMAT AND c_format aggregate[i].job[j][j+1]

ENDIF

ENDIF

IF (item[j].name="TUNDISH") THEN

LET tundish_diff = tundish_duration-240

LET tundish_duration = 0

SET time = tundish_diff

FUZZYCOMPARE c_tundish IS time = 0

EVAL c_tundish

AGGREGATE TUNDISH AND c_tundish aggregat[i].tundish[j]

ENDIF

NEXT j

/* overall casting time should be around 2050 */

SET time = aggregate[i].duration-2050

FUZZYCOMPARE c_whole_duration IS time = 0

EVAL c_whole_duration

AGGREGATE DURATION AND c_whole_duration whole_duration

NEXT i

PRINT "OVERALL SCORE: " PRINT LD3_ALL

EXPORT RULESET ld3.ruleset

EXPORT VARIABLES ld3.varout

EXPORT EVALTREE ld3.eval

EXIT


This program evaluates different groups of constraints for a list of jobs on a continuous caster in a steelmaking plant. The constraints are

On the next pages you can find the tables, which this program needs for automatic rule generation, and the hierarchical EVALTREE structure build up by the program and returned to the scheduler. The generated rules and the structure of the data imported from ld3.scr are also given on the next pages.


COMPARE fuzzy_vacuum fuzzy_satisfaction



< PB B


P B

Z Z

N G

NB G

> PB G

P G

Z Z

N B

NB B

= PB B

P Z

Z G

N Z

NB B


# PB G



P Z


Z B

N Z

NB B

COMPARE fuzzy_format fuzzy_satisfaction

< PB B

P B

Z Z

N G

NB G

> PB G

P G

Z Z

N B

NB B

= PB B

P Z

Z G

N Z

NB B

# PB G

P Z

Z B

N Z

NB B

COMPARE fuzzy_weight fuzzy_satisfaction

< PB B

P B

Z Z

N G

NB G

> PB G

P G

Z Z

N B

NB B


= PB B



P Z



Z G


N Z

NB B

# PB G

P Z

Z B

N Z

NB B



COMPARE fuzzy_time fuzzy_satisfaction


< PB B


P B

Z Z

N G

NB G

> PB G

P G

Z Z

N B

NB B

= PB B

P Z

Z G

N Z

NB B

# PB G

P Z

Z B

N Z

NB B

COMPARE fuzzy_chem fuzzy_satisfaction

< PB B

P B

Z Z

N G

NB G


> PB G



P G


Z Z

N B

NB B

= PB B

P Z

Z G

N Z

NB B

# PB G

P Z

Z B

N Z

NB B

CONCAT fuzzy_satisfaction fuzzy_satisfaction fuzzy_satisfaction

AND G G G

G Z Z

G B B

Z G Z

Z Z Z

Z B B

B G B

B Z B

B B B

OR G G G

G Z G

G B G

Z G G

Z Z Z

Z B Z

B G G

B Z Z

B B B



/* #: 8 */



Branch: LD3_ALL Crisp value: 24.4836



----------------------<End of branch: LD3_ALL>



Branch: CHEM Crisp value: 50


/* #: 6 */

c_chem_all aggregate[1].job[1][2] 51.9002

c_chem_all aggregate[1].job[2][3] 23.7656

c_chem_all aggregate[1].job[3][4] 33.2249

c_chem_all aggregate[1].job[6][7] 39.11

c_chem_all aggregate[1].job[9][10] 46.2728

c_chem_all aggregate[1].job[10][11] 52.6279

----------------------<End of branch: CHEM>

Branch: DUE_DATE Crisp value: 22.067

/* #: 9 */

c_due_date aggregate[1].job[1] 11.5385

c_due_date aggregate[1].job[2] 50

c_due_date aggregate[1].job[3] 50

c_due_date aggregate[1].job[4] 42.8542

c_due_date aggregate[1].job[6] 18.3544

c_due_date aggregate[1].job[7] 22.067

c_due_date aggregate[1].job[9] 88.4615

c_due_date aggregate[1].job[10] 11.5385

c_due_date aggregate[1].job[11] 42.147

----------------------<End of branch: DUE_DATE>

Branch: TUNDISH Crisp value: 24.0933

/* #: 3 */

c_tundish aggregate[1].tundish[5] 50

c_tundish aggregate[1].tundish[8] 79.8842

c_tundish aggregate[1].tundish[12] 11.5385

----------------------<End of branch: TUNDISH>

Branch: WEIGHT Crisp value: 39.7022

/* #: 6 */

c_weight aggregate[1].job[1][2] 42.147

c_weight aggregate[1].job[2][3] 39.7561

c_weight aggregate[1].job[3][4] 88.4615

c_weight aggregate[1].job[6][7] 68.9262

c_weight aggregate[1].job[9][10] 50

c_weight aggregate[1].job[10][11] 50

----------------------<End of branch: WEIGHT>

Branch: FORMAT Crisp value: 22.067

/* #: 6 */


c_format aggregate[1].job[1][2] 42.147



c_format aggregate[1].job[2][3] 50


c_format aggregate[1].job[3][4] 68.9262

c_format aggregate[1].job[6][7] 68.8199

c_format aggregate[1].job[9][10] 88.4615

c_format aggregate[1].job[10][11] 22.067

----------------------<End of branch: FORMAT>

Branch: DURATION Crisp value: 68.8199

/* #: 1 */

c_whole_duration whole_duration 68.8199

----------------------<End of branch: DURATION>

Branch: VACUUM Crisp value: 11.5385

/* #: 9 */

c_vacuum aggregat[1].job[1] 88.4615

c_vacuum aggregat[1].job[2] 88.4615

c_vacuum aggregat[1].job[3] 11.5385

c_vacuum aggregat[1].job[4] 11.5385

c_vacuum aggregat[1].job[6] 88.4615

c_vacuum aggregat[1].job[7] 88.4615

c_vacuum aggregat[1].job[9] 11.5385

c_vacuum aggregat[1].job[10] 88.4615

c_vacuum aggregat[1].job[11] 11.5385


----------------------<End of branch: VACUUM>



/* #: 118 */



domain.aggregates 1 1



domain.name "LD3" 0


aggregate[1].items 12 12

aggregate[1].name "CC_3" 0

item[1].name "JOB" 0


item[1].format 10 10



item[1].due_date 700 700


item[1].weight 20 20

item[1].duration 60 60

item[1].degassing "A" 0

item[1].al.min 0.1 0.1

item[1].al.max 0.8 0.8

item[1].mg.min 1 1

item[1].mg.max 1.2 1.2

item[1].si.min 0.1 0.1

item[1].si.max 1.5 1.5

item[2].name "JOB" 0

item[2].format 12 12

item[2].due_date 880 880

item[2].weight 90 90

item[2].duration 30 30

item[2].degassing "A" 0

item[2].al.min 0.2 0.2

item[2].al.max 0.7 0.7

item[2].mg.min 0.8 0.8

item[2].mg.max 1.2 1.2

item[2].si.min 0.1 0.1

item[2].si.max 1.5 1.5

item[3].name "JOB" 0

item[3].format 11 11

item[3].due_date 945 945

item[3].weight 30 30

item[3].duration 50 50

item[3].degassing "C" 0

item[3].al.min 0.3 0.3

item[3].al.max 0.8 0.8

item[3].mg.min 1.5 1.5

item[3].mg.max 1.8 1.8

item[3].si.min 0.2 0.2

item[3].si.max 1.5 1.5

item[4].name "JOB" 0


item[4].format 9 9



item[4].due_date 955 955


item[4].weight 30 30

item[4].duration 45 45

item[4].degassing "B" 0

item[4].al.min 0.3 0.3

item[4].al.max 1.6 1.6

item[4].mg.min 1.1 1.1

item[4].mg.max 2.2 2.2

item[4].si.min 0.8 0.8

item[4].si.max 1.2 1.2

item[5].name "TUNDISH" 0

item[5].duration 100 100

item[6].name "JOB" 0

item[6].format 10 10

item[6].due_date 1100 1100


item[6].weight 60 60


item[6].duration 80 80


item[6].degassing "B" 0


item[6].al.min 0.3 0.3

item[6].al.max 0.8 0.8

item[6].mg.min 0.9 0.9

item[6].mg.max 1.1 1.1

item[6].si.min 0.2 0.2

item[6].si.max 1.5 1.5

item[7].name "JOB" 0

item[7].format 7 7

item[7].due_date 1130 1130

item[7].weight 30 30

item[7].duration 45 45

item[7].degassing "B" 0

item[7].al.min 0.1 0.1

item[7].al.max 0.4 0.4

item[7].mg.min 0.9 0.9

item[7].mg.max 1.2 1.2

item[7].si.min 1.2 1.2


item[7].si.max 1.5 1.5




item[8].name "TUNDISH" 0

item[8].duration 100 100

item[9].name "JOB" 0

item[9].format 8 8

item[9].due_date 1610 1610

item[9].weight 60 60

item[9].duration 260 260

item[9].degassing "E" 0

item[9].al.min 0.3 0.3

item[9].al.max 0.8 0.8

item[9].mg.min 0.9 0.9

item[9].mg.max 1.1 1.1

item[9].si.min 0.2 0.2

item[9].si.max 1.5 1.5

item[10].name "JOB" 0

item[10].format 3 3

item[10].due_date 1510 1510

item[10].weight 100 100

item[10].duration 100 100

item[10].degassing "E" 0

item[10].al.min 0.9 0.9

item[10].al.max 2.8 2.8

item[10].mg.min 0.9 0.9

item[10].mg.max 2.1 2.1

item[10].si.min 0.2 0.2

item[10].si.max 0.5 0.5

item[11].name "JOB" 0

item[11].format 10 10

item[11].due_date 1910 1910

item[11].weight 60 60

item[11].duration 260 260

item[11].degassing "B" 0

item[11].al.min 0.3 0.3

item[11].al.max 0.4 0.4


item[11].mg.min 0.9 0.9



item[11].mg.max 1.0 1.0


item[11].si.min 1.2 1.2

item[11].si.max 1.5 1.5

item[12].name "TUNDISH" 0


item[12].duration 100 100



RULESET



/* #: 13 */


/* #: 5 */

IF /* #: 1 */ c_due_date:time< IS PB THEN c_due_date IS B WITH CERTAINTY 1.

IF /* #: 1 */ c_due_date:time< IS P THEN c_due_date IS B WITH CERTAINTY 1.

IF /* #: 1 */ c_due_date:time< IS Z THEN c_due_date IS Z WITH CERTAINTY 1.

IF /* #: 1 */ c_due_date:time< IS N THEN c_due_date IS G WITH CERTAINTY 1.

IF /* #: 1 */ c_due_date:time< IS NB THEN c_due_date IS G WITH CERTAINTY 1.

/* #: 5 */

IF /* #: 1 */ c_vacuum:vacuum> IS PB THEN c_vacuum IS G WITH CERTAINTY 1.

IF /* #: 1 */ c_vacuum:vacuum> IS P THEN c_vacuum IS G WITH CERTAINTY 1.

IF /* #: 1 */ c_vacuum:vacuum> IS Z THEN c_vacuum IS Z WITH CERTAINTY 1.

IF /* #: 1 */ c_vacuum:vacuum> IS N THEN c_vacuum IS B WITH CERTAINTY 1.

IF /* #: 1 */ c_vacuum:vacuum> IS NB THEN c_vacuum IS B WITH CERTAINTY 1.

/* #: 5 */

IF /* #: 1 */ c_chem_si:chem_si> IS PB THEN c_chem_si IS G WITH CERTAINTY 1.

IF /* #: 1 */ c_chem_si:chem_si> IS P THEN c_chem_si IS G WITH CERTAINTY 1.

IF /* #: 1 */ c_chem_si:chem_si> IS Z THEN c_chem_si IS Z WITH CERTAINTY 1.

IF /* #: 1 */ c_chem_si:chem_si> IS N THEN c_chem_si IS B WITH CERTAINTY 1.

IF /* #: 1 */ c_chem_si:chem_si> IS NB THEN c_chem_si IS B WITH CERTAINTY 1.

/* #: 5 */

IF /* #: 1 */ c_chem_al:chem_al> IS PB THEN c_chem_al IS G WITH CERTAINTY 1.

IF /* #: 1 */ c_chem_al:chem_al> IS P THEN c_chem_al IS G WITH CERTAINTY 1.

IF /* #: 1 */ c_chem_al:chem_al> IS Z THEN c_chem_al IS Z WITH CERTAINTY 1.

IF /* #: 1 */ c_chem_al:chem_al> IS N THEN c_chem_al IS B WITH CERTAINTY 1.


IF /* #: 1 */ c_chem_al:chem_al> IS NB THEN c_chem_al IS B WITH CERTAINTY 1.



/* #: 5 */


IF /* #: 1 */ c_chem_mg:chem_mg> IS PB THEN c_chem_mg IS G WITH CERTAINTY 1.

IF /* #: 1 */ c_chem_mg:chem_mg> IS P THEN c_chem_mg IS G WITH CERTAINTY 1.

IF /* #: 1 */ c_chem_mg:chem_mg> IS Z THEN c_chem_mg IS Z WITH CERTAINTY 1.

IF /* #: 1 */ c_chem_mg:chem_mg> IS N THEN c_chem_mg IS B WITH CERTAINTY 1.

IF /* #: 1 */ c_chem_mg:chem_mg> IS NB THEN c_chem_mg IS B WITH CERTAINTY 1.

/* #: 9 */

IF /* #: 2 */ c_chem_al IS G AND c_chem_si IS G THEN c_chem_si_al IS G WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_al IS G AND c_chem_si IS Z THEN c_chem_si_al IS Z WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_al IS G AND c_chem_si IS B THEN c_chem_si_al IS B WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_al IS Z AND c_chem_si IS G THEN c_chem_si_al IS Z WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_al IS Z AND c_chem_si IS Z THEN c_chem_si_al IS Z WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_al IS Z AND c_chem_si IS B THEN c_chem_si_al IS B WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_al IS B AND c_chem_si IS G THEN c_chem_si_al IS B WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_al IS B AND c_chem_si IS Z THEN c_chem_si_al IS B WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_al IS B AND c_chem_si IS B THEN c_chem_si_al IS B WITH CERTAINTY 1.

/* #: 9 */

IF /* #: 2 */ c_chem_si_al IS G OR c_chem_mg IS G THEN c_chem_all IS G WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_si_al IS G OR c_chem_mg IS Z THEN c_chem_all IS G WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_si_al IS G OR c_chem_mg IS B THEN c_chem_all IS G WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_si_al IS Z OR c_chem_mg IS G THEN c_chem_all IS G WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_si_al IS Z OR c_chem_mg IS Z THEN c_chem_all IS Z WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_si_al IS Z OR c_chem_mg IS B THEN c_chem_all IS Z WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_si_al IS B OR c_chem_mg IS G THEN c_chem_all IS G WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_si_al IS B OR c_chem_mg IS Z THEN c_chem_all IS Z WITH CERTAINTY 1.

IF /* #: 2 */ c_chem_si_al IS B OR c_chem_mg IS B THEN c_chem_all IS B WITH CERTAINTY 1.

/* #: 5 */

IF /* #: 1 */ c_weight:weight= IS PB THEN c_weight IS B WITH CERTAINTY 1.

IF /* #: 1 */ c_weight:weight= IS P THEN c_weight IS Z WITH CERTAINTY 1.

IF /* #: 1 */ c_weight:weight= IS Z THEN c_weight IS G WITH CERTAINTY 1.

IF /* #: 1 */ c_weight:weight= IS N THEN c_weight IS Z WITH CERTAINTY 1.

IF /* #: 1 */ c_weight:weight= IS NB THEN c_weight IS B WITH CERTAINTY 1.

/* #: 5 */

IF /* #: 1 */ c_format:format> IS PB THEN c_format IS G WITH CERTAINTY 1.

IF /* #: 1 */ c_format:format> IS P THEN c_format IS G WITH CERTAINTY 1.

IF /* #: 1 */ c_format:format> IS Z THEN c_format IS Z WITH CERTAINTY 1.

IF /* #: 1 */ c_format:format> IS N THEN c_format IS B WITH CERTAINTY 1.


IF /* #: 1 */ c_format:format> IS NB THEN c_format IS B WITH CERTAINTY 1.


... etc.