Tải bản đầy đủ (.pdf) (6 trang)

TTNT - Buoi 2 - Bai toan phan cong cong vien - Ly thuyet + Bai tap

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (321.24 KB, 6 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

1


<b>PHẦN 1: CƠ SỞ LÝ THUYẾT </b>



<b>Nguyên lý thứ tự: Thực hiện hành động dựa trên một cấu trúc thứ tự hợp lý của khơng gian </b>
khảo sát nhằm nhanh chóng đạt được một lời giải tốt.


<b> Bài toán phân việc – ứng dụng của nguyên lý thứ tự </b>


Một công ty nhận được hợp đồng gia công m chi tiết máy J1, J2, … Jm. Cơng ty có n máy gia


công lần lượt là P1, P2, … Pn. Mọi chi tiết đều có thể được gia cơng trên bất kỳ máy nào. Một khi


đã gia công một chi tiết trên một máy, công việ sẽ tiếp tục cho đến lúc hồn thành, khơng thể bị
cắt ngang. Để gia công một việc J1 trên một máy bất kỳ ta cần dùng một thời gian tương ứng là


t1. Nhiệm vụ của công ty là phải làm sao gia cơng xong tồn bộ n chi tiết trong thời gian sớm


nhất.


Chúng ta xét bài toán trong trường hợp có 3 máy P1, P2, P3 và 6 cơng việc với thời gian là t1=2,


t2=5, t3=8, t4=1, t5=5, t6=1. ta có một phương án phân cơng (L) như hình sau:


Theo hình này, tại thời điểm t=0, ta tiến hành gia công chi tiết J2 trên máy P1, J5 trên P2 và J1 tại


P3. Tại thời điểm t=2, công việc J1 được hoàn thành, trên máy P3 ta gia công tiếp chi tiết J4.


Trong lúc đó, hai máy P1 và P2 vẫn đang thực hiện công việc đầu tiên mình … Sơ đồ phân việc


theo hình ở trên được gọi là lược đồ GANTT. Theo lược đồ này, ta thấy thời gian để hoàn thành


tồn bộ 6 cơng việc là 12. Nhận xét một cách cảm tính ta thấy rằng phương án (L) vừa thực hiện
là một phương án không tốt. Các máy P1 và P2 có quá nhiều thời gian rãnh.


Thuật tốn tìm phương án tối ưu L0 cho bài tốn này theo kiểu vét cạn có độ phức tạp cỡ O(mn)


(với m là số máy và n là số công việc). Bây giờ ta xét đến một thuật giải Heuristic rất đơn giản
(độ phức tạp O(n)) để giải bài tốn này.


 Sắp xếp các cơng việc theo thứ tự giảm dần về thời gian gia công.


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

2


Rõ ràng phương án L* vừa thực hiện cũng chính là phương án tối ưu của trường hợp này vì thời
gian hồn thành là 8, đúng bằng thời gian của công việc J3. Ta hy vọng rằng một giải Heuristic


đơn giản như vậy sẽ là một thuật giải tối ưu. Nhưng tiếc thay, ta dễ dàng đưa ra được một trường
hợp mà thuật giải Heuristic không đưa ra được kết quả tối ưu.


Nếu gọi T* là thời gian để gia công xong n chi tiết máy do thuật giải Heuristic đưa ra và T0



thời gian tối ưu thì người ta đã chứng minh được rằng


, M là số máy


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

3


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

4


<b>PHẦN 2: BÀI TẬP </b>




// TTNT.cpp : Defines the entry point for the console application.


#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;


#define so_may 3
#define so_cv 6


//Cấu trúc dữ liệu của công việc


typedef struct {
int thoigian;
int chiso;
}JOB;


//Cấu trúc dữ liệu của Máy thực hiện


typedef struct {


int tong_tg; //Tổng thời gian máy thực hiện


int so_viec; //Số công việc máy đã làm


JOB cong_viec[so_cv]; //Danh sách các cơng việc máy đã làm


}Machine;



//Hốn vị


void Swap(JOB &a,JOB &b) {
JOB tam;


//Hoan vi chi so cua cong viec


tam.chiso=a.chiso;
a.chiso=b.chiso;
b.chiso=tam.chiso;


//Hoan vi thoi gian cua cong viec


tam.thoigian=a.thoigian;
a.thoigian=b.thoigian;
b.thoigian=tam.thoigian;
}


//Sắp xếp các công việc theo thứ tự giảm dần của thời gian


void Sort(JOB job[]) {


for(int i=0;i<so_cv-1;i++)


for(int j=i+1;j<so_cv;j++)


if(job[j].thoigian>job[i].thoigian)
Swap(job[i],job[j]);


}



//Nhập thời gian thực hiện của các công việc


void InputJob(JOB job[]) {


cout<<"Nhap thoi gian thu hien cua cac cong viec"<<endl;
for(int i=0;i<so_cv;i++) {


cout<<"Cong viec thu "<<i+1<<": ";
job[i].chiso=i+1;


cin>>job[i].thoigian;
}


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

5
//Xuất danh sách các công việc ra màn hình


void OutputJob(JOB job[]) {
for(int i=0;i<so_cv;i++) {


cout<<"["<<job[i].chiso<<"] = "<< job[i].thoigian;
cout<<endl;


}
}


//Khởi tạo giá trị ban đầu cho các máy


void InitMachine(Machine mac[]) {
for(int i=0;i<so_may;i++) {



mac[i].tong_tg=0;
mac[i].so_viec=0;
}


}


//Tìm kiếm máy có thời gian thực hiện ít nhất


int Min(Machine mac[]) {
int i,vt=0;


int min=mac[vt].tong_tg;
for(i=vt+1;i<so_may;i++) {


if(mac[i].tong_tg<min) {
min=mac[i].tong_tg;
vt=i;


}
}


return vt;
}


//Thực hiện công việc


void Work(Machine mac[],JOB job[]) {
int vt,n;



for(int i=0;i<so_cv;i++) {


vt=Min(mac); //chon may co thoi gian lam viec la it nhat


n=mac[vt].so_viec; //So viec may da lam


//gan cong viec tiep theo vao cho mac


mac[vt].tong_tg+=job[i].thoigian;
mac[vt].cong_viec[n].thoigian=job[i].thoigian;
mac[vt].cong_viec[n].chiso=job[i].chiso;
mac[vt].so_viec++;
}
}


//Xuất kết quả sau khi các máy thực hiện công việc


void OutputResult(Machine mac[]) {
int i,j;


for(i=0;i<so_may;i++) {


cout<<endl<<"May "<<i+1<<":";


cout<<endl<<"\tTong thoi gian lam viec la: "<<mac[i].tong_tg;
cout<<endl<<"\tCac cong viec: ";


for(j=0;j<mac[i].so_viec;j++)


cout<<mac[i].cong_viec[j].chiso<<" ";


}


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

6
int main() {


cout<<"Phan cong cong viec (m may - n cong viec)"<<endl;
Machine mac[so_may];


JOB job[so_cv];
InitMachine(mac);
InputJob(job);
Sort(job);


cout<<"Sap xep cac cong viec giam dan theo thoi gian: "<<endl;
OutputJob(job);


//Xuất các công việc ra màn hình theo thứ tự thời gian thực hiện


Work(mac,job);
OutputResult(mac);


getch();
return 0;
}


<b>Mở rộng bài tập</b>



1. Nhập số máy từ bàn phím. Nhập số cơng việc từ bàn phím, sau đó nhập thời gian thực
hiện cho các công việc



</div>

<!--links-->

×