/ / Minizinc: cette contrainte est-elle possible? - contraintes, programmation de contraintes, contraintes de contrôle, minizinc

Minizinc: cette contrainte est-elle possible? - contraintes, programmation de contraintes, contraintes de contrôle, minizinc

Je voudrais comprendre comment écrire cecicontrainte: j'ai une liste d'examens, chaque examen a une durée; le résultat final est l’affichage d’un emploi du temps réel; dans les colonnes figurent les heures disponibles, quatre heures du matin et quatre heures de l’après-midi, avec deux heures au milieu du déjeuner, qui ne seront pas disponibles.Alors laissez-moi faire. Ceci est parfaitement clair, si j’ai deux examens et que chaque examen a une durée déterminée, j’aimerais afficher le numéro de l’examen dans l’horaire lié à leur durée, car mes variables sont les examens.

Par exemple: j'ai deux examens et le premier prend une heure, le second trois heures

int: Exams;
array[1..Exams] of int: Exams_duration;


int: Slotstime;         % number of slots
int: Rooms;             % number of rooms
array[1..Slotstime,1..Rooms] of var 0..Exams: Timetable_exams;

%Data

Exams=2;
Exam_duration=[1,3];
Slotstime=4;

Je voudrais avoir cette sortie: [1,2,2,2] et non [0,0,0,4] (en mode vertical) Est-il possible de faire dans Minizinc? Le code pour la deuxième sortie est:

constraint forall (p in 1..Rooms)
(
sum (s in 1..Slotstime) (Timetable_exams[s,p])
= sum (f in 1..Exams)(Exams_duration[f])
);

Merci d'avance

Réponses:

2 pour la réponse № 1

(Bonjour, il est plus facile de répondre à cette question qu'à votre question d'origine car elle est beaucoup plus pertinente.)

Voici une version qui utilise deux tableaux supplémentaires devariables de décision: "ExamsRoom" pour gérer l'affectation de la salle à un examen et "ExamsStart" pour l'heure de début de l'examen. Celles-ci ne sont peut-être pas vraiment nécessaires, mais elles facilitent l'énoncé de la contrainte de durée d'examen. les assignations de la salle et du temps sont plus clairement montrées. Ils peuvent également être utiles pour ajouter des contraintes supplémentaires.

J'ai également ajouté le paramètre "Rooms = 2" car il manquait dans votre exemple.

int: Exams;
array[1..Exams] of int: Exams_duration;

int: Slotstime;         % number of slots
int: Rooms;             % number of rooms
array[1..Slotstime,1..Rooms] of var 0..Exams: Timetable_exams;

array[1..Exams] of var 1..Rooms: ExamsRoom; % new
array[1..Exams] of var 1..Slotstime: ExamsStart; % new

solve satisfy;
% solve :: int_search(x, first_fail, indomain_min, complete) satisfy;

constraint

% hakank"s version

% for each exam
forall(e in 1..Exams) (
% find a room
exists(r in 1..Rooms) (
% assign the room to the exam
ExamsRoom[e] = r /
% assign the exam to the slot times and room in the timetable
forall(t in 0..Exams_duration[e]-1) (
Timetable_exams[t+ExamsStart[e],r] = e
)
)
)

/ % ensure that we have the correct number of exam slots
sum(Exams_duration) = sum([bool2int(Timetable_exams[t,r]>0) | t in 1..Slotstime, r in 1..Rooms])
;

output [
if r = 1 then "n" else " " endif ++
show(Timetable_exams[t,r])
| t in 1..Slotstime, r in 1..Rooms
]
++
[
"nExamsRoom: ", show(ExamsRoom), "n",
"ExamsStart: ", show(ExamsStart), "n",
]
;

%
% Data
%
Exams=2;
Exams_duration=[1,3];
Slotstime=4;

% was not defined
Rooms = 2;

Ce modèle propose 20 solutions différentes, les deux premières (utilisant Gecode comme solveur) sont

2 0
2 0
2 0
1 0
ExamsRoom: [1, 1]
ExamsStart: [4, 1]
----------

2 1
2 0
2 0
0 0
ExamsRoom: [2, 1]
ExamsStart: [1, 1]
----------

La première solution signifie que l'examen 1 commence àheure 4 dans la salle 1 et l'examen 2 commence à l'heure 1, également dans la salle 1. La deuxième solution a la même tâche pour l'examen 2, mais placez l'examen 1 dans la salle 2 (à l'heure 1).

J'espère que cela vous aide à aller plus loin avec le modèle.

/ hakank