Sei sulla pagina 1di 13

Università degli Studi di Roma “Tor Vergata”

Facoltà di Ingegneria
Appunti dal corso di Metodi e Modelli di Ottimizzazione Discreta 1
A.A. 2019-2020
Prof. Sara Nicoloso

A seconda del tipo di variabili che compaiono nella formulazione del problema, si distinguono
diversi modelli di programmazione lineare. In questo corso ci occuperemo principalmente della
programmazione lineare a numeri interi, della programmazione binaria, della programmazione
lineare mista. L’aggettivo lineare sta a indicare che la funzione obiettivo e i vincoli devono essere
espresse come funzioni lineari delle variabili, che possono essere reali o intere, o, in particolare,
binarie. Nel seguito faremo riferimento a una formulazione che spesso ha questa forma

max c1 xx + c2 x2 + · · · + cn xn
s.t. a1,1 x1 + a1,2 x2 + · · · + a1,n xn ≤ b1
max cx
a2,1 x1 + a2,2 x2 + · · · + a2,n xn ≤ b2
s.t. Ax ≤ b che equivale a
...
x ≥ 0 e ...
am,1 x1 + am,2 x2 + · · · + am,n xn ≤ bm
x ≥ 0 e ...

dove “s.t” sono le iniziali dell’espressione inglese “subject to” che significa “soggetto a” (i seguenti
vincoli). I dati del problema sono: il vettore riga n-dimensionale c dei coefficienti della funzione
obiettivo, la matrice dei coefficienti A, che ha m righe e n colonne, e il vettore colonna m-
dimensionale b dei termini noti:

c = (c1 , c2 , . . . , cn )
 
a1,1 a1,2 ··· a1,n
 a2,1 a2,2 ··· a2,n 
A=
 
.. .. .. .. 
 . . . . 
am,1 am,2 ··· am,n

bT = (b1 , b2 , . . . , bm )
mentre le variabili decisionali sono rappresentate dal vettore colonna n-dimensionale x,

xT = (x1 , x2 , . . . , xn ).

A seconda che le variabili siano vincolate a essere intere, oppure intere e di valore ≤ 1, ovvero che
solo alcune siano intere, permetterà di classificare la formulazione, rispettivamente, come intera,
binaria o mista.
Ricordiamo inoltre che per soluzione della fomulazione si intende un vettore (riga) a n com-
ponenti. Una soluzione x̄ = (x̄1 , x̄2 , . . . , x̄n ) è ammissibile se verifica i vincoli imposti, ossia se
i valori di tutte le sue componenti sono non-negativi, per i = 1, 2, . . . , n, se tali valori sono
tutti interi, se la quantità a1,1 x̄1 + a1,2 x̄2 + · · · + a1,n x̄n non eccede il valore b1 , se la quantità
a2,1 x̄1 +a2,2 x̄2 +· · ·+a2,n x̄n non eccede il valore b2 , . . . , se la quantità am,1 x̄1 +a1,2 x̄2 +· · ·+a1,n x̄n
non eccede il valore bm . La soluzione è ottima se è ammissibile e se il valore assunto dalla funzione
obiettivo in corrispondenza alla soluzione è il più grande possibile tra i valori che tale funzione
assume in corrispondenza di ogni altra soluzione ammissibile.
Convenzionalmente, in corrispondenza a funzioni obiettivo di min si definiscono vincoli di
tipo ≥, mentre in corrispondenza a problemi di max, si definiscono vincoli di tipo ≤. Queste
assunzioni non fanno perdere in generalità dato che ogni vincolo di tipo ≥ può essere trasformato
in uno equivalente di tipo ≤ semplicemente modificando i segni dei termini che lo compongono, e

1
viceversa (i vincoli a1,1 x1 + a1,2 x2 + · · · + a1,n xn ≥ b1 e −a1,1 x1 − a1,2 x2 − · · · − a1,n xn ≤ −b1 ,
ad esempio, sono equivalenti). Ogni vincolo di =, inoltre, può essere sostituito da una coppia di
vincoli equivalenti: si consideri, per esempio, il vincolo

a1,1 x1 + a1,2 x2 + · · · + a1,n xn = b1 ;


esso è equivalente alla coppia di vincoli

a1,1 x1 +a1,2 x2 +... +a1,n xn ≤ b1
a1,1 x1 +a1,2 x2 +... +a1,n xn ≥ b1 .

È importante sottolineare, come approfondiremo più avanti, che per formulazione si intende un
insieme di vincoli verificato da tutte e sole le soluzioni ammissibili del problema. Le soluzioni
ammissibili devono tutte verificare i vincoli, altrimenti potrebbe succedere che la soluzione esclusa
sia proprio quella ottima, e il solutore non è in grado di trovarla (dovendosi esso limitare a cercare
tra i vettori che soddisfano i vincoli). È importante, poi, che solo le soluzioni ammissibili verifichino
i vincoli, e cioè che nessuna soluzione non ammissibile li verifichi, altrimenti potrebbe succedere
che il solutore (che si deve limitare a cercare tra i vettori che soddisfano i vincoli) proponga come
soluzione una soluzione non ammissibile.

Programmazione binaria

Un problema di programmazione binaria, o programmazione 0 − 1 è un problema in cui le variabili


sono binarie, ossia sono variabili non negative vincolate a essere intere e di valore non superiore a 1.
Quindi sono variabili che possono assumere solamente il valore 0 o il valore 1. Sono convenienti tutte
le volte che si devono modellare decisioni a due vie, ossia quelle di tipo si/no, on/off, acquistare/non
acquistare, noleggiare/acquistare, . . . decidendo arbitrariamente che una delle due situazioni venga
associata al fatto che la corrispondente variabile assuma valore 0, mentre l’altra situazione associata
al valore 1 assunto dalla variabile.
Una formulazione tipica di programmazione binaria è la seguente:

max cx
s.t. Ax ≤ b
x≥0
x ≤ 1 e intero

Modi equivalenti per dire che un vettore n-dimensionale x è binario, ossia che ogni sua componente
è una variabile binaria, sono i seguenti: x ∈ {0, 1}n ; x ∈ Bn (dove B = {0, 1} e quindi Bn = {0, 1}n
indica l’insieme dei numeri binari in n dimensioni); oppure x ≥ 0, x ≤ 1 e intero. Le prime notazioni
sono di tipo insiemistico, l’ultima è di tipo geometrico. Le stesse notazioni si possono usare, in
alternativa, a indicare le singole componenti del vettore, cioè: xi ∈ {0, 1} per i = 1, 2, . . . , n; oppure
xi ∈ B per i = 1, 2, . . . , n; oppure xi ≥ 0, xi ≤ 1 e intera per i = 1, 2, . . . , n.
Esempi di formulazioni binarie sono le formulazioni dello knapsack binario, dell’assegnamento,
del Matching, e dell’Independent Set, che seguono.

Knapsack binario

Supponiamo di avere n oggetti, di ciascuno dei quali siano note l’utilità uj e il peso wj con
j = 1, 2, . . . , n. Si supponga di voler riempire uno zaino (knapsack significa proprio zaino) con
alcuni tra questi oggetti, senza eccedere il peso massimo b sopportabile dallo zaino, e in modo da
massimizzare l’utilità complessiva degli oggetti scelti. Il problema descritto, nella forma “Dato,
Trovare, In Modo Tale Che” si presenta cosı̀:

2
Dati: n oggetti, il j-esimo dei quali è caratterizzato dall’utilità uj ≥ 0, e dal peso wj ≥ 0,
j = 1, 2, . . . , n; e il valore b della capacità dello zaino
Trovare: quali oggetti mettere nello zaino
In modo tale che: sia massimizzata l’utilità complessiva, e non si ecceda la capacità b dello
zaino.

Possiamo quindi utilizzare delle variabili binarie, ognuna in corrispondenza biunivoca con un
oggetto. Successivamente, ai due valori che può assumere una variabile binaria possiamo asso-
ciare i seguenti significati (da questa decisione dipenderà l’utilizzo che faremo delle variabili nella
formulazione):

1 se l’oggetto i viene scelto
xi = per i = 1, 2, . . . , n.
0 se l’oggetto i non viene scelto
In questo modo la formulazione risulta
Pn
max Pi=1 ui xi
n
s.t. i=1 wi xi ≤ b
x≥0
x ≤ 1 e intero
Nella formulazione appena scritta, abbiamo ipotizzato che l’associazione tra i due valori (0 e 1) della
generica variabile binaria xi e le due situazioni da descrivere (scelgo l’oggetto i oppure non scelgo
l’oggetto i) fosse quella descritta sopra. Tuttavia, nulla vieta che si possa invece fare l’associazione
opposta e cioè: yi = 0 se scelgo l’oggetto i e yi = 1 se non scelgo l’oggetto i, per i = 1, 2, . . . , n. In
questo caso, scrivendo la formulazione si deve solo fare attenzione a far sı̀ che quando il generico
oggetto i viene scelto (ossia quando yi = 0), esso contribuisca per quanto gli compete alla funzione
obiettivo e al vincolo, e viceversa, se esso non viene scelto (ossia se yi = 1), esso contribuisca con
valore nullo tanto all’utilità complessiva dello zaino che al vincolo di capacità. Quindi, nell’ipotesi
che si sia deciso che 
0 se l’oggetto i viene scelto
yi =
1 se l’oggetto i non viene scelto,
la formulazione finale che rispetta quanto appena osservato è la seguente.
Pn
max Pi=1 ui (1 − yi )
n
s.t. i=1 wi (1 − yi ) ≤ b
y≥0
y ≤ 1 e intero
Siccome
n
X n
X n
X
ui (1 − yi ) = ui − ui yi
i=1 i=1 i=1
e
n
X n
X n
X
wi (1 − yi ) = wi − wi yi
i=1 i=1 i=1

la formulazione appena scritta è equivalente alla seguente


Pn Pn
min Pi=1 ui yi − Pi=1 ui
n n
s.t. i=1 wi yi ≥ i=1 wi − b
y≥0
y ≤ 1 e intero
Pn
Si noti che la quantità − i=1 ui è una costante e come tale non può essere ottimizzata.

3
Massimo Matching

Parliamo qui del problema del Massimo Matching su un grafo (il problema è talvolta chiamato
Massimo Matching Cardinalità).

Dato: un grafo G = (V, E);


Trovare: un sottoinsieme M ⊆ E di archi
In modo tale che:
• su ogni nodo del grafo incida al più un arco di M
• e |M | sia massima.

Dovendo determinare un sottoinsieme di un insieme dato, è conveniente utilizzare delle variabili


binarie, che siano in corrispondenza biunivoca con gli elementi dell’insieme dato. In questo modo
esse rappresentano, attraverso il loro valore, il vettore di incidenza del sottoinsieme di interesse.
Dunque, scegliamo delle variabili binarie xj per ogni ej ∈ E, assegnando loro il seguente significato:

1 se ej ∈ M
xj =
0 se ej 6∈ M
La funzione obiettivo della formulazione è la cardinalità di M ⊆ E: per conoscere il numero degli
elementi in un insieme a partire dal vettore di incidenza è sufficiente fare la somma, estesa agli
elementi dell’insieme
P di interesse, delle componenti del vettore. Dunque in questo caso possiamo
scrivere che |M | = ej ∈E xj .
La richiesta “su ogni nodo del grafo incida al più un arco di M ” deve chiaramente trasformarsi
in (uno o più) vincoli della formulazione. Si tratta di determinare il numero degli archi di M
che incidono sul generico nodo v. Per conoscere tale numero è sufficiente conoscere quali archi di
M incidono sul generico nodo v, e contarli. Quindi definiamo la stella S(v) degli archi incidenti
su v, cioè l’insieme degli archi che incidono sul generico nodo v. Per contare quanti elementi
di M incidono sul generico nodo v è sufficiente P ora fare la somma, estesa agli archi in S(v),
delle componenti del vettore x. Tale numero è ej ∈S(v) xj , e siccome esso non deve eccedere 1,
P
otteniamo i |V | vincoli ej ∈S(v) xj ≤ 1 per v ∈ V .
La formulazione si presenta cosı̀:
P
max x
Pej ∈E j
s.t. ej ∈S(v) xj ≤ 1 per ogni v ∈ V
x ∈ {0, 1}|E|
Ogni vincolo afferma che una soluzione è ammissibile se e solo se il sottoinsieme M comprende
non più di un arco da ogni stella. Si noti che ogni vincolo del primo gruppo di vincoli dà luogo
a una riga della matrice dei coefficienti della formulazione, e precisamente, tali coefficienti sono
esattamente il vettore di incidenza della stella del nodo corrispondente. Tutte queste righe insieme
formano esattamente la matrice di incidenza nodi/archi del grafo dato.
La formulazione appena scritta ha le seguenti proprietà: il vettore dei costi ha tutti elementi
≥ 0 (e infatti i costi valgono tutti 1), la matrice dei coefficienti è binaria, le variabili sono binarie,
il vettore dei termini noti ha tutti elementi 1, e i vincoli sono tutti di ≤.

Variazioni
Chiaramente è banale chiedersi quale è il Minimo Matching di un grafo: la soluzione ottima è un
sottoinsieme di archi vuoto. Tale soluzione è ammissibile perché soddisfa tutti i vincoli, ed è anche
ottima perchè la funzione obiettivo vale 0 che è il valore minimo che una somma di variabili non
negativo può assumere.

Se il grafo ha un peso associato a ogni arco si ottiene il problema del Massimo Matching Pesato:
tra tutti i sottoinsiemi di archi che sono dei Matching occorre determinare quello per cui è massima
la somma dei pesi degli archi. Il problema viene enunciato cosı̀:

4
Dato: un grafo G = (V, E), pesato sugli archi con valori p = (p1 , p2 , . . . , p|E| ) ≥ 0;
Trovare: un sottoinsieme M ⊆ E di archi
In modo tale che:
• su ogni nodo del grafo incida alPpiù un arco di M
• e sia massimizzata la funzione ej ∈M pj .

A tale enunciato corrisponde la seguente formulazione:


P
max p x
Pej ∈E j j
s.t. ej ∈S(v) xj ≤ 1 per ogni v ∈ V
x ∈ {0, 1}|E|
L’ipotesi pj ≥ 0, j = 1, . . . , |E| non è affatto stringente. Un arco con peso negativo, infatti, non
verrebbe mai scelto all’interno di un Matching di Peso Massimo: consideriamo un arco ej ∈ E
con peso pj ≤ 0, e consideriamo un Matching (ammissibile) M di cui ej fa parte; il Matching
M 0 = M \ {ej } ha un peso maggiore di M , e siccome M è ammissibile, a maggior ragione è
ammissibile anche M 0 .
Se si fissa pj = 1 per j = 1, . . . , n, il Massimo Matching Pesato si riduce al Massimo Matching
Cardinalità.

Un altro problema simile al Massimo Matching è il problema del Matching Perfetto:


Dato: un grafo G = (V, E), pesato sugli archi con valori p = (p1 , p2 , . . . , p|E| ) ≥ 0;
Trovare: un sottoinsieme M ⊆ E di archi
In modo tale che:
• su ogni nodo del grafo incidaPesattamente un arco di M
• e sia ottimizzata la funzione ej ∈M pj .

Il vincolo che chiede che “su ogni nodo


P del grafo incida esattamente un arco di M ” si traduce nei
seguenti |V | vincoli di uguaglianza ej ∈S(v) xj = 1 per ogni v ∈ V .
La presenza di questi vincoli di uguaglianza fa sı̀ che abbia senso sia massimizzare che mini-
mizzare la funzione obiettivo, dato che non esiste una soluzione banale al problema.

Independent Set

Parliamo qui del problema del Massimo Independent Set su un grafo.

Dato: un grafo G = (V, E);


Trovare: un sottoinsieme N ⊆ V di nodi
In modo tale che:
• non vi siano nodi di N connessi da un arco
• |N | sia massima.

Dovendo determinare un sottoinsieme di un insieme dato, come al solito è conveniente utilizzare


delle variabili binarie, che siano in corrispondenza biunivoca con gli elementi dell’insieme dato. In
questo modo esse rappresentano, attraverso il loro valore, il vettore di incidenza del sottoinsieme di
interesse. Dunque, scegliamo delle variabili binarie yj per ogni vj ∈ V , assegnando loro il seguente
significato: 
1 se vj ∈ N
yj =
0 se vj 6∈ N

5
P
La funzione obiettivo della formulazione è la cardinalità di N , quindi vj ∈V yj .
La richiesta “non vi siano nodi di N connessi da un arco” deve chiaramente trasformarsi in
(uno o più) vincoli della formulazione. E’ facile capire che tale richiesta equivale a imporre che “in
N si deve trovare non più di uno dei due nodi estremi di un (qualsiasi) arco”. Quindi possiamo
scrivere yh + yk ≤ 1 per ogni arco (vh , vk ) ∈ E.
La formulazione si presenta cosı̀:
P
max vj ∈V yj
s.t. yh + yk ≤ 1 per ogni (vh , vk ) ∈ V
y≤1
y ≥ 0 e intero

La matrice dei coefficienti della formulazione è la giustapposizione di 2 matrici: la parte inferiore è


una matrice identità originata dai |V | vincoli y ≤ 1; la parte superiore è la trasposta della matrice
di incidenza nodi/archi del grafo dato.
La formulazione appena scritta ha le seguenti proprietà: il vettore dei costi ha tutti elementi
≥ 0 (e infatti i costi valgono tutti 1), la matrice dei coefficienti è binaria, le variabili sono binarie,
il vettore dei termini noti ha tutti elementi 1, e i vincoli sono tutti di ≤.

Variazioni
Il problema del Minimo Independent Set è banale: la (unica) soluzione ottima è il sottoinsieme
vuoto: tale soluzione è ammissibile perché soddisfa tutti i vincoli, ed è anche ottima perchè la
funzione obiettivo vale 0 che è il valore minimo che una somma di variabili non negativo può
assumere.

Se il grafo ha un peso associato a ogni nodo si ottiene il problema del Massimo Independent Set
Pesato: tra tutti i sottoinsiemi di nodi che sono Independent Set per il grafo, occorre determinare
quello per cui è massima la somma dei pesi dei nodi. Il problema viene enunciato cosı̀:

Dato: un grafo G = (V, E), pesato sui nodi con valori p = (p1 , p2 , . . . , p|V | ) ≥ 0;
Trovare: un sottoinsieme N ⊆ V di nodi
In modo tale che:
• non
P vi siano nodi di N connessi da un arco
• vj ∈N pj sia massima.

A tale enunciato corrisponde la seguente formulazione:


P
max vj ∈V pj yj
s.t. yh + yk ≤ 1 per ogni (vh , vk ) ∈ V
y≤1
y ≥ 0 e intero
Per gli stessi motivi discussi nel Massimo Matching Pesato, l’ipotesi pj ≥ 0, j = 1, . . . , |V | non è
affatto stringente.

6
Minimo Node Cover

Parliamo qui del problema del Minimo Node Cover su un grafo.

Dato: un grafo G = (V, E);


Trovare: un sottoinsieme N ⊆ V di nodi
In modo tale che:
• da ogni arco di N venga scelto almeno uno degli estremi
• |N | sia minima.

Dovendo determinare un sottoinsieme di un insieme dato, come al solito è conveniente utilizzare


delle variabili binarie, che siano in corrispondenza biunivoca con gli elementi dell’insieme dato. In
questo modo esse rappresentano, attraverso il loro valore, il vettore di incidenza del sottoinsieme di
interesse. Dunque, scegliamo delle variabili binarie yj per ogni vj ∈ V , assegnando loro il seguente
significato: 
1 se vj ∈ N
yj =
0 se vj 6∈ N
P
La funzione obiettivo della formulazione è la cardinalità di N , quindi vj ∈V yj .
La richiesta “da ogni arco di N venga scelto almeno uno degli estremi” deve chiaramente
trasformarsi in (uno o più) vincoli della formulazione. E’ facile capire che tale richiesta equivale a
imporre che yh + yk ≥ 1 per ogni arco (vh , vk ) ∈ E.
La formulazione si presenta cosı̀:
P
min vj ∈V yj
s.t. yh + yk ≥ 1 per ogni (vh , vk ) ∈ V
y≤1
y ≥ 0 e intero

Per quanto riguarda la matrice dei coefficienti e le proprietà della formulazione valgono consider-
azioni analoghe a quelle fatte per il Massimo Independent Set.

Variazioni
Il problema del Massimo Node Cover è banale: la (unica) soluzione ottima è l’intero insieme dei
nodi: tale soluzione è ammissibile perché soddisfa tutti i vincoli, ed è anche ottima perchè la
funzione obiettivo vale |V | che è il valore massimo che una somma di |V | variabili non negative
può assumere.

Se il grafo ha un peso associato a ogni nodo si ottiene il problema del Minimo Node Cover Pesato:
tra tutti i sottoinsiemi di nodi che sono Node Cover per il grafo, occorre determinare quello per
cui è minima la somma dei pesi dei nodi. Il problema viene enunciato cosı̀:

Dato: un grafo G = (V, E), pesato sui nodi con valori p = (p1 , p2 , . . . , p|V | ) ≥ 0;
Trovare: un sottoinsieme N ⊆ V di nodi
In modo tale che:
• da
P ogni arco di N venga scelto almeno uno degli estremi
• vj ∈N pj sia massima.

A tale enunciato corrisponde la seguente formulazione:


P
min vj ∈V pj yj
s.t. yh + yk ≥ 1 per ogni (vh , vk ) ∈ V
y≤1
y ≥ 0 e intero

7
Per gli stessi motivi discussi nel Massimo Matching Pesato, l’ipotesi pj ≥ 0, j = 1, . . . , |V | non è
affatto stringente.

Assegnamento

Il problema può essere cosı̀ descritto:

Dati: f persone, f lavori, il costo ci,j richiesto dalla persona i per svolgere il lavoro j, per
i = 1, 2, . . . , f e j = 1, 2, . . . , f
Trovare: un assegnamento di persone a lavori e viceversa
In modo tale che: ogni lavoro sia eseguito da una sola persona, ogni persona esegua un solo
lavoro e sia minimizzato il costo complessivo.

Potremmo pensare di formulare il problema utilizzando delle variabili intere oppure delle variabili
binarie. Vediamo la conseguenza di entrambe le scelte.
Supponiamo — erroneamente — di voler utilizzare delle variabili intere e associamo ad esse il
seguente significato xi = k se la persona i fa il lavoro k per i = 1, 2, . . . , f . Le variabili definite sono
dunque in numero di f . I vincoli che ogni lavoro sia eseguito da una sola persona e che ogni persona
esegua un solo lavoro si tradurrebbero negli f (f2−1) vincoli xi 6= xj , per ogni i = 1, . . . , f − 1, e
per ogni j = i + 1, . . . , f e negli f vincoli xi ≥ 1 per ogni i = 1, . . . , f . I primi f (f − 1)/2
vincoli non possono essere inseriti nella formulazione cosı̀ come sono, perché nelle formulazioni si
ammettono solo vincoli con ≥ o ≤. Tuttavia dire xi 6= xj corrisponde a dire che devono valere
o l’uno o l’altro dei seguenti due vincoli: xi > xj e xi < xj (si dice che i due vincoli sono in
exor tra di loro, ovvero si escludono mutuamente) Questa espressione dei vincoli non è ancora
ammissibile perché sono vincoli privi dell’uguaglianza, ma, poiché le variabili sono intere, possiamo
scriverli in modo equivalente come xi ≥ xj + 1 exor xi ≤ xj − 1. Come vedremo più avanti
utilizzando opportunamente nella formulazione una ulteriore variabile binaria possiamo esprimere
correttamente due vincoli in mutua esclusione, quindi possiamo considerare di essere riusciti a
scrivere correttamente i vincoli del problema di assegnamento. Come scrivere ora la funzione
obiettivo? Il valore ci,k xi non corrisponde al costo derivante dal fatto che la persona i fa il lavoro
k, infatti, esso risulta moltiplicato per tante volte quanto è l’indice del lavoro assegnato! (infatti
se, per esempio, fosse xi = k = 3 si avrebbe ci,k xi = kci,k = 3ci,k ). Questo difficoltà non può essere
superata in quanto non possiamo dividere ogni ci,j per il corrispondente j, per j = 1, 2, . . . , f dato
che il valore assunto dalla variabile xi nella soluzione finale lo conosceremo solo a posteriori, una
volta ottenuta la soluzione. Quindi possiamo concludere che non c’è modo di utilizzare le variabili
intere che abbiamo definito, e occorre pensare a un altro tipo di variabili.

Proviamo quindi a definire f 2 variabili binarie con il seguente significato:



1 se la persona i fa il lavoro j
xi,j = per i = 1, 2, . . . , f e j = 1, 2, . . . , f.
0 se la persona i non fa il lavoro j

Ad esempio, se nella soluzione finale il lavoro 1 sarà svolto dalla persona 3, avremo x3,1 = 1.
Per effetto del maggior numero di variabili, del loro tipo, e del significato ad esse associato, la
formulazione del problema risulta in questo caso notevolmente semplificata. Scriviamo i vincoli.
Gli f vincoli che impongono che ogni lavoro venga eseguito da una sola persona sono:
Pf
x1,1 + x2,1 + · · · + xf,1 = 1 ossia xi,1 = 1
Pi=1
f
x1,2 + x2,2 + · · · + xf,2 = 1 ossia i=1 xi,2 = 1
...
Pf
x1,f + x2,f + · · · + xf,f = 1 ossia i=1 xi,f = 1
In forma compatta, gli f vincoli si presentano cosı̀:

8
f
X
xi,j = 1 per j = 1, 2, . . . , f
i=1
Gli f vincoli che riflettono la richiesta che ogni persona esegua un solo lavoro si presentano sim-
metricamente ai precedenti:
Xf
xi,j = 1 per i = 1, 2, . . . , f
j=1

L’espressione della funzione obiettivo che si ricava dalla scelta delle variabili è:
f X
X f
ci,j xi,j
i=1 j=1

In questo modo, se la persona r non svolge il lavoro s, si ha xr,s = 0 ed il contributo cr,s xr,s
alla funzione obiettivo è nullo. Diversamente, se il lavoro s viene svolto dalla persona r, si ha
xr,s = 1 ed il contributo cr,s xr,s alla funzione obiettivo vale cr,s , pari al costo da sostenere affinché
la persona r esegua il lavoro s. La formulazione completa del problema dell’assegnamento è dunque
la seguente:
Pf Pf
min j=1 ci,j xi,j
Pi=1
f
s.t. xi,j = 1 per i = 1, 2, . . . , f
Pfj=1
i=1 i,j = 1 per j = 1, 2, . . . , f
x
x≥0
x ≤ 1 e intero
Si noti che le variabili sono sempre un vettore colonna. Il fatto che le variabili decisionali abbiano
due indici è solo per nostra convenienza (in modo da poter immediatamente identificare la coppia
(lavoro,persona) e non perché abbiamo a che fare con una matrice di variabili!
Il vettore dei coefficienti della funzione obiettivo è un vettore riga di f 2 elementi; le variabili
sono un vettore colonna di f 2 elementi; il vettore dei termini noti è un vettore colonna di 2f + f 2
elementi tutti uguali a 1 (i primi 2f sono i termini noti degli f + f vincoli di assegnamento,
i successivi f 2 sono i termini noti degli f 2 vincoli x ≤ 1 (avendo trascurato i vincoli di non-
negatività delle variabili); la matrice dei coefficienti dell’intera formulazione è una matrice con
2f + f 2 righe e f 2 colonne). Se f = 3, c ha 9 elementi, A è una matrice 15 × 9, b ha 15 elementi
tutti uguali a 1, e x lo possiamo scrivere come xT = (x1,1 , x1,2 , x1,3 , x2,1 , x2,2 , x2,3 , x3,1 , x3,2 , x3,3 ),
e i vincoli della formulazione, in forma estesa, appaiono cosı̀:
   
1 1 1 0 0 0 0 0 0 = 1
0 0 0 1 1 1 0 0 0 = 1
   
0 0 0 0 0 0 1 1 1
 = 1
 
 
1 0 0 1 0 0 1 0 0 x1,1 = 1
   
0 1 0 0 1 0 0 1 0 x1,2  = 1
    
0 0 1 0 0 1 0 0 1 x1,3  = 1
    
1 0 0 0 0 0 0 0 0 x2,1  ≤ 1
    
0 1 0 0 0 0 0 0 0 x2,2  ≤ 1
    
0 0 1 0 0 0 0 0 0 x2,3  ≤ 1
    
0 0 0 1 0 0 0 0 0 x3,1  ≤ 1
    
0 0 0 0 1 0 0 0 0 x3,2  ≤ 1
   
0 0 0 0 0 1 0 0 0 x3,3
  ≤  1

0 0 0 0 0 0 1 0 0
  ≤ 1
 
0 0 0 0 0 0 0 1 0 ≤ 1
0 0 0 0 0 0 0 0 1 ≤ 1
Quanto costa scrivere tutto questo? Si devono scrivere f 2 coefficienti di costo, (2f +f 2 )×f 2 elementi
per la matrice dei coefficinenti e 2f + f 2 elementi di b. Complessivamente, f 2 + 2f 3 + f 4 + 2f + f 2 .

9
Il termine predominante di questo polinomio è f 4 , quindi si dice che la complessità computazionale
della sola scrittura di un problema di assegnamento è O(f 4 ). Si noti che tale complessità è relativa
soltanto all’impostazione del problema e non alla sua risoluzione!

Assegnamento e matching perfetto, ovvero rappresentazione dei dati. Se associamo un nodo a ogni
persona, e un nodo a ogni lavoro, e mettiamo un arco tra ogni nodo-persona e ogni nodo-lavoro,
otteniamo un grafo bipartito completo. Un assegnamento è una selezione di coppie (persona,lavoro)
che soddisfa i vincoli. Ogni coppia (persona, lavoro) corrisponde a un arco del grafo bipartito. I
vincoli di uguaglianza della formulazione, attraverso le uguaglianze a 1, impongono che di archi
scelti ve ne sia esattamente 1 per ogni nodo (di qualunque tipo esso sia), ossia impongono che
la selezione di archi sia un matching perfetto sul grafo. Il problema dell’assegnamento, dunque
corrisponde a determinare un matching perfetto e di costo minimo su un grafo bipartito completo
Kf,f .

Se la definizione del problema prevedesse di poter associare ad ogni lavoro almeno una persona
(ma eventualmente anche più di una) e, rispettivamente, ad ogni persona almeno un lavoro (ma
eventualmente anche più di uno), i vincoli di uguaglianza della formulazione si tramuterebbero nei
seguenti vincoli di disuguaglianza:
Pf
xi,j ≥ 1 per j = 1, 2, . . . , f
Pi=1
f
j=1 xi,j ≥ 1 per i = 1, 2, . . . , f

Supponiamo infine che non tutte le persone desiderino (o siano in grado di) svolgere tutti i lavori.
Questa situazione può essere impostata in diversi modi equivalenti.
Il primo consiste nel definire comunque una variabile per ogni coppia (persona, lavoro) e suc-
cessivamente aggiungere alla formulazione il vincolo xi,j = 0 per ogni persona i che non desidera
fare il lavoro j: questi vincoli possono essere “applicati” all’interno della formulazione, ossia si può
sostituire il valore 0 a ogni occorrenza di xi,j , e successivamente eliminati, come anche le variabili
corrispondenti, dalla formulazione.
Il secondo modo, porta a questa stessa formulazione finale: si tratta semplicemente di non
definire le variabili xi,j corrispondenti a una persona i che non intende fare il lavoro j. Occorre
fare attenzione che questa scelta fa sı̀ che si debba modificare il modo di scrivere i vincoli. Per
esempio se la persona P3 non vuole o non è in grado di P fare il lavoro L1 , e noi abbiamo deciso di
f
non definire la variabile x3,1 , non possiamo più scrivere i=1 xi,1 ≥ 1 (in cui l’indice j ha assunto
Pf
il valore 1) perché i=1 xi,1 = x1,1 + x2,1 + x3,1 + · · · + xf,1 ma la variabile x3,1 non è stata definita!
Quindi occorreP prima definire l’insieme PS(L1 ) delle persone che sono in grado di fare il lavoro L1 e
poi scrivere i∈S(L1 ) xi,1 ≥ 1, infatti i∈S(L1 ) xi,1 è la sommatoria della variabili estese alle sole
Pf
persone in grado di fare il lavoro. Allo stesso modo non possiamo scrivere j=1 x3,j ≥ 1 (in cui
Pf
l’indice i ha assunto il valore 3) perché j=1 x3,j = x3,1 + x3,2 + · · · + x3,f , ma la variabile x3,1
non è stata definita! Anche qui, occorre preliminarmente
P definire l’insieme S(P3 ) dei lavori che la
persona P3 è in grado di fare, e poi scrivere j∈S(P3 ) x3,j ≥ 1.
Il terzo modo consiste nell’imporre un “opportuno” valore al costo ci,j riferito alla persona i
che non intende fare il lavoro j: il valore più opportuno è quel valore tale che in nessuna soluzione
ottima risulti xi,j = 1. Per ottenere questo risultato si sceglie opportunamente tra i valori 0, +∞,
e −∞. Il valore nullo non è una scelta corretta, perchè “invoglia” il solutore a fissare xi,j = 1, cosa
che permette di verificare alcuni vincoli senza alcun incremento della funzione obiettivo. Ancora più
grave è la scelta cij = −∞ che invita inesorabilmente il solutore a scegliere xi,j = 1 in una soluzione
ottima perché nella funzione obiettivo anziché un costo ci troviamo di fronte a un guadagno! In
definitiva la scelta corretta è che il costo ci,j riferito alla persona i che non intende fare il lavoro
j sia posto pari a +∞: in questo modo in nessuna soluzione ottima si avrebbe xi,j = 1, dato che
questa scelta comporterebbe una costo enorme, ottenendo in definitiva ciò che desideravamo, e cioè
di non affidare il lavoro j alla persona i.

10
Riprendendo infine il parallelo tra l’assegnamento e il matching, nel caso in questione in cui
alcune persone non desiderano fare alcuni lavori, ci troviamo a dover risolvere un matching perfetto
su un grafo bipartito non completo (infatti il grafo sarà privo degli archi che connettono una persona
con un lavoro che non desidera fare), ovvero come un matching perfetto su un grafo bipartito
completo in cui alcuni degli archi hanno pesi di valore +∞.

Programmazione a numeri interi

La formulazione tipica è la seguente:

max cx
s.t. Ax ≤ b
x ≥ 0 e intere
Richiedere che le variabili x siano intere serve per modellare tutti quei casi in cui si ha a che fare
con oggetti indivisibili. Vediamo un esempio di formulazione a numeri interi.

Knapsack intero

Supponiamo di avere n diversi tipi di oggetti, e supponiamo che il generico tipo di oggetto j sia
disponibile in un numero limitato mj di copie, con j = 1, 2, . . . , n e che siano note l’utilità uj ad
esso associata e il suo peso wj con j = 1, 2, . . . , n. Si supponga di voler riempire uno zaino con
alcuni tra questi oggetti, senza eccedere il peso massimo b sopportabile dallo zaino, e in modo da
massimizzare l’utilità complessiva degli oggetti scelti. Il problema descritto, nella forma “Dato,
Trovare, In Modo Tale Che” si presenta cosı̀:

Dati: n tipi di oggetti, ciascuno caratterizzato dal numero mj ≥ 0 di copie, dall’utilità uj ≥ 0,


e dal peso wj ≥ 0, per j = 1, 2, . . . , n; e il valore b della capacità dello zaino
Trovare: quali oggetti portare, e in che quantità
In modo tale che: sia massimizzata l’utilità complessiva, non si ecceda la capacità b dello zaino,
e di ogni tipo di oggetto non si prendano più copie di quelle disponibili.
L’unica differenza dello knapsack intero dallo knapsack binario è che nello knapsack intero il tipo
di oggetto j è a disposizione in mj copie. Quindi nello knapsack intero si tratta di decidere non
solo quali oggetti portare, ma anche in che quantità.

Per poter associare al problema una formulazione a numeri interi, occorre decidere che tipo di
variabili scegliere, e che significato attribuire ai valori che esse assumeranno. In questo caso,
trattandosi di determinare quali oggetti portare, e in che quantità, le variabili più convenienti sono
delle variabili intere non negative, una per ogni tipo di oggetto, limitate superiormente dal massimo
numero di copie disponibili per tale oggetto. In particolare il valore di una variabile xj indicherà
il numero di copie del tipo di oggetto j che vengono prese (in particolare, se xj = 0 vuol dire che
l’oggetto j non viene preso). A seguito di questa scelta, la formulazione risulta
Pn
max Pi=1 ui xi
n
s.t. i=1 wi xi ≤ b
x≥0
xi ≤ mi e intera, per i = 1, 2, . . . , n
Tutte le formulazioni con un solo vincolo (tolti quelli che impongono limiti superiori o inferiori alle
variabili) e in cui i coefficienti della funzione obiettivo, i coefficienti del vincolo, e il termine noto
hanno tutti valore non negativo, corrispondono a problemi di knapsack.
A proposito del numero massimo di copie di un oggetto j che saranno effettivamente prese,
osserviamo quanto segue. Per effetto del vincolo xi ≤ mi , ogni soluzione ammissible del problema

11
farà scegliere un numero di copie del tipo di oggetto i che non sarà superiore al numero mi di
copie effettivamente disponibili (si noti che se mi = 1 per ogni oggetto i, il problema diventa di
Knapsack binario). Tuttavia, pensiamo per assurdo di voler riempire lo zaino di soli oggetti i. Il
numero massimo di copie che la capacità massima dello zaino ci impone è pari a b wbi c. Quindi
possiamo senz’altro dire che in ogni soluzione il numero xi di copie del tipo di oggetto i risulterà
non superiore al più piccolo tra il numero mi di copie disponibili di quell’oggetto e il numero
massimo di copie che la capacità massima dello zaino ci impone, cioè risulterà xi ≤ min{mi ; b wbi c}.
Tale vincolo, anche se sempre verificato, non può essere inserito nella formulazione perché non ha
una espressione lineare. Rendere lineare tale vincolo è possibile, infatti
b b
xi ≤ min{mi ; b c} è equivalente alla coppia di vincoli lineari xi ≤ mi e xi ≤ b c.
wi wi
Questi ultimi due vincoli, proprio perché lineari, possono essere inseriti nella formulazione. Tut-
tavia, il primo vincolo è già presente, quindi non lo inseriamo nella formulazione, per evitare inutili
ridondanze. Il secondo vincolo della coppia, per come è stato calcolato, non può evidentemente
essere più stringente del vincolo da cui è stato derivato. Quindi possiamo evitare di inserirlo nella
formulazione, per evitare anche in questo caso inutili ridondanze.
Supponiamo che un’analisi preliminare dei dati del problema ci permetta di verificare che
b wbi c ≤ mi . Allora il vincolo mi ≥ xi potrà essere omesso dalla formulazione.
Supponiamo, infine, che, oltre a non voler portare con noi uno zaino troppo pesante (e cioè, il
cui peso ecceda il valore prestabilito b), il nostro zaino ponga dei limiti anche sul volume massimo
trasportabile V . In tal caso parleremo di knapsack multidimensionale, dove il termine “multidi-
mensionale” indica un problema che ha più di un vincolo, infatti sarà presente, oltre al vincolo sul
peso massimo sopportabile, anche il vincolo sul volume massimo disponibile:
n
X
vi x i ≤ V
i=1

dove vi rappresenta il volume dell’oggetto i, per i = 1, 2, . . . , n.


Analogamente a prima, avremo che in ogni soluzione ammissibile si avrá
b V
xi ≤ min{mi ; b c; b c}
wi vi
vincolo che può essere linearizzato in


 xi ≤ mi




xi ≤ b wbi c





xi ≤ b vVi c

Inoltre, se un’analisi preliminare dei dati del problema ci permette di verificare che
mi ≥ min{b wbi c; b vVi c} allora il vincolo xi ≤ mi potrà essere omesso dalla formulazione.

Un qualsiasi problema di Knapsack intero può essere trasformato in un problema di Knapsack


binario se si associa una variabile binaria a ogni singola copia di ogni tipo di oggetto, anziché
associare una variabile intera a ogni tipo di oggetto. Esempio: si consideri un problema di knapsack
intero con 3 oggetti con molteplicità (3,2,1), peso (2,4,3), e utilità (5,3,6), capacità dello zaino pari
a b = 5. La formulazione intera è la seguente:

max 5x1 + 3x2 + 6x3


s.t. 2x1 + 4x2 + 3x3 ≤ 5
x≥0
x1 ≤ 3 e intera
x2 ≤ 2 e intera
x3 ≤ 1 e intera

12
La formulazione binaria dello stesso problema si ottiene associando una variabile binaria a ciascuna
delle m1 = 3 copie del primo tipo di oggetto, siano y1 , y2 , y3 , una variabile binaria a ciascuna delle
m2 = 2 copie del secondo tipo di oggetto, siano y4 e y5 , e una variabile all’unica copia disponibile
del terzo tipo di oggetto, sia y6 . La formulazione binaria del problema è

max 5y1 + 5y2 + 5y3 + 3y4 + 3y5 + 6y6


s.t. 2y1 + 2y2 + 2y3 + 4y4 + 4y5 + 3y6 ≤ 5
y≥0
y ≤ 1 e intero
Si osservi che il numero di variabili della formulazione binaria è dato dalla somma delle molteplicità
dei vari tipi di oggetti, ossia al numero complessivo di oggetti. Nel nostro caso, vale m1 +m2 +m3 =
3 + 2 + 1 = 6.

13

Potrebbero piacerti anche