TRƯỜNG ĐẠI HỌC MỎ ĐỊA CHẤTKHOA CÔNG NGHỆ THÔNG TIN TRÍ TUỆ NHÂN TẠO Đề tài: Viết chương trình giải bài toán phân công công việc bằng cách ứng dụng nguyên lý thứ tự GIÁO VIÊN HƯỚNG DẪN: N
Trang 1TRƯỜNG ĐẠI HỌC MỎ ĐỊA CHẤT
KHOA CÔNG NGHỆ THÔNG TIN
TRÍ TUỆ NHÂN TẠO
Đề tài: Viết chương trình giải bài toán phân công công việc bằng cách ứng dụng nguyên lý thứ tự
GIÁO VIÊN HƯỚNG DẪN: NHÓM SINH VIÊN THỰC HIỆN:
HOÀNG THỊ PHƯƠNG THẢO
Trang 2Lời nói đầu
Năng lực máy tính ngày càng mạnh mẽ là điều kiện thuận lợi cho trí tuệ nhân tạo: cho phép những chương trình máy tính áp dụng các thuật giải trí tuệ nhân tạo có khả năng phản ứng nhanh và hiệu quả hơn trước
Khả năng hiện tại của tất cả các sản phẩm trí tuệ nhân tạo vẫn còn khiêm tốn nhưng ngành khoa học này vẫn đang tiến bộ mỗi ngày và tỏ ra hữu dụng trong 1 số công việc đòi hỏi trí thông minh của con người trí tuệ nhân tạo đã trở thành một phần thiết yếu của công nghiệp kỹ thuật, cung cấp giải pháp cho những vấn đề khó khăn nhất trong ngành khoa học máy tính
Đối với lập kế hoạch các hệ thống thông minh phải biết thiết lập các mục tiêu và cách đạt được chúng, có khả năng chọn phương thức tốt nhất trong các phương thức có sẵn để đạt được mục tiêu Áp dụng lĩnh vực này của trí tuệ nhân tạo vào bài toàn phân công công việc ta thấy cho
ra kết quả tốt Trong bài tập phân công công việc nay nhóm chúng em đã sử dụng ngôn ngữ C để làm bài toán
Trang 3Chương 1: Phân tích bài toán
1 Đề bài:
Một công ty nhận được hợp đồng gia công m chi tiết C1, C2, …, Cn Cty có n máy gia công là M1, M2, …, Mm Mỗi chi tiết có thể được gia công trên bất cứ máy nào Một khi đã gia công một chi tiết trên một máy, công việc sẽ tiếp tục cho đến lúc hoàn thành Việc gia công chi tiết Ci bất kỳ trên một máy bất kỳ cần dùng một thời gian bất kỳ là ti Tìm cách phân bổ công việc để thời gian hoàn thành toàn bộ các chi tiết là nhanh nhất
2 Phân tích bài toán
Sử dụng nguyên lý thứ tự sắp xếp n các công việc tăng dần theo thời gian và sắp nó vào
m máy
Ví dụ: Cụ thể có 3 máy M1, M2, M3 và 6 chi tiết với thời gian tương ứng là t1=2, t2=5, t3=8, t4=1, t5=5, t6=1
Khi sắp xếp theo thứ tự tăng dần ta được: t4=1, t6=1, t1=2, t2=5, t5=5 , t3=8
Lần lượt sắp xếp các chi tiết theo thứ tự đó vào máy còn dư nhiều thời gian nhất
Phương án L* này cũng chính là phương án tối ưu với tổng thời gian là 8, đúng bằng thời gian hoàn thành chi tiết C3
Độ phức tạp là O(n)
Trang 4Chương 2: Thuật giải và code
#include<iostream.h>
#include<conio.h>
1 Định nghĩa kiểu dữ liệu cho công việc gồm biến đếm chỉ phần tử tiếp theo của mảng, biến tính tổng thời gian máy đã làm việc và biến mảng gồm max công việc máy đã làm
typedef struct
{
int bot;//bien dem chi phan tu tiep theo cua array
int sum;
int array[MAX];
}MAY;
2 Xuất mảng void
XuatMang(int a[], int n)
{
for(int i=0; i<n; i++)
{
cout<<a[i]<<"\t";
}
cout<<endl;
}
3 Hoán vị công việc
void Swap(int &a, int &b)
{
int tmp;
tmp=a;
a=b;
Trang 5b=tmp;
}
4 Xắp xếp công việc giảm dần
void GiamDan(int a[], int n)
{
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]);
}
}
}
}
5 Khởi tạo cho mảng giá trị bằng 0
void GanMangBangKhong(int a[], int n)
{
for(int i=0; i<n; i++)
{
a[i]=0;
}
}
6 Tìm ra máy có tổng thời gian làm các công việc là ít nhất int MinDong(MAY may[], int m)
Trang 6int minwhere=0;
for(int i=1; i<m; i++)
{
if(may[i].sum<may[minwhere].sum)
{
minwhere=i;
}
}
return minwhere;
}
7 Chia công việc cho các máy
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 7//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 3 may
if(may[j].sum>max)
max=may[j].sum;
}
return max;
}
8 Xây dựng công việc phân công công việc
9 void main()
{
int n,m;
int arrayviec[MAX];
Trang 8char ch;
cout<<"\t\t\tn Cong viec chia cho m May"<<endl <<"\t\t\t\t\t\t\t\t Ddo 2-11-10";
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);