TRƯỜ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
Lớp
: THA- K52
Hà Nội 2011
I, 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
{
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.
}
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
{
int
int
int
}MAY;
struct
bot;//bien dem chi phan tu tiep theo cua array
sum; //tong thoi gian may da lam
array[MAX]; //mang cac cong viec may da lam
void NhapMang(int a[], int n)
{
for(int i=0; i
{
cin>>a[i];
}
}
void XuatMang(int a[], int n)
{
for(int i=0; i
{
cout<
}
cout<
}
void Swap(int &a, int &b)//Hoan
{
int tmp;
tmp=a;
a;
b=tmp =b;
}
vi cong viec
void GiamDan(int a[], int n)// Sap xep cong viec theo thu tu giam dan cua
thoi gian
{
for(int i=0; i
{
for(int j=i+1; j
{
if(a[i]
{
Swap(a[i], a[j]);
}
}
}
}
void GanMangBangKhong(int a[], int n)//Khoi dong cac may de lam viec
{
for(int i=0; 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
{
if(may[i].sum
{
minwhere=i;
}
}
return minwhere;
}
int ChiaViec(int viec[], int n, int m)
{
MAY may[MAX];
int min,max;
for(int k=0; k
{
GanMangBangKhong(may[k].array, MAX);
may[k].bot=0;
may[k].sum=0;
}
for(int i=0; i
{
//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
{
cout<<"May "<
XuatMang(may[j].array, may[j].bot);
cout<
//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"<
<<"\t\t\t\t\t\t\t\t Bai tap lon";
do
{
cout<
cin>>n;
cout<<"Thoi gian tung cong viec "<
NhapMang(arrayviec, n);
cout<<"Nhap vao so may xu ly cong viec: ";
cin>>m;
cout<
XuatMang(arrayviec, n);
GiamDan(arrayviec, n);
cout<<"Thoi gian de lam xong cac cong viec la: "<
c, n, m)<
cout<
cout.flush();
ch=getche();
}while(ch=='y' || ch=='Y');
}
III, Tài
liệu tham khảo
1. 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