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.
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
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
PARAMETERSET
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
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
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
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 */
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.