/ / न्यूनतम: क्या यह बाधा संभव है? - बाधाएं, बाधा-प्रोग्रामिंग, चेक-बाधाएं, न्यूनतम

Minizinc: क्या यह बाधा संभव है? - बाधाएं, बाधा-प्रोग्रामिंग, चेक-बाधाएं, न्यूनतम

मुझे यह पता लगाना है कि यह कैसे लिखना हैबाधा: मेरे पास परीक्षा की एक सूची है, हर परीक्षा की अवधि है; अंतिम आउटपुट एक वास्तविक समय-सारिणी का प्रदर्शन है, कॉलम में उपलब्ध घंटे, सुबह के चार और दोपहर के चार, दोपहर के भोजन के बीच में दो घंटे के साथ होते हैं जो "टी उपलब्ध हो जाता है। चलो, मुझे बनाने दो यह पूरी तरह से स्पष्ट है, अगर मेरी दो परीक्षाएं हैं और प्रत्येक परीक्षा की एक निर्धारित अवधि है, तो मैं परीक्षा की संख्या को उनकी अवधि से जुड़ी समय सारिणी में दिखाना पसंद करता हूं, क्योंकि मेरे चर परीक्षा के हैं।

उदाहरण के लिए: मेरे पास दो परीक्षाएं हैं और पहली में एक घंटे, दूसरे तीन घंटे लगते हैं

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;

मुझे यह आउटपुट पसंद है: [1,2,2,2] और [0,0,0,4] (ऊर्ध्वाधर मोड में) क्या मिनिज़िन में करना संभव है? दूसरे आउटपुट के लिए कोड है:

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

अग्रिम में धन्यवाद

उत्तर:

जवाब के लिए 2 № 1

(हाय, यह प्रश्न आपके मूल प्रश्न की तुलना में उत्तर देना अधिक आसान है क्योंकि यह बहुत अधिक है।

यहां एक संस्करण है जो दो अतिरिक्त सरणियों का उपयोग करता हैनिर्णय चर: "ExamsRoom" एक परीक्षा के लिए कमरे के काम को संभालने के लिए, और परीक्षा के शुरुआती समय के लिए "ExamsStart"। शायद ये वास्तव में आवश्यक नहीं हैं, लेकिन इससे परीक्षा अवधि की बाधा को बताना आसान हो जाता है; कमरे और समय के कार्य भी अधिक स्पष्ट रूप से दिखाए जाते हैं। वे आगे की बाधाओं को जोड़ने के लिए भी उपयोगी हो सकते हैं।

मैंने पैरामीटर "कमरे = 2" को भी जोड़ा क्योंकि यह आपके उदाहरण से गायब था।

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;

इस मॉडल में 20 अलग-अलग समाधान हैं, पहले दो (एक सॉल्वर के रूप में गॉबोस का उपयोग करके) है

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]
----------

पहले समाधान का मतलब है कि परीक्षा 1 से शुरू होती हैकमरा 1 में समय 4, और परीक्षा 2 समय 1 से शुरू होती है, कमरे 1 में भी। दूसरे समाधान में परीक्षा 2 के लिए एक ही काम है, लेकिन परीक्षा 1 से कमरे 2 (समय 1 पर) सेट करें।

आशा है कि यह आपको मॉडल के साथ आगे बढ़ने में मदद करेगा।

/ hakank