Come modellare semplice problema di programmazione utilizzando MS Risolutore Fondazione?
-
21-09-2019 - |
Domanda
Ho il seguente problema semplice che vorrei utilizzare per sperimentare MS Risolutore Fondazione :
Ho un programma in cui ho bisogno di avere 2 lavoratori al giorno per 30 giorni. Ho bisogno di onorare i seguenti vincoli:
- Nessun popolo dovrebbe funzionare due giorni di fila.
- Se non si applica un'eccezione speciale, la gente dovrebbe funzionare solo una volta a settimana.
- Alcune persone può funzionare solo nei fine settimana.
- Alcune persone può funzionare solo nei giorni feriali.
Ho intenzione di utilizzare C # per compilare il modello, ma ho bisogno di aiuto per iniziare con la modellazione. Non sono sicuro di come impostare il decisioni, parametri e vincoli per affrontare questo tipo di problema.
Aggiornamento: Mentre ire-e-maledizioni ha un buon inizio, devo immaginare che ci sia un modo più dichiarativo per esprimere questi vincoli utilizzando il framework piuttosto che dover codificare individualmente per ogni persona . Chiunque più familiarità con MSF, che può aiutare con questa costruzione?
Soluzione
Se si dispone di persone n
, si dovrà definire 30n
parametri interi binari ciascuno indica se una persona lavora in un giorno specifico o meno.
P<xx>D<yy> == 1 => Person <xx> works on day <yy>
P<xx>D<yy> == 0 => Person <xx> does not work on day <yy>
Quindi è necessario vincoli per impedire a lavorare su due giorni di fila. Questo sarà vincoli 29n
.
P<xx>D<yy> + P<xx>D<yy+1> <= 1
Quindi è necessario vincoli di lavorare solo una volta alla settimana. Questo sarà il seguente per la prima settimana e simile per le prossime tre settimane.
P<xx>D00 + P<xx>D01 + P<xx>D02 + P<xx>D03 + P<xx>D04 + P<xx>D05 + P<xx>D06 <= 1
L'ultima settimana sarà solo quanto segue.
P<xx>D28 + P<xx>D29 <= 1
Questo produrrà un altro vincoli 5n
. Quindi aggiungere vincoli per i giorni feriali solo
P<xx>D05 + P<xx>D06 == 0
P<xx>D12 + P<xx>D13 == 0
P<xx>D19 + P<xx>D20 == 0
P<xx>D26 + P<xx>D27 == 0
e solo nei fine settimana
P<xx>D00 + P<xx>D01 + P<xx>D02 + P<xx>D03 + P<xx>D04 == 0
P<xx>D07 + P<xx>D08 + P<xx>D09 + P<xx>D10 + P<xx>D11 == 0
P<xx>D14 + P<xx>D15 + P<xx>D16 + P<xx>D17 + P<xx>D18 == 0
P<xx>D21 + P<xx>D22 + P<xx>D23 + P<xx>D24 + P<xx>D25 == 0
P<xx>D28 + P<xx>D29 == 0
e infine aggiungere una funzione di destinazione.