Untitled
unknown
plain_text
a year ago
7.9 kB
9
Indexable
#define MAX_LINE 503
#define MAX_EQUIP 503
#define MAX_PRODUCT 30005
#include<unordered_map>
#include<queue>
#include<set>
using namespace std;
// Cấu trúc lưu thông tin của mỗi sản phẩm
struct Product{
int pID; // ID của sản phẩm
int line; // Dây chuyền sản xuất mà sản phẩm này sẽ sử dụng
int end; // Thời gian sản phẩm này hoàn thành sản xuất
int work; // Thời gian sản xuất cần thiết để hoàn thành sản phẩm
int idEquipInMap; // ID thiết bị ánh xạ với sản phẩm này
int statusPro; // Trạng thái của sản phẩm (1: chờ, 2: đang sản xuất, 3: đã hoàn thành)
};
Product products[MAX_PRODUCT]; // Mảng chứa thông tin tất cả các sản phẩm
int cntP, cntE; // `cntP`: đếm số lượng sản phẩm, `cntE`: đếm số lượng thiết bị
// Hàm so sánh để sắp xếp các sản phẩm trong quá trình sản xuất
struct cmp{
bool operator()(int a, int b){
// Sắp xếp theo thời gian kết thúc, nếu bằng thì sắp xếp theo ID sản phẩm
if(products[a].end < products[b].end || (products[a].end == products[b].end && products[a].pID < products[b].pID)){
return true;
}
return false;
}
};
// Khai báo các hàng đợi để quản lý sản phẩm trên các dây chuyền sản xuất
queue<int> listLine[MAX_LINE]; // Mỗi hàng đợi quản lý các sản phẩm đang chờ xử lý trên một dây chuyền
unordered_map<int,int> mapProduct; // Ánh xạ ID sản phẩm (pID) tới chỉ số của sản phẩm trong mảng `products[]`
unordered_map<int,int> mapEquip; // Ánh xạ ID thiết bị tới chỉ số của thiết bị trong hệ thống
set<int,cmp> listProducing; // Tập hợp các sản phẩm đang được sản xuất, sắp xếp theo hàm `cmp`
int equip[MAX_EQUIP]; // Trạng thái của các thiết bị (0: rảnh, 1: đang bận)
int lineBusy[MAX_LINE]; // Trạng thái của các dây chuyền sản xuất (-1: rảnh, ID sản phẩm: đang xử lý)
int numLine; // Số lượng dây chuyền
int numEquip; // Số lượng thiết bị
int timeLine; // Thời gian hiện tại của hệ thống
// Hàm khởi tạo hệ thống sản xuất với L dây chuyền và M thiết bị
void init(int L, int M) {
numLine = L; // Gán số dây chuyền sản xuất
numEquip = M; // Gán số thiết bị
cntP = 0; // Đặt số lượng sản phẩm về 0
cntE = 0; // Đặt số lượng thiết bị ánh xạ về 0
timeLine = 0; // Đặt thời gian hệ thống về 0
mapProduct.clear(); // Xóa tất cả ánh xạ sản phẩm
mapEquip.clear(); // Xóa tất cả ánh xạ thiết bị
listProducing.clear(); // Xóa danh sách sản phẩm đang sản xuất
for(int i = 0; i < MAX_LINE; i++){
listLine[i] = queue<int>(); // Khởi tạo hàng đợi cho các dây chuyền sản xuất
lineBusy[i] = -1; // Đặt trạng thái dây chuyền về rảnh (-1)
}
for(int i = 0; i < MAX_EQUIP; i++){
equip[i] = 0; // Đặt trạng thái tất cả thiết bị về rảnh (0)
}
return;
}
// Hàm duyệt sản phẩm đang sản xuất và cập nhật hệ thống tại thời điểm `timeSt`
void duyetSP(int timeSt, bool newr){
bool completed = false; // Biến kiểm tra xem có sản phẩm nào hoàn thành hay không
while(!listProducing.empty()){ // Duyệt qua danh sách các sản phẩm đang được sản xuất
auto it = listProducing.begin(); // Lấy sản phẩm có thời gian kết thúc sớm nhất
if(products[*it].end > timeSt){ // Nếu thời gian kết thúc của sản phẩm lớn hơn `timeSt`, ngừng duyệt
break;
}
products[*it].statusPro = 3; // Đánh dấu sản phẩm đã hoàn thành (statusPro = 3)
equip[products[*it].idEquipInMap] = 0; // Đặt thiết bị của sản phẩm về rảnh
lineBusy[products[*it].line] = -1; // Đặt dây chuyền sản xuất về rảnh
listProducing.erase(*it); // Xóa sản phẩm khỏi danh sách đang sản xuất
completed = true; // Đánh dấu đã có sản phẩm hoàn thành
}
// Nếu có sản phẩm mới hoặc sản phẩm đã hoàn thành, duyệt qua tất cả dây chuyền
if(newr == true || completed == true){
for(int i = 0; i < numLine; i++){
if(!listLine[i].empty()){ // Nếu dây chuyền có sản phẩm chờ xử lý
int idxPro = listLine[i].front(); // Lấy sản phẩm đầu tiên của dây chuyền
if(lineBusy[products[idxPro].line] == -1 && equip[products[idxPro].idEquipInMap] == 0){
// Nếu dây chuyền và thiết bị rảnh
listLine[i].pop(); // Loại bỏ sản phẩm khỏi hàng đợi
products[idxPro].statusPro = 2; // Đặt sản phẩm vào trạng thái đang sản xuất
products[idxPro].end = timeSt + products[idxPro].work; // Cập nhật thời gian kết thúc
equip[products[idxPro].idEquipInMap] = 1; // Đánh dấu thiết bị đang bận
lineBusy[products[idxPro].line] = products[idxPro].pID; // Đánh dấu dây chuyền đang bận
listProducing.insert(idxPro); // Thêm sản phẩm vào danh sách đang sản xuất
}
}
}
timeLine = timeSt; // Cập nhật thời gian của hệ thống
}
}
// Hàm yêu cầu sản xuất một sản phẩm mới
int request(int tStamp, int pId, int mLine, int eId, int mTime) {
for(int i = timeLine; i < tStamp; i++){ // Cập nhật hệ thống cho đến thời gian `tStamp`
duyetSP(i, false);
}
cntP++; // Tăng số lượng sản phẩm
products[cntP].pID = pId; // Gán ID sản phẩm
products[cntP].work = mTime; // Gán thời gian sản xuất
products[cntP].line = mLine; // Gán dây chuyền sản xuất
products[cntP].statusPro = 1; // Đặt trạng thái sản phẩm thành chờ xử lý
products[cntP].end = tStamp; // Đặt thời gian bắt đầu sản xuất
mapProduct[pId] = cntP; // Ánh xạ ID sản phẩm với chỉ số trong mảng `products`
if(mapEquip[eId] == 0){ // Nếu thiết bị chưa được ánh xạ
cntE++; // Tăng số lượng thiết bị
mapEquip[eId] = cntE; // Ánh xạ thiết bị vào hệ thống
}
products[cntP].idEquipInMap = mapEquip[eId]; // Gán thiết bị cho sản phẩm
listLine[mLine].push(cntP); // Thêm sản phẩm vào hàng đợi của dây chuyền
duyetSP(tStamp, true); // Duyệt hệ thống để xử lý sản phẩm ngay nếu có thể
return lineBusy[mLine]; // Trả về trạng thái dây chuyền
}
// Hàm kiểm tra trạng thái của sản phẩm tại thời điểm `tStamp`
int status(int tStamp, int pId) {
for(int i = timeLine; i <= tStamp; i++){ // Cập nhật hệ thống cho đến thời gian `tStamp`
duyetSP(i, false);
}
if(mapProduct[pId] == 0){ // Nếu sản phẩm không tồn tại
return 0; // Trả về 0 (sản phẩm không tồn tại)
}
return products[mapProduct[pId]].statusPro; // Trả về trạng thái của sản phẩm
}
Editor is loading...
Leave a Comment