Instructiuni

    Instructiunile limbajului ALLO sunt asamblaje speciale cu un inteles semantic superior si precis care au rolul de a delimita sectiunile unui model, de a defini fiecare variabila utilizata in scrierea modelului. Instructiunile le putem incadra in:

            - Instructiuni de structurare model
            - Instructiuni de pregatire date auxiliare
            - Instructiunea de definire Variabile model
            - Instructiuni de definire functii obiectiv
            - Instructiunea de selectie functie obiectiv
            - Instructiuni de definire restrictii model

Instructiuni de structurare model

    Aceste instructiunile au rolul de a crea o structura pe sectiuni pentru orice model ALLO. In afara de instructiunea model, care are si un nume_model atasat in sintaxa, toate celelalte sunt definite numai de cuvintele cheie respective care ne semnaleaza si scopul sectiunii ce urmeaza dupa acesta.

Sintaxa

instr_struct_model ::= MODEL nume_model | VARIABLES | OBJECTIVES |

                                        CONSTRAINTS | END
nume_model ::= nume

Sintaxa unui program-model ALLO

    Dam mai jos schema sintactica a unui model de optimizare scris in limbajul ALLO. Reamintim ca sintaxa este libera la zone albe formata din spatii, taburi, linii sursa vide. De asemenea cuvintele rezervate nu sunt senzitive la litere mari sau mici si deci pot fi scrise dupa cum se doreste. La fel se comporta oricare nume ALLO.

Dupa cum se observa un program ALLO este rezultat dintr-o concatenare a celor patru sectiuni cu tot ceea ce tine de acestea si in ordinea impusa. Mai mult fiecare sectiune este o concatenare de una sau mai multe instructiuni specifice sectiunii care sunt separate prin tokenul util dat de caracterul punct si virgula exceptie facind instructiunile din sectiunea variabilelor auxiliare (care n-au nevoie de aceasta delimitare deoarece fiecare incepe cu un cuvint rezervat) precum si ultima instructiune din sectiunea functiilor obiectiv care n-are nevoie sa fie despartita de instructiunea de selectie functie obiectiv. Ultima instructiune din oricare sectiune nu trebuie sa fie urmata de tokenul util punct si virgula. O regula concentrata ne spune ca oricare cuvint cheie initiator de instructiune nu suporta in fata sa imediat ca token util pe cel reprezentat de caracterul punct si virgula. Alte detalii la aceasta schema se regasesc in anexa sau in subcapitolele respective.

Sintaxa

Program ::= MODEL nume_model

                                    sect_var_aux

VARIABLES
                                    sect_var_model

OBJECTIVES
                                    sect_var_fobj

CONSTRAINTS
                                    sect_var_restr

END

Sectiunea variabile auxiliare

sect_var_aux ::= s_instr
s_instr ::= instr | instr s_instr
instr ::= instr_file | instr_domeniu |
instr_integer | instr_real

Sectiunea variabile model

sect_var_model ::= s_instr_var_model
s_instr_var_model ::= instr_var_model | instr_var_model ; s_instr_var_model
instr_var_model ::= var_model proced_cond_marg

Sectiunea variabile functii obiectiv

sect_var_fobj ::= s_instr_fobj instr_select_fobj
s_instr_fobj ::= instr_fobj | instr_fobj ; s_instr_fobj
instr_fobj ::= var_fobj IS proced_def_fobj

Sectiunea variabile restrictii

sect_var_restr ::= s_instr_restr
s_instr_restr ::= instr_restr | instr_restr ; s_instr_restr
instr_restr ::= var_restr IS proced_def_restr

Instructiuni de pregatire date auxiliare

    Aceste instructiuni ne permit definirea variabilelor auxiliare necesare in constructia oricarui model. Avem cite o instructiune specifica pentru fiecare tip de data, instructiune care incepe prin cuvintul cheie corespunzator. Instructiunile INTEGER si REAL sunt identice ca sintaxa cu exceptia cuvintului cheie care le desparte. Iata tipul de instructiuni:

            - Instructiunea FILE;
            - Instructiunea RANGE;
            - Instructiunea INTEGER;
            - Instructiunea REAL.

Instructiunea FILE

   Cu aceasta instructiune putem defini variabile auxiliare de tip FILE a caror valoare este un sir ce contine un nume de specificatie fisier recunoscut de sistemul de operare DOS. Acest fisier este considerat ca fisier auxiliar cu date atasat modelului din fisierul principal. Accesul la acesta se face prin invocarea numelui variabilei FILE (nume intern usor de invocat in posibile multiple locuri) ce urmeaza comanda READ din instructiunile de definire a variabilelor auxiliare de tip INTEGER sau REAL care-si iau datele de initializare din fisierul asociat cu acest nume. Prin aceasta instructiune putem defini unul sau mai multe fisiere secundare care sunt deschise in acest moment in vederea accesului la datele curente din ele. Fiecare definitie este ca o instructiune de atribuire. Daca sunt mai multe definitii trebuie sa fie separate prin tokenul activ desemnat de punct si virgula. Aceasta instructiune poate apare ori unde in cadrul sectiunii.

Sintaxa

instr_file ::= FILE s_decl_file
s_decl_file ::= decl_file | decl_file ; s_decl_file
decl_file ::= var_fisier = spec_fisier_dos
spec_fisier_dos ::= sir
sir ::= " secv_car "
secv_car ::= car | car secv_car
car ::= caracter ASCII recunoscut de ALLO (text comentariu)

Exemple : FILE fpp = "prodplan.dat" , FILE fcsd="cetsud.dat"

Instructiunea RANGE

    Definirea variabilelor auxiliare se face prin aceasta instructiune care ne permite sa definim simultan una sau mai multe variabile de acest fel. Daca avem mai multe definitii ele trebuie sa fie separate prin tokenul activ punct si virgula. Fiecare definitie este ca o instructiune de atribuire. Constanta domeniu trebuie sa fie calculabila in acest moment in sensul ca ambele expresii de margine trebuie sa fie calculabile. Deci daca contin alte variabile auxiliare de tip intreg sau real acestea trebuie sa fie definite anterior si initializate desigur. Aceasta instructiune poate apare ori unde in cadrul sectiunii.

Sintaxa

instr_domeniu ::= RANGE s_decl_domeniu
s_decl_domeniu ::= decl_domeniu | decl_domeniu ; s_decl_domeniu
decl_domeniu ::= var_domeniu = const_domeniu

Exemple : RANGE fprod = [1,nrfprod] ; rmat = [1,nrrmat ]

    Observatie. Deasupra avem definite doua domenii intr-o singura instructiune care poate fi scrisa pe mai multe linii sursa. Fiecare domeniu putea fi definit intr-o instructiune separata. Se presupune ca variabilele auxiliare nrfprod si nrmat sunt deja cunoscute in momentul atingerii instructiuni RANGE asa ca expresiile de margini sunt toate calculabile. Mai trebuie ca aceste valori sa fie mai mari sau egale cu unu datorita marginii inferioare prezente.

Instructiunea INTEGER

    Cu ajutorul acestei instructiuni putem defini una sau mai multe variabile auxiliare de tip intreg si de forma scalara sau masiv. In cazul cind sunt definite multiple variabile atunci definitiile lor trebuie sa fie despartite prin tokenul activ punct si virgula. Fiecare definitie de variabila de acest tip este compusa din trei componente din care prima este obligatorie si defineste numele si dimensiunea variabilei. A doua componenta este dedicata initializarii variabilei care poate fi facuta si prin citirea datelor dintr-un fisier si de la pointerul la care s-a ajuns in momentul comenzii READ. Componenta trei se ocupa de validare iar cind nu este componenta doi pentru variabilele dimensionate este interpretata ca o procedura de asignare date pentru unele elemente (chiar toate) ale masivului de intregi. De aceea in acest caz nu poate apare in secventa de validare decit operatorul relational = care este reinterpretat ca operator de atribuire. De aceea in fata acestuia poate sta numai expresii referinta la element masiv.

Sintaxa

instr_integer ::= INTEGER s_decl_integer
s_decl_integer ::= decl_integer | decl_integer ; s_decl_integer
decl_integer ::= var_integer part_init part_valid
part_init ::= lambda | READ var_fisier | = val_init
val_init ::= expr_aritm | { l_expr_aritm }
l_expr_aritm ::= expr_aritm | expr_aritm , l_expr_aritm
part_valid ::= lambda | IS proced_valid
proced_valid ::= expr_cond_valid | FOR [ l_expr_apart ]
proced_valid | { s_proced_valid }
s_proced_valid ::= proced_valid | proced_valid ; s_proced_valid
l_expr_apart ::= expr_apart | expr_apart , l_expr_apart
expr_apart ::= var_indice IN domeniu
expr_cond_valid ::= expr_aritm opr_rel expr_aritm

Exemple : INTEGER M = 10 ; N = 23

                INTEGER V[ [3,5] ] ={1,2,3}

                INTEGER nrfprod READ fpp IS nrfprod >0 ;

                                 nrperp READ fpp IS nrperp >0

    Observatie. In prima instructiune sunt definite variabilele auxiliare M si N cu valorile de initializare 10 respectiv 23. Aici trebuie retinut ca in acelasi timp este definit si domeniul unicei dimensiuni care este o constanta de tip domeniu ce se defineste ca atare prin utilizarea parantezelor drepte folosite si in incadrarea listei de dimensiuni a unei variabile ALLO indiferent de ce tip este. In a doua instructiune am definit un vector cu domeniul de indici [3,5] ale carui valori initiale sunt V[3]=1, V[4]=2 si V[5]=3. In ultima instructiune INTEGER sunt definite doua variabile auxiliare intregi si de tip scalar. Pentru fiecare variabila valoarea este citita din fisierul fpp si validata prin conditia de dupa cuvintul cheie IS.

Instructiunea REAL

    Tot ceea ce s-a spus la variabilele auxiliare de tip INTEGER ramine valabil si aici cu observatia ca referintele sunt la variabile auxiliare de tip REAL. Din sintaxa precedenta s-a modificat numai cele de mai jos.

Sintaxa

instr_real ::= REAL s_decl_real
s_decl_real ::= decl_real | decl_real ; s_decl_real
decl_real ::= var_real part_init part_valid

Exemple :

REAL ump [rmat,fprod] READ fpp IS FOR [r IN rmat,f IN fprod] ump[r,f]>= 0.0

    Observatie. Mai sus se defineste o singura variabila auxiliara matriciala ale carei valori sunt preluate din fisierul fpp. Fiecare valoare de initializare a elementului de matrice nu poate fi un numar strict negativ lucru ce se reflecta din clauza de validare aflata in corpul blocului FOR care cicleaza pe cei doi indici ai domeniilor dimensionale rmat si fprod.

Instructiunea de definire Variabile model

    Aceasta instructiune ne permite sa definim variabilele simbolice ale modelului care sunt elemente de baza ce participa la constructia expresiilor simbolice din definitia variabilelor functii obiectiv si a variabilelor restrictii model. O variabila model are un nume, o lista dimensionala daca este de tip masiv precum si o eventuala parte conditie de marginire variabila ce este mai complexa in cazul cind avem o variabila masiv. Trebuie remarcat ca variabilele model nu au valoare initiala. Pe rol de valoare initiala putem considera valoarea de conditie daca exista si care este formata din codul operatorului de marginire si de una sau doua valori care reprezinta marginea inferioara sau marginea superioara impusa ca domeniu admisibil de valori. Avem doua valori cind operatorul de marginire este IN. Variabilele model vor primi valori numai in procesul de optimizare care incearca sa determine o solutie optima a modelului respectiv. Acest proces este independent de procesul de translatare in format standard MPS al modelului respectiv.

Instructiunile de definire variabile model sunt separate intre ele de tokenul activ punct si virgula.

Sintaxa

instr_var_model ::= var_model part_cond_marg
part_cond_marg ::= lambda | IS proced_marg
proced_marg ::= ref_var_model cond_var_model | FOR [ l_expr_apart ] proced_marg |
                                                                                                        { s_proced_marg }
ref_var_model ::=var_model_scalara|ref_element_masiv_var_model
cond_var_model ::= opr_marg expr_marg_var
expr_marg_var ::= expr_aritm | domeniu
s_proced_marg ::= proced_marg | proced_marg ; s_proced_marg

Exemple : xprod [fprod,perp] ,

xsmat[rmat,perpext] IS FOR[r IN rmat] xsmat[r,1] <= stinimax[r]

    Observatie. Prima instructiune defineste o variabila model matrice care nu contine nici o clauza de marginire pentru nici un element component al sau. In acest caz toate elementele sunt presupuse in domeniul pozitiv al spatiului real. A doua definite este pentru o variabila similara care contine si o clauza de marginire pentru anumite elemente componente si anume pentru toate elementele care au indicele 1 pe a doua dimensiune carora li se cere a nu depasi limita superioara din vectorul stinimax pozitia corespunzatoare primului indice dimensional. Clauza de marginire este realizata cu ajutorul blocului FOR care are o singura componenta in lista interioara de clauze : xsmat[r,1] <= stinimax[r].

Instructiuni de definire functii obiectiv

    Definirea variabilelor functii obiectiv se face cu aceasta instructiune. O variabila functie obiectiv are un nume, o lista dimensionala daca este de tip masiv precum si o eventuala parte de definire care poate fi numita procedura de definire in cazul cind avem o variabila masiv.

Fiecare variabila functie obiectiv scalara produce o singura linie in modelul de care apartine spre deosebire de variabilele de tip masiv care produce atitea linii cite sunt citate in procedura de definire care poate sa cuprinda toate celulele masivului.

Instructiunile de definire variabile functii obiectiv sunt separate intre ele de tokenul activ punct si virgula.

Sintaxa

instr_fobj ::= var_fobj IS proced_def_fobj
proced_def_fobj ::= ref_fobj := expr_simb | FOR [ l_expr_apart ] proced_def_fobj |
                                                                                        { s_proced_def_fobj }
s_proced_def_fobj ::= proced_def_fobj| proced_def_fobj ; s_proced_def_fobj
ref_fobj ::= var_fobj_scalara|ref_element_masiv_var_fobj

Exemple : profit IS profit :=
                                   SUM[f IN fprod,p IN perp](profdc[f,p]*xprod[f,p]) -
                                   SUM[r IN rmat,p IN perp] (storcost[r]*xsmat[r,p]) +
                                   SUM[r IN rmat] (rvdcost[r]*xsmat[r,nrperp+1])

    Observatie. Mai sus avem definita o variabila scalara functie obiectiv profit construita din trei sume simbolice expresii lineare dupa cum se vede deoarece referintele la variabilele model xprod si xsmat sunt la puterea unu iar celelalte referinte sunt coeficienti reali.

Instructiunea de selectie functie obiectiv

    Aceasta instructiune, ultima din sectiunea functiilor obiectiv permite selectarea si deci precizarea functiei obiectiv pe care optimizatorul o va lua in considerare dupa un criteriu prestabilit. Translatorul ALLO pune min/max pe linia corespunzatoare acestei functii si din sectiunea ROWS a fisierului MPS rezultat. Celelalte functii obiectiv nu au rol in model decit atunci cind optimizatorul are o procedura de alegere iar utilizatorul desemneaza o alta functie de maximizat sau minimizat. Referinta la functia de optimizat consta in citarea numelui unei variabile functie obiectiv scalara fie citarea numelui dupa care urmeaza o lista de expresii indiciale in care variabila functie obiectiv este dimensionata, adica de tip masiv.

Sintaxa

instr_select_fobj ::= MINIMIZE ref_fobj | MAXIMIZE ref_fobj

Exemple : MAXIMIZE profit ,MINIMIZE cost

Instructiuni de definire restrictii model

    Structura de baza a unui model liniar este o linie restrictie model. Limbajul ALLO cere ca fiecare linie sa poarte un nume care este desigur cerut si de standardul MPS. Pe de alta parte mai multe linii pot avea o definitie generica comuna care usureaza munca de scriere a unui model complex si pot fi organizate intr-un masiv. Referintele la anumite celule ale acestui masiv vor produce nume de linii distincte care desigur se bazeaza pe numele masivului si pe indicele liniarizat al celululei respective.

Definirea restrictiilor se face cu aceasta instructiunea de mai sus care cuprinde partea de definire nume cu o eventuala dimensionare urmata de cuvintul cheie IS si de procedura de definire concreta a uneia sau mai multe linii ce eventual tin de aceasta variabila. Daca avem o variabila restrictie de tip masiv din model vor face parte numai acele linii rezultate din celulele masivului citate ca referinta in procedura de definitie care poate contine si blocul FOR sau SUM.

Instructiunile de definire restrictii model sunt separate intre ele prin tokenul activ punct si virgula. Ultima instructiune se afla inaintea instructiunii END care incheie sectiunea restrictiilor model precum si definitia intregului model ALLO.

Sintaxa

instr_restr ::= var_restr IS proced_defrestr
proced_defrestr ::= ref_var_restr := expr_simb opr_marg expr_marg_restr
                            | FOR [ l_expr_apart ] proced_defrestr | { s_proced_defrestr }
s_proced_defrestr ::= proced_defrestr| proced_defrestr ; s_proced_defrestr
ref_var_restr ::= var_restr_scalara | ref_element_masiv_restr
expr_marg_restr ::= expr_simb | domeniu

Exemple :

    limprod [perp] IS  FOR [p IN perp] limprod[p]:= SUM[f IN fprod](xprod [f,p]) <= prodmax;

Observatie. Deasupra este o instructiune care defineste o variabila restrictie de tip vector si numita limprod. Definitia fiecarei componente este in corpul unui ciclu FOR si contine o expresie simbolica (realizata cu ajutorul operatorului SUM) plus o conditie de marginire superioara.