C'era una volta in un paese lontano lontano la “Mastro Geppetto” Srl, una piccola impresa familiare condotta dall'esperto carpentiere Geppetto e dal suo figlio Pinocchio. Dopo un avvio piuttosto turbolento gli affari della società andavano a gonfie vele, anche perché il piccolo Pinocchio, essendo un burattino, non solo era instancabile, ma poteva industriarsi in barba alla legislazione sul lavoro minorile.
Un giorno Pinocchio comunica al papà di avere ricevuto un’ottima proposta per diventare un bambino vero: il buon Geppetto, lieto per la notizia, decide di cogliere l'occasione per andare in pensione, logicamente dopo aver messo da parte un gruzzoletto per potersi mantenere. Al momento della comunicazione della novità da parte di Pinocchio, i due hanno in magazzino 40 quintali di legna.
Pinocchio diventerà un bambino in carne ed ossa di lì a 60 giorni: per quella data Geppetto dovrà aver guadagnato almeno 20 zecchini. La lista delle commesse in sospeso della società conta le seguenti voci:
Commessa | Legna | Dur. | $ |
---|---|---|---|
Ufficio giudice Acchiappa-Citrulli | 30 qt | 20 | 10 |
Carrozza turbo 4 cavalli per carabinieri | 7 qt | 25 | 4 |
Bacchetta magica Fata Turchina | 1 qt | 10 | 5 |
Nuovo teatro Mangiafuoco | 20 qt | 30 | 8 |
Ristrutturazione “Osteria Gambero Rosso” | 10 qt | 30 | 6 |
Nuova sede “Gatto&Volpe” (Soc. a Delinquere) | 20 qt | 40 | 2 |
Barchetta anti-pescecane | 12 qt | 25 | 5 |
Occorre decidere quali commesse accettare ed indicare in che giorni iniziare a lavorarvi. Si noti che la “Mastro Geppetto” riesce a portare avanti al massimo due commesse contemporaneamente. Si modelli il problema come un CSP e si mostri una possibile soluzione. Si ricordi la possibilità di utilizzare meta-vincoli.
Una variabile binaria Ai
per ogni commessa, con Ai=1
se la commessa è accettata, 0 altrimenti. Una variabile di start Si
per ogni commessa, con dominio:
S1∈{0..40},S2∈{0..35},S3∈{0..50},S4∈{0..30},S5∈{0..30},S6∈{0..20},S7∈{0..35}
Vincolo sulla legna disponibile:
30A1+7A2+1A3+20A4+10A5+20A6+12A7≤40
Vincolo sul profitto da realizzare:
10A1+4A2+5A3+8A4+6A5+2A6+5A7≥20
Vincolo sulla capacità produttiva dell'azienda
CUMULATIVE([S1..S7],[20,25,10,30,30,40,25],[A1..A7],2)
Una possibile soluzione (commesse 2, 3, 4, 5):
A=[0,1,1,1,1,0,0]S=[0,0,0,10,25,0,0]
Si noti che il giorno di inizio lavori per le commesse non selezionate non ha significato.
Dato un vincolo CUMULATIVE con capacità 3 e le seguenti attività:
# | si | di | ri |
---|---|---|---|
0 | [0..1] | 6 | 1 |
1 | [0..1] | 2 | 1 |
2 | [0..2] | 3 | 2 |
3 | [2..3] | 2 | 1 |
4 | [4..6] | 3 | 2 |
5 | [0..7] | 3 | 2 |
Si mostri l'esecuzione del propagatore "timetable" per l'attività 5.
In particolare, sulla griglia seguente:
È utile iniziare calcolando i valori di LSTi
ed EETi
:
# | si | di | ri | LSTI | EETi |
---|---|---|---|---|---|
0 | [0..1] | 6 | 1 | 1 | 6 |
1 | [0..1] | 2 | 1 | 1 | 2 |
2 | [0..2] | 3 | 2 | 2 | 3 |
3 | [2..3] | 2 | 1 | 3 | 4 |
4 | [4..6] | 3 | 2 | 6 | 7 |
5 | [0..7] | 3 | 2 | − | − |
In modo da determinare le parti obbligatorie
Si può quindi disegnare il profilo:
Quindi si possono evidenziare:
s5
s5+d5
A questo punto si possono determinare le posizioni del cursore:
Il dominio finale di s5 è 7
Si consideri il seguente CSP:
SUM(z,x)x0∈{−1..2}x1∈{0..1}x2∈{−2..1}x3∈{0..1}z∈{−10..10}
Si supponga ora che il dominio di x2
venga modificato come segue:
{−2..1}⟶{0..1}
z
? Si utilizzi questa volta la regola di aggiornamento incrementale.Sia dato un problema combinatorio definito su un insieme di n
attività. Per ogni attività occorre decidere l'istante di esecuzione.
i
-mo deve essere nell'intervallo [li,ui]
P
di relazioni di precedenza, rappresentate come coppie (i,j)
L'obiettivo è massimizzare il numero di relazioni di precedenza soddisfatte
Il problema è stato modellato nel modo seguente:
min
Dove:
s_i
rappresenta l'istante di esecuzione dell'attività ix_{ij}
vale 1 sse la precedenza (i,j)
è soddisfattaSi progetti una possibile strategia di ricerca e la si discuta.
In questo caso, ogni soluzione è buona. Si tratta solo di fornire argomentazioni valide.
Una strategia di ricerca particolarmente buona per questo problema opera in due fasi:
Fase 1:
Branching di tipo x_{ij} = 1
/ x_{ij} \neq 0
sulle variabili x_{ij}
x_{ij}
sono assegnatex_{ij}
x_{ij} = 1
come ramo sinistro ci indirizziamo verso soluzioni di buona qualitàIn questo caso, ogni soluzione è buona. Si tratta solo di fornire argomentazioni valide.
Una strategia di ricerca particolarmente buona per questo problema opera in due fasi:
Fase 2:
Branching di tipo s_i = \underline{s}_i
, senza backtracking
s_i
al suo valore minimo ed essere sicuri che troveremo una soluzione ammissibile, se questa esiste