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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top