1_intro¶
Problemi di Decisione e Modelli - Problema di decisione: Riguarda il fare le scelte ottimali, ovvero quelle che consentono di arrivare alla realizzazione di un sistema reale di qualità più elevata, il cui funzionamento dipende dalle scelte che si possono compiere. - Dati: Tutte le informazioni note a priori sul problema su cui il decisore non ha controllo. - Variabili: Tutte le grandezze i cui valori possono essere scelti dal decisore. Un assegnamento di valori a queste variabili corrisponde a una particolare realizzazione del sistema reale. - Vincoli: Condizioni che limitano i possibili valori che possono essere assegnati alle variabili, limitando quindi l’insieme di scelte del decisore. - Obiettivo: Il criterio di confronto tra le varie possibili realizzazioni del sistema reale, che misura la qualità di ogni realizzazione. - Modello del problema di decisione: Una rappresentazione astratta del sistema reale, dalla quale sono epurati tutti i dettagli non significativi al fine della risoluzione. - Modelli matematici dei problemi di decisione: Modelli nei quali le componenti del problema di decisione (dati, variabili, vincoli, obiettivo) sono tradotte in oggetti matematici.
Problemi di Ottimizzazione - Problemi di ottimizzazione: Problemi matematici le cui componenti principali sono un insieme (detto regione ammissibile e indicato con $S$) e una funzione $f: S \to R$ (detta funzione obiettivo). - Regione ammissibile ($S$): L'insieme dei punti che soddisfano i vincoli di un problema di ottimizzazione. - Funzione obiettivo ($f$): Una funzione $f: S \to R$. - Istanza del problema di ottimizzazione: Il problema ottenuto con determinati dati di input. - Problema di ottimizzazione (generico): L’insieme di tutte le istanze, ottenute facendo variare in tutti i modi possibili i dati di input. - Modelli di programmazione matematica: Modelli in cui le variabili del problema di decisione sono rappresentate come variabili matematiche a valori numerici (reali o interi), la regione ammissibile è descritta con equazioni/disequazioni e la funzione obiettivo è una funzione matematica delle variabili. - Soluzione ottima ($s^\star$): Un punto $s^\star \in S$ tale che $f(s^\star) \ge f(s) \forall s \in S$ (per il massimo) o $f(s^\star) \le f(s) \forall s \in S$ (per il minimo). - Valore ottimo del problema ($f(s^\star)$): Il valore della funzione obiettivo calcolato nella soluzione ottima $s^\star$. - Insieme delle soluzioni ottime ($S^\star$): L’insieme di tutti i punti $s^\star \in S$ che soddisfano la condizione di ottimalità per il problema dato (minimo o massimo). - Soluzione $\epsilon$-approssimata: Una soluzione ammissibile ($s \in S$) il cui valore della funzione obiettivo non differisce dal valore ottimo per più di $\epsilon f(s^\star)$. - Per problemi di minimo ($\epsilon \ge 0$): $S_\epsilon = {s \in S : f(s) \le (1 + \epsilon)f(s^\star), s^\star \in S^\star}$. - Per problemi di massimo ($\epsilon \ge 0$): $S_\epsilon = {s \in S : f(s) \ge (1 - \epsilon)f(s^\star), s^\star \in S^\star}$.
Algoritmi e Complessità - Algoritmi costruttivi: Algoritmi iterativi che aggiungono e/o tolgono pezzi di una soluzione parziale fino a ottenere una soluzione completa. - Senza revisione delle decisioni passate: Si possono solo aggiungere pezzi a una soluzione parziale, e un pezzo, una volta aggiunto, non viene più tolto. - Con revisione delle decisioni passate: Si possono anche rimuovere pezzi precedentemente aggiunti a una soluzione parziale. - Algoritmi di ricerca locale: Algoritmi iterativi che esplorano un vicinato ($N(s) \subseteq S$) di una soluzione ammissibile $s$ in cerca di una soluzione ammissibile migliore. - Algoritmi enumerativi: Algoritmi che enumerano (esplicitamente o implicitamente) tutte le possibili soluzioni ammissibili del problema. - Algoritmi di enumerazione implicita: Introducono condizioni che permettono di scartare interi sottoinsiemi della regione ammissibile senza valutare la funzione obiettivo $f$ in tutti i loro punti. - Algoritmi di ottimizzazione o esatti: Algoritmi che restituiscono una soluzione ottima e il suo valore ottimo per ogni istanza del problema di ottimizzazione. - Algoritmi di approssimazione: Algoritmi che restituiscono una soluzione $\epsilon$-approssimata e il suo valore della funzione obiettivo per ogni istanza. - Algoritmi euristici (Euristica): Algoritmi che restituiscono una soluzione ammissibile e il suo valore, spesso in tempi rapidi e di buona qualità, ma senza alcuna garanzia sulla distanza dal valore ottimo. - Dimensione di un’istanza ($\dim(I)$): Il numero di bit necessari per memorizzare i dati di input dell’istanza $I$. - Approccio worst-case: Associa a ogni dimensione $k$ delle istanze il massimo numero di operazioni richieste tra tutte le istanze di dimensione $k$. - Ordine di grandezza ($f(k) = O(g(k))$): Si legge ‘$f$ è dell’ordine di grandezza di $g$’ se $\exists C > 0 : f(k) \le Cg(k) \forall k$. - Complessità esponenziale: Un algoritmo per il quale il numero di operazioni $t_A(k)$ è dell’ordine di grandezza di $2^k$ oppure $k!$. - Complessità polinomiale: Un algoritmo per il quale $t_A(k)$ è dell’ordine di grandezza di $k^p$ per qualche intero positivo $p$.
2_grafi¶
Definizioni di Base - Grafo ($G$): Definito da un insieme di nodi $V$ e un insieme di archi $A \subset V \times V$. - Grafo orientato o Digrafo: Un grafo in cui ogni coppia $(i, j) \in A$ è ordinata (ovvero $(i, j) \ne (j, i)$). - Grafo non orientato: Un grafo i cui archi non sono coppie ordinate. - Predecessore (grafo orientato): Il nodo $i$ di un arco $(i, j)$. - Successore (grafo orientato): Il nodo $j$ di un arco $(i, j)$. - Nodi adiacenti (grafo non orientato): I nodi $i$ e $j$ di un arco $(i, j)$. - Archi adiacenti: Due archi che hanno un nodo in comune. - Grado del nodo $i$ ($\delta(i)$, grafo non orientato): La cardinalità dell’insieme dei nodi adiacenti a $i$. - In-degree del nodo $i$ ($\delta^-(i)$, grafo orientato): La cardinalità dell’insieme dei predecessori di $i$. - Out-degree del nodo $i$ ($\delta^+(i)$, grafo orientato): La cardinalità dell’insieme dei successori di $i$. - Grafo non orientato completo: Se esiste un arco che collega ogni coppia di nodi distinti. - Grafo orientato completo: Se esiste una coppia di archi di verso opposto che collega ogni coppia di nodi. - Matrice di incidenza nodo-arco (non orientato): Matrice in ${0, 1}^{|V| \times |A|}$ dove la componente è 1 se il nodo $k$ è un estremo dell'arco $(i, j)$, 0 altrimenti. - Matrice di incidenza nodo-arco (orientato): Matrice in ${0, 1, -1}^{|V| \times |A|}$ dove la componente è $+1$ se $k$ è il nodo iniziale ($i$), $-1$ se $k$ è il nodo finale ($j$), e 0 altrimenti.
Cammini, Cicli e Connessione - Cammino: Una sequenza di nodi $s_0 \to s_1 \to \cdots \to s_t$ in cui archi consecutivi esistono nel grafo (non orientati nel caso non orientato; nel verso corretto nel caso orientato, per un cammino orientato). - Lunghezza del cammino: Il numero $t$ di archi della sequenza. - Cammino elementare: Un cammino senza ripetizioni di nodi. - Cammino semplice: Un cammino senza ripetizioni di archi. - Ciclo: Ogni cammino $s_0 \to s_1 \to \cdots \to s_t$ in cui $s_0 = s_t$. - Nodo accessibile: Un nodo $j$ è accessibile da $i$ se esiste un cammino che li congiunge. - Componenti connesse: Le classi di equivalenza indotte dalla relazione di accessibilità sull’insieme dei nodi. I nodi all'interno di una classe sono tutti accessibili tra loro. - Grafo connesso: Un grafo con una singola componente connessa. - Circuito hamiltoniano: Un ciclo (orientato se il grafo è orientato) che tocca tutti i nodi del grafo una e una sola volta.
Strutture e Sotto-Grafi - Matching (grafo non orientato): Un sottoinsieme $M \subseteq A$ di archi tale che per ogni nodo $i \in V$, esiste al massimo un arco in $M$ incidente su $i$. In alternativa, un sottoinsieme di archi $M$ tali che tra essi non ci sia alcuna coppia di archi adiacenti. - Grafo bipartito (non orientato): Un grafo in cui l’insieme $V$ può essere partizionato in due sottoinsiemi $V_1$ e $V_2$ tali che ogni arco congiunge un nodo in $V_1$ con un nodo in $V_2$ (non contiene cicli di lunghezza dispari). - Grafo bipartito completo: Un grafo bipartito in cui per ogni coppia $i \in V_1, j \in V_2$ si ha che $(i, j) \in A$. - Grafo parziale di $G$: Dato $G = (V, A)$, un grafo $G' = (V, A')$ dove $A' \subseteq A$. - Sottografo di $G$: Un grafo $G'' = (V'', A'')$ dove $V'' \subseteq V$ e $A'' \subseteq A(V'')$ (archi di $A$ tra nodi in $V''$). - Albero (grafo non orientato): Un grafo connesso e aciclico (equivalente a connesso con $m = n-1$, o aciclico con $m = n-1$, o con un unico cammino tra ogni coppia di nodi). - Albero di supporto di $G$: Un grafo parziale $G' = (V, A')$ di $G$ che sia un albero. - Nodo radice: Un nodo identificato in un albero. - Nodo foglia: Un nodo che non ha successori/figli in un albero. - Albero binario: Un albero in cui l’out-degree di ogni nodo non supera 2 ($\delta^+(i) \le 2$). - Binary heap (Struttura dati): Un albero binario con una chiave associata a ciascun nodo, che soddisfa la proprietà Shape (livelli completi, tranne l’ultimo inserito da sinistra a destra) e la proprietà Heap (la chiave di un nodo è sempre almeno grande quanto quella dei suoi nodi figli).
3_spanning_tree¶
- Problema di albero di supporto a peso minimo (Minimum Spanning Tree - MST): Individuare un sottoinsieme $E_T \subset E$ di archi di un grafo $G=(V, E)$ tale che $(V, E_T)$ sia un albero di supporto (connesso e aciclico) e il suo costo totale $w(T) = \sum_{(i, j) \in E_T} w_{ij}$ sia minimo.
- Algoritmo greedy: Un algoritmo che fa la scelta migliore in un particolare momento (scelta localmente ottima) senza valutare le conseguenze future.
- Foresta di supporto di un grafo $G$: Un grafo parziale $F = (V, E_F)$ di $G$ privo di cicli.
4_flusso_min_costo¶
Flusso e Basi (Capacità Illimitate) - Flusso di un arco ($x_{ij}$): La quantità di prodotto che viaggia lungo l’arco $(i, j)$. - Flusso ammissibile: Un assegnamento di flussi $x_{ij}$ tale che: 1) per ogni nodo $i$, la differenza tra flusso uscente e flusso entrante è $b_i$ (vincoli di bilancio); 2) $0 \le x_{ij} \le d_{ij}$. - Problema di flusso a costo minimo: Trovare un flusso ammissibile $x$ che minimizzi il costo di trasporto $\sum_{(i, j) \in A} c_{ij}x_{ij}$. - Base ($B$): Un sottoinsieme di $n-1$ archi che formano un albero di supporto di un grafo orientato $G$. - Archi in base/fuori base: Archi in $B$ / archi fuori $B$. - Soluzione di base associata a $B$: L’unica soluzione che rispetta i vincoli di bilancio, ottenuta fissando a 0 il flusso lungo gli archi fuori base. - Base ammissibile ($\mathcal{F}$): Una base $B$ se la soluzione di base associata $x(B)$ soddisfa $x(B)_{ij} \ge 0$ per ogni arco. - Coefficiente di costo ridotto ($\bar{c}_{ij}$): Associato a un arco fuori base $(i, j)$, misura la variazione di costo che si ottiene incrementando il flusso lungo $(i, j)$ da 0 a 1. - Condizione di ottimalità (capacità illimitate): Se $\bar{c}_{ij} \ge 0$ per ogni arco fuori base. In tal caso $x(B)$ è soluzione ottima. - Basi adiacenti: Una base $B'$ ottenuta da $B$ rimuovendo un arco e sostituendolo con un altro. - Condizione di illimitatezza (capacità illimitate): Si verifica se, incrementando un flusso lungo un arco $(i, j)$ con $\bar{c}_{ij} < 0$, il ciclo $C_{(i, j)}(B)$ generato è un ciclo orientato, permettendo al costo di trasporto di decrescere a $-\infty$. - Problema di I fase: Un problema ausiliario creato per trovare una base ammissibile iniziale, risolvendo il quale si può stabilire se il problema originario ha una regione ammissibile non vuota.
Triple e Soluzioni (Capacità Limitate) - Tripla ($T$): Una partizione dell’insieme di archi $A$ in tre sottoinsiemi $(B, N_0, N_1)$, dove $B$ è un albero di supporto, $N_0$ sono archi fuori base a valore nullo, e $N_1$ sono archi fuori base a valore pari alla capacità. - Soluzione di base associata alla tripla $T$: Soluzione che rispetta i vincoli di bilancio fissando a 0 il flusso sugli archi in $N_0$ e alla capacità $d_{hk}$ il flusso sugli archi in $N_1$. - Tripla ammissibile ($\mathcal{F}$): Una tripla $T$ se la soluzione associata $x(T)$ soddisfa $0 \le x_{ij}(T) \le d_{ij}$ per ogni arco. - Condizione di ottimalità (capacità limitate): Se $\bar{c}_{ij} \ge 0$ per ogni arco fuori base in $N_0$, e $\bar{c}_{ij} \le 0$ per ogni arco fuori base in $N_1$. In tal caso $x(T)$ è soluzione ottima.
5_flusso_max¶
- Vincoli di equilibrio (Flusso Massimo): Per ogni nodo intermedio $i \in V \setminus {S, D}$ (dove $S$ è la sorgente e $D$ la destinazione), il flusso uscente è uguale al flusso entrante.
- Flusso totale ($F(x)$): La quantità di dati che esce dal nodo sorgente $S$ (pari a quella che entra nel nodo destinazione $D$).
- Problema di flusso massimo: Cercare, tra tutti i flussi ammissibili $x$, quello che massimizza il flusso totale $F(x)$.
- Taglio della rete ($S_U$): Un insieme di archi $S_U = {(i, j) \in A : i \in U, j \notin U}$, dove $U \subset V$ è un sottoinsieme di nodi che contiene la sorgente $S$ ma non la destinazione $D$.
- Costo di un taglio ($C(S_U)$): La somma delle capacità degli archi del taglio.
- Problema del taglio a costo minimo: Determinare il taglio $S_U$ il cui costo è il più piccolo possibile. (Il valore ottimo del flusso massimo è uguale al valore ottimo del taglio a costo minimo).
- Arco saturo: Un arco $(i, j)$ con flusso $x_{ij} = d_{ij}$ (non è possibile inviare ulteriore flusso).
- Grafo associato al flusso $x$ ($G(x)$): Grafo orientato con archi forward ($A_f(x)$, archi non saturi) e archi backward ($A_b(x)$, archi con flusso positivo ma con verso invertito).
- Algoritmo di Ford-Fulkerson: Algoritmo che risolve il problema di flusso massimo implementando la ricerca locale tramite una procedura di etichettatura per trovare cammini orientati da $S$ a $D$ nel grafo associato $G(x)$.
6_matching¶
- Problema di matching di peso massimo: Dato un grafo non orientato $G=(V, A)$, trovare un matching $M \in \mathcal{M}(G)$ (sottoinsieme di archi non adiacenti) che massimizzi il peso totale $w(M) = \sum_{(i, j) \in M} w_{ij}$.
- Problema di matching di cardinalità massima su grafi bipartiti: Caso particolare in cui il grafo $G$ è bipartito e tutti i pesi sono unitari ($w_{ij}=1$), massimizzando quindi $|M|$.
7_assegnamento¶
- Problema di assegnamento: Dato un grafo bipartito completo $G = (V_1 \cup V_2, A)$ con $|V_1| = |V_2| = n$, si cerca un matching $M$ di cardinalità $n$ (che copra tutti i nodi) che minimizzi il costo totale $d(M)$.
- Lower bound ($L_k$): Una limitazione inferiore del valore ottimo. $L_2$ viene calcolato dalla somma dei minimi di colonna e dei minimi di riga della matrice dei costi.
- Sottoproblema degli zeri indipendenti: Determinare un sottoinsieme di 0 della matrice $T_2$ di cardinalità massima, tale che non ci siano due zeri sulla stessa riga o colonna. (Equivale a trovare un matching di cardinalità massima nel grafo bipartito associato agli zeri).
- Algoritmo ungherese: Un algoritmo costruttivo che risolve il problema di assegnamento, basato sulla riduzione della matrice dei costi e sulla ricerca iterativa di insiemi di zeri indipendenti per trovare un assegnamento di costo $L_k$.
8_branch_and_bound¶
- Branch-and-bound (B&B): Metodo di risoluzione iterativo che raffina una partizione della regione ammissibile $S$.
- Partizione (di $S$): Suddivisione di $S$ in sottoinsiemi $S_i$ che sono disgiunti e la cui unione è $S$.
- Upper bound ($U(S_i)$): Una limitazione dal di sopra per il massimo valore di $f(x)$ su un sottoinsieme $S_i$, ovvero $U(S_i) \ge \max_{x \in S_i} f(x)$.
- Rilassamento: Un problema ausiliario $\max_{x \in S'_i} f'(x)$ tale che $S_i \subset S'_i$ e $f'(x) \ge f(x)$ per $x \in S_i$, la cui soluzione ottima fornisce un $U(S_i)$.
- Lower bound (LB): Una limitazione dal di sotto del valore ottimo del problema, $LB \le \max_{x \in S} f(x)$, spesso calcolato come il valore di una soluzione ammissibile $x̄ \in S$.
- Regola di branching: Una regola per partizionare un sottoinsieme $S_i$ in due o più sottoinsiemi figli.
- Regola di cancellazione di sottoinsiemi: Un sottoinsieme $S_i$ può essere cancellato se $U(S_i) \le LB$ (poiché nessun punto in $S_i$ può migliorare $LB$).
- Enumerazione implicita (nel B&B): Processo implementato dalla regola di cancellazione che permette di scartare intere regioni $S_i$ senza valutarne esplicitamente tutti i punti.
- Collezioni $C$ e $F$: $C$ contiene i sottoinsiemi ancora da esplorare; $F$ contiene i sottoinsiemi cancellati.
9_programmazione_dinamica¶
- Programmazione Dinamica (PD): Un approccio risolutivo basato su stati ($S$), stati iniziali ($S_i$), stati finali ($S_f$), decisioni ($D(s)$), funzione di transizione ($t$), funzione valore ($f$), e una regola di dominanza ($\succeq$).
- Principio di ottimalità: Per ciascuno stato $s \in S$, il valore ottimo del problema che si può raggiungere partendo da $s$ (massimo $f(s')$ per $s' \in R(s) \cap S_f$) non dipende da come lo stato $s$ è stato raggiunto.
- Regola di dominanza (PD per Knapsack): Una regola che permette l'enumerazione implicita, per esempio: uno stato $(k, c, v)$ domina $(k', c', v')$ se $k' = k, c' = c, v' \le v$, o nella forma rafforzata, se $k' = k, c' \le c, v' \le v$.
10_shortest_path¶
- Problema Shortest Path (SP) / Problema di cammino minimo: Data una funzione $f(P)$ che associa la lunghezza di un cammino $P$ (somma delle distanze $d_{ij}$), si cerca il cammino orientato da $o$ a $d$ a lunghezza minima.
- Regola di dominanza (PD per SP): Uno stato $(i, \ell_i)$ domina $(j, \ell'_j)$ se $i = j$ e $\ell'_j \ge \ell_i$.
- Algoritmo di Dijkstra: L'algoritmo di programmazione dinamica per il problema SP.
- Algoritmo A$\star$ per SP: Simile a Dijkstra, utilizza una funzione euristica aggiuntiva $h(i)$ che limita dal di sotto la distanza di ciascun nodo $i$ dal nodo target $d$ per migliorare l'efficienza, ordinando la coda di priorità in base a $\ell_i + h(i)$.
- Problema SP con vincolo di risorsa: Problema SP in cui si aggiunge un vincolo sul consumo massimo $R$ di una risorsa $\rho_{i}$ lungo il cammino, con stati definiti da triplette $(i, \ell_i, \rho_i)$.
- Regola di dominanza (PD per SP con vincolo di risorsa): Uno stato $(i, \ell_i, \rho_i)$ domina $(j, \ell'_j, \rho'_j)$ se $i = j, \ell'_i \ge \ell_i$ e $\rho'_i \ge \rho_i$.
11_commesso_viaggiatore¶
- Problema del Commesso viaggiatore (TSP): Trovare, in un grafo completo, un circuito hamiltoniano (ciclo che tocca tutti i nodi una sola volta) di distanza totale minima $f(C)$.
- Ricerca locale 2opt: Ricerca locale per TSP in cui il vicinato $N_{2opt}(C)$ di un circuito $C$ è costituito dai circuiti ottenuti invertendo un sottocammino tra due nodi. È un algoritmo euristico.
- Ciclo euleriano: Un ciclo che attraversa tutti gli archi del grafo una e una sola volta.
- Problema TSP metrico: Caso particolare di TSP in cui il grafo è simmetrico ($d_{ij} = d_{ji}$) e le distanze soddisfano la diseguaglianza triangolare ($d_{ij} + d_{jk} \ge d_{ik}$).
- Algoritmo Double Spanning Tree (DST): Algoritmo che utilizza l'MST (Minimum Spanning Tree) per costruire un ciclo euleriano e poi ridurlo a un circuito hamiltoniano. Per il TSP metrico, è un algoritmo di 1-approssimazione.
12_insieme_indipendente_clique¶
- Insiemi indipendenti: Sottoinsiemi di nodi $I$ di un grafo non orientato in cui nessuna coppia di nodi è collegata da un arco.
- Problema del massimo insieme indipendente: Trovare l'insieme indipendente di cardinalità massima.
- Grafo complementare ($\bar{G}$): Un grafo con lo stesso insieme di nodi $V$ di $G$, ma con archi $\bar{A}$ che sono tutti gli archi possibili che non appartengono ad $A$.
- Clique: Un sottoinsieme di nodi $C \subseteq V$ di un grafo non orientato in cui tutti i nodi sono collegati tra loro da archi.
- Clique massimale: Una clique che non può essere espansa ulteriormente con nodi non appartenenti a $C$.
- Problema di massima clique: Determinare la clique di cardinalità massima.
13_complexity¶
- Problemi di ottimizzazione combinatoria: Problemi di ottimizzazione in cui la regione ammissibile è composta da un numero finito di elementi.
- Classe di problemi P: Un problema di ottimizzazione $R$ appartiene alla classe $P$ se e solo se esiste un algoritmo di complessità polinomiale che lo risolve.
- Classe di problemi NP: Contiene tutti i problemi di ottimizzazione per i quali, data la soluzione ottima $s^\star$, il valore ottimo $f(s^\star)$ può essere calcolato in tempo polinomiale. (Si nota che $P \subseteq NP$).
- Trasformazione in tempo polinomiale ($R_1 \to R_2$): Ogni istanza di $R_1$ di dimensione $k$ può essere risolta risolvendo un’istanza di $R_2$ di dimensione polinomiale $p(k)$.
- Problema NP-completo: Un problema $R$ è NP-completo se $R \in NP$ e se ogni problema $Q \in NP$ è trasformabile in tempo polinomiale in $R$. (Questi sono problemi ritenuti "difficili", la cui risoluzione in tempo polinomiale è altamente improbabile, a meno che $P=NP$).
- Schema di approssimazione completamente polinomiale (FPTAS): Algoritmo di $\epsilon$-approssimazione che richiede tempi polinomiali sia rispetto alla dimensione dell'istanza che rispetto all'inverso $1/\epsilon$ della precisione richiesta.
- Schema di approssimazione polinomiale (PTAS): Algoritmo di $\epsilon$-approssimazione che richiede tempo polinomiale rispetto alla dimensione dell'istanza ma esponenziale rispetto all'inverso $1/\epsilon$ della precisione richiesta.
14_knapsack¶
- Problema dello zaino (Knapsack - KP): Individuare un sottoinsieme di $n$ oggetti (ciascuno con peso $w_i$ e profitto $v_i$) trasportabile in uno zaino di capacità $b$ e che massimizzi il profitto totale.
- Sottoinsieme speciale della regione ammissibile ($S(I_0, I_1)$): Sottoinsieme di soluzioni ammissibili dove l'insieme degli oggetti ${1, \ldots, n}$ è partizionato in $I_0$ (oggetti non scelti), $I_1$ (oggetti scelti) e $I_f$ (oggetti liberi).
- Insieme di oggetti liberi ($I_f$): Gli oggetti su cui la decisione (0 o 1) deve ancora essere presa: $I_f = {1, \ldots, n} \setminus [I_0 \cup I_1]$.