TRƯỜNG ĐẠI HỌC NÔNG NGHIỆP HÀ NỘIKHOA CÔNG NGHỆ THÔNG TIN BÀI TẬP LỚN TRÍ TUỆ NHÂN TẠO Đề tài: “Tìm hiểu bài toán phân công công việc và demo”.. Giáo viên hướng dẫn : TS.Nguyễn Thị Thủy
Trang 1TRƯỜNG ĐẠI HỌC NÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
BÀI TẬP LỚN TRÍ TUỆ NHÂN TẠO
Đề tài: “Tìm hiểu bài toán phân công công việc và demo”.
Giáo viên hướng dẫn : TS.Nguyễn Thị Thủy Nhóm sinh viên thực hiện: Kiều Văn Hải
Vương Minh Huế
Mùa Thị May
Hà Sơn Tùng
Hà Nội 2011
Trang 2I, Bài toán phân công công việc
1, Nội dung bài toán
Một đề án gồm n công việc và các việc sẽ được thực hiên bởi m máy như nhau.
Giả sử biết thời gian để 1 máy thực hiện viêc thứ j là tj Yêu cầu: Tìm phương án phân công sao cho thời gian hoàn thành toàn
bộ công việc là thấp nhất.
Mẫu số liệu : n=10, m=3
tj = 4 9 5 2 7 6 10 8 7 5
2, Giải thuật: được viết dưới dạng thủ tục tương tự như thuật toán nhưng
không đòi hỏi các tiêu chuẩn như thuật toán.
- Tính đúng: chấp nhận các giải thuật đơn giản, có thể cho kết quả đúng hay gần đúng nhưng có khả năng thành công cao hơn.
- Để có thể được chấp nhận, giải thuật phải thể hiện một giải pháp hợp lý nhất
có thể trong tình huống hiện tại bằng cách:
+ Tận dụng mọi thông tin hữu ích + Sử dụng tri thức, kinh nghiệm trực giác của con người + Tự nhiên, đơn giản nhưng cho kết quả chấp nhận được
è Giải thuật Heuristic
Giải thuật cho bài toán phân công đơn giản:
Chọn việc J chưa phân công có thời gian thực hiện cao nhất phân công cho máy có thời gian làm việc thấp nhất
for(k=0;k<n;k++)
{
Chọn việc J chưa phân công có thời gian thực hiện cao nhất.
Chọn máy M có thời gian làm việc thấp nhất
Bố trí việc J cho máy M.
Trang 3}
n=10, m=3
II, Chương trình
// Bai toan phan cong cong viec: n Viec chia cho m May // Bai tap lon
#include<iostream.h>
#include<conio.h>
#define MAX 20
typedef struct
{
int bot;//bien dem chi phan tu tiep theo cua array int sum; //tong thoi gian may da lam
int array[MAX]; //mang cac cong viec may da lam }MAY;
void NhapMang(int a[], int n)
{
for(int i=0; i<n; i++)
{
cin>>a[i];
}
}
void XuatMang(int a[], int n)
{
for(int i=0; i<n; i++)
{
cout<<a[i]<<"\t";
}
cout<<endl;
}
void Swap(int &a, int &b)//Hoan vi cong viec
{
int tmp;
tmp=a;
a;
b=tmp =b;
}
Trang 4void GiamDan(int a[], int n)// Sap xep cong viec theo thu tu giam dan cua thoi gian
{
for(int i=0; i<n-1; i++)
{
for(int j=i+1; j<n; j++)
{
if(a[i]<a[j])
{
Swap(a[i], a[j]);
}
}
}
}
void GanMangBangKhong(int a[], int n)//Khoi dong cac may de lam viec
{
for(int i=0; i<n; i++)
{
a[i]=0;
}
}
// Tim ra may co tg lam tong cong viec it nhat
int MinDong(MAY may[], int m)
{
int minwhere=0;
for(int i=1; i<m; i++)
{
if(may[i].sum<may[minwhere].sum)
{
minwhere=i;
}
}
return minwhere;
}
int ChiaViec(int viec[], int n, int m)
{
MAY may[MAX];
int min,max;
for(int k=0; k<m; k++)
{
GanMangBangKhong(may[k].array, MAX);
may[k].bot=0;
may[k].sum=0;
}
for(int i=0; i<n; i++)
Trang 5{
//tim ra may co tg lam viec ngan nhat, lay vi tri may do ra
min=MinDong(may, m);
//gan cong viec tiep theo vao may do
may[min].array[may[min].bot++]=viec[i];
//cong tg cua cong viec do vao tong tg lam viec (sum) cua may do may[min].sum=may[min].sum+viec[i];
}
max=may[0].sum;
for(int j=0; j<m; j++)
{
cout<<"May "<<j+1<<" :\t";
XuatMang(may[j].array, may[j].bot);
cout<<endl;
//tim ra tong tg lon nhat cua cac may
if(may[j].sum>max)
max=may[j].sum;
}
return max;
}
void main()
{
int n,m;
int arrayviec[MAX];
char ch;
cout<<"\t\t\tn Cong viec chia cho m May"<<endl
<<"\t\t\t\t\t\t\t\t Bai tap lon";
do
{
cout<<endl<<"So cong viec: ";
cin>>n;
cout<<"Thoi gian tung cong viec "<<endl;
NhapMang(arrayviec, n);
cout<<"Nhap vao so may xu ly cong viec: ";
cin>>m;
cout<<endl;
XuatMang(arrayviec, n);
GiamDan(arrayviec, n);
cout<<"Thoi gian de lam xong cac cong viec la: "<<ChiaViec(arrayvie
c, n, m)<<endl;
cout<<endl<<"Ban co muon lam tiep khong ? (y/n)";
cout.flush();
ch=getche();
}while(ch=='y' || ch=='Y');
}
III, Tài liệu tham khảo
Trang 61 Trí tuệ nhân tạo(Chương I: THUẬT TOÁN – THUẬT GIẢI, phần II: THUẬT GIẢI HEURISTIC)_Hoàn Kiếm
2 Nguồn Internet