Notifiche
Cancella tutti

[Risolto] come passare da un problema if-else ad una formulazione per un processo di ottimizzazione MILP

  

0

Buonasera a tutti, avrei bisogno di un aiuto: Sto facendo la tesi di laurea magistrale su un problema di ottimizzazione tramite la programmazione lineare.
Nello specifico, per la risoluzione con il metodo MIX INTEGER LINEAR PROGRAMMING, mi hanno detto che non è possibile avere un problema if-else.
Ho appunto questa funzione if-else e dovrei trovare il modo di trascriverla attraverso una funzione matematica in cui β dipenda dalle grandezze x1 e x2 (mettendo tutto in un'unica funzione).

β = 1 se k1x1 - k2x2 >= C
β = 0 altrimenti

k1,k2,C sono costanti, x1,x2 sono le variabili.
Tale termine β compare nella funzione obiettivo (da minimizzare) sotto forma di β*C

La mia relatrice mi ha detto che l'idea deve essere quella di avere un parametro che si comporta come in questo modo, ovvero che verifica alternativamente queste due disequazioni

x3 > C*y
x4 <= C(1-y)

Con y binario [0;1]

Non riesco proprio a capire come si può impostare il problema.
Ringrazio tutti quelli che proveranno ad aiutarmi.

Autore
Etichette discussione
2 Risposte



1

Temo che dipenda fortemente
* dagli scopi del programma e
* dal sistema di programmazione nel quale intendi implementare il modello.
Quant'è importante la rapidità di calcolo? Si tratta di programmare il marketing del prossimo semestre, oppure di acquisizione di bersaglio, inseguimento, previsione e lancio di un missile antimissile, oppure di qualcosa di intermedio fra questi due estremi?
Nel linguaggio implementato nel tuo sistema come sono trattati i valori logici? C'è un tipo boolean? C'è il type casting? Ci sono le espressioni condizionali? Ci sono funzioni di scelta (sgn, min, max)? Ci si possono definire funzioni d'utente?
Se ci sono le espressioni condizionali la tua funzione rimane if-then-else, solo che è a valore anziché ad azione; si avrebbe
* β*C ≡ C if k1*x1 - k2*x2 >= C else 0
Se c'è il type casting il valore aritmetico è direttamente quello della relazione di confronto che, se è vera, dà 1; se no, dà 0.
Ammesso che:
* rD ≡ relazioneDefinente ≡ quella che, se è vera, ...
* int(False) = 0
* int(True) = 1
si avrebbe
* β = int(k1*x1 - k2*x2 >= C)
* β*C ≡ int(k1*x1 - k2*x2 >= C)*C
* y = int(rD)
e così via.
Se ci fornisci qualche dettaglio informativo in più parecchi di noi potremmo anche fornirti qualche dettaglio implementativo.

Vi spiego in maniera un po' più dettagliata il mio studio.

Ho una microrete elettrica e l'obiettivo è quello di incrementare la sua resilienza a fronte di eventi atmosferici che ne interrompano l'alimentazione dalla rete. 

Viene descritta quindi una funzione obiettivo che è una funzione min (deve minimizzare i costi). La microrete è composta da una batteria e, se tale batteria riesce a mantenere un certo livello di carica stabilito (costante C), avrò un incentivo. Tale incentivo è posto nella funzione obiettivo come β*(valore incentivo)*valore di carica stabilito(C).

Definisco i parametri:

k1=rendimento di carica della batteria
k2=rendimento di scarica della batteria
x1=potenza di carica
x2=potenza di scarica

 

Il paramentro β però assume valori 0 e 1:

β = 1 se k1x1 - k2x2 >= C
β = 0 altrimenti

E' anche vero che la batteria o si carica o si scarica, quindi non posso avere in contemporanea le due parte della disequazione che definisce il β=1 (può essere magari questo un vincolo?)

Dovrei riuscire ad avere il parametro β in una equazione che mi permette di ottenere il valore di incentivo se β=1 e che invece non mi permette di avere incentivo se β=0, tutto ciò eliminando l'if-then-else che da quanto ho capito non si può avere quando si parla di programmazione lineare.

Per ora mi sono dedicata solo allo studio della parte teorica che ci sta dietro, poi lo studio verrà implementato con matlab.

Spero di essermi spiegata meglio. 🙂 



1

@giulia1234 

Se ho capito bene la tua funzione beta dovrebbe essere il gradino unitario di Heaviside

che appunto vale 1 se il suo argomento é positivo o nullo e zero altrimenti

beta(x1,x2,C) = u [ (x1 x2 C)*(k1 - k2 - 1)' ]

Vi spiego in maniera un po' più dettagliata il mio studio.

Ho una microrete elettrica e l'obiettivo è quello di incrementare la sua resilienza a fronte di eventi atmosferici che ne interrompano l'alimentazione dalla rete. 

Viene descritta quindi una funzione obiettivo che è una funzione min (deve minimizzare i costi). La microrete è composta da una batteria e, se tale batteria riesce a mantenere un certo livello di carica stabilito (costante C), avrò un incentivo. Tale incentivo è posto nella funzione obiettivo come β*(valore incentivo)*valore di carica stabilito(C).

Definisco i parametri:

k1=rendimento di carica della batteria
k2=rendimento di scarica della batteria
x1=potenza di carica
x2=potenza di scarica

 

Il paramentro β però assume valori 0 e 1:

β = 1 se k1x1 - k2x2 >= C
β = 0 altrimenti

E' anche vero che la batteria o si carica o si scarica, quindi non posso avere in contemporanea le due parte della disequazione che definisce il β=1 (può essere magari questo un vincolo?)

Dovrei riuscire ad avere il parametro β in una equazione che mi permette di ottenere il valore di incentivo se β=1 e che invece non mi permette di avere incentivo se β=0, tutto ciò eliminando l'if-then-else che da quanto ho capito non si può avere quando si parla di programmazione lineare.

Per ora mi sono dedicata solo allo studio della parte teorica che ci sta dietro, poi lo studio verrà implementato con matlab.

Spero di essermi spiegata meglio. 🙂 



Risposta




SOS Matematica

4.6
SCARICA