Tải bản đầy đủ (.docx) (25 trang)

SẮP XẾP LỊCH CÔNG VIỆC GREENDY

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 (263.55 KB, 25 trang )


MỌI THÔNG TIN CHI TIẾT XIN LIÊN
HỆ
MAIL:
XEM DEMO
BÁO CÁO
CODE

2


TRƯỜNG ĐẠI HỌC CẦN THƠ
KHOA CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG

NIÊN LUẬN CƠ SỞ NGÀNH KỸ THUẬT PHẦN
MỀM
PHẦN MỀM SẮP XẾP LỊCH CƠNG VIỆC
BẰNG THUẬT TỐN GREEDY

Sinh viên thực hiện:

Giảng viên hướng dẫn:

XXXXXXX

TS. Nguyễn Công Danh

MSSV: XXXXXXX
Lớp: DI1796A2

3




Học kì 1, Năm học 2020-2021

4


ĐÁNH GIÁ KẾT QUẢ THỰC HIỆN NIÊN LUẬN CƠ SỞ NGÀNH
KTPM
(Học kỳ 1, Năm học 2020-2021)
GIÁO VIÊN HƯỚNG DẪN:
S
HỌ VÀ TÊN
T
T
1
Nguyễn Công Danh

MSCB

SINH VIÊN THỰC HIỆN:
Ghi chú: Điểm trong khung “các sinh viên thực hiện” là điểm kết quả cuối cùng của
từng sinh viên trong quá trình thực hiện niên luận 1.Nếu sinh viên demo chương trình và
trả lời vấn đáp không đạt yêu cầu của giáo viên hướng dẫn thì sinh viên sẽ nhận điểm F
cho học phần này.
Cần Thơ, ngày tháng năm 2020
GIÁO VIÊN CHẤM

5



Mục lục
Chương 1. Tổng Quan
I.

MƠ TẢ BÀI TỐN

1
1

II.

MỤC TIÊU CẦN ĐẠT ĐƯỢC

1

III.

HƯỚNG GIẢI QUYẾT

1

IV.

KẾ HOẠCH THỰC HIỆN

1

Chương 2. Lý thuyết
I.


CÁC KHÁI NIỆM

2
2

2.1. Khái niệm thuật toán Tham ăn (Greedy):

2

2.2. Chú thích các từ ngữ và ký hiệu :

2

II.

KẾT QUẢ VẬN DỤNG LÝ THUYẾT VÀO ĐỀ TÀI

Chương 3. Kết quả ứng dụng
I.

PHÂN TÍCH U CẦU BÀI TỐN

II.

CẤU TRÚC DỮ LIỆU CẦN THIẾT

2
3
3

3

3.2.1. Lớp Công việc:

3

3.2.2. Hàm đọc danh sách công việc từ file text:

4

3.2.3. Hàm nhập công việc

5

3.2.4. Hàm Sắp xếp danh sách công việc

6

3.2.5. Hàm Greedy (chọn các công việc từ danh sách công việc)

7

III.

Giải thuật – Lưu đồ

IV.

GIỚI THIỆU PHẦN MỀM


8
10

3.4.1. Sơ đồ Usecase

10

3.4.2. Giao diện chính

10
1


3.4.3. Giao diện Upload File

11

3.4.4. Giao diện nhập công việc

12

3.4.5. Giao diện Sắp xếp công việc

12

Chương 4. Kết luận – Đánh giá
I.

13


KẾT QUẢ ĐẠT ĐƯỢC:

13

4.1.1.

Về mặt chuyên môn:

13

4.1.2.

Về mặt kinh nghiệm:

13

4.1.3.

Những ưu điểm và hạn chế

13

II.

TÀI LIỆU THAM KHẢO

14

Chương 1. Tổng Quan
I.


MƠ TẢ BÀI TỐN

Trong xu thế phát triển hiện đại ngày nay, việc lựa chọn các
công việc tốt và mang lại nhiều lợi ích ln được các nhà đầu tư chú
trọng. Tuy nhiên, việc lựa chọn luôn mất nhiều thời gian và cơng sức
tính tốn để đưa ra các lựa chọn phù hợp. Vì vậy người ta tìm đến các
công cụ hỗ trợ để giúp gợi ý đưa ra các quyết định phù hợp.
Nhằm đáp ứng nhu cầu đó, Phần mềm Sắp xếp lịch cơng việc
bằng thuật tốn Greedy đã được xây dựng. Phần mềm giúp người sử
dụng có được một danh sách các công việc với thời gian và lợi ích tốt,
từ đó người sử dụng sẽ có thể đưa ra các lựa chọn phù hợp và tính
tốn thời gian hợp lý.
Phần mềm được thiết kế với giao diện đơn giản, thao tác tiện lợi,
kết quả nhanh chóng với phương án tốt.

2


II.

MỤC TIÊU CẦN ĐẠT ĐƯỢC

Nắm vững kiến thức cấu trúc dữ liệu và giải thuật, quan trọng là
thuật toán Greedy ( thuật toán tham ăn). Vận dụng thuật toán tham
ăn lựa chọn các công việc trong danh sách công việc với mong muốn
tối ưu lợi nhuận đạt được. Thiết kế giao diện đơn giản, dễ sử dụng, có
thể hỗ trợ người sử dụng nhập dữ liệu nhanh hơn thông qua import
file.
III.


HƯỚNG GIẢI QUYẾT

-

Sử dụng cấu trúc dữ liệu để lưu trữ danh sách các công việc ban đầu.

-

Sắp xếp các cơng việc theo lợi nhuận khơng giảm. Sao đó dùng thuật tốn tham
ăn để lựa chọn những cơng việc có lợi nhuận lớn nhất.
IV.

KẾ HOẠCH THỰC HIỆN

Tuần

Công việc

Tuần 1 – Tuần 3

Tìm hiểu lý thuyết và vẽ sơ đồ Usecase.

Tuần 4 – Tuần 5

Vẽ lưu đồ giải thuật và thiết kế giao diện.

Tuần 6 – Tuần

Lập trình các chức năng và giao diện đồ họa.


10
Tuần 11 – Tuần

Kiểm thử phần mềm và viết báo cáo.

12
Tuần 13

Đóng gói phần mềm.

3


Chương 2. Lý thuyết
CÁC KHÁI NIỆM

I.

2.1. Khái niệm thuật toán Tham ăn (Greedy):
Thuật toán Tham ăn (Greedy algorithm) là một thuật tốn giải
quyết bài tốn theo kiểu metaheuristic để tìm kiếm lựa chọn tối ưu địa
phương ở mỗi bước đi với hy vọng tìm được tối ưu tồn cục.
Thuật tốn Tham ăn thường được vận dụng để giải bài toán tối
ưu tổ hợp bằng cách xây dựng một phương án X. Phương án X được
xây dựng bằng cách lựa chọn từng thành phần Xi của X cho đến khi
hoàn chỉnh (đủ n thành phần). Với mỗi Xi, ta sẽ lựa chọn nó một cách
tối ưu. Với cách này thì có thể ở bước cuối cùng ta khơng cịn gì để
chọn mà phải chấp nhận một giá trị cuối cùng còn lại. Tuy nhiên, kết
quả đạt được chỉ là một phương án tốt chứ chưa hắn là tối ưu.

2.2. Chú thích các từ ngữ và ký hiệu :
Từ ngừ và ký hiệu
metaheuristic

Ý nghĩa
được thiết kế để tìm, tạo hoặc
chọn một thuật tốn tìm kiếm
từng phần.

II.

KẾT QUẢ VẬN DỤNG LÝ THUYẾT VÀO ĐỀ TÀI

Vận dụng thuật toán tham ăn vào phần mền có giao diện đồ
họa, giúp người dùng có giao diện trực quan, đơn giản. Thêm mới chức
năng chọn lại công việc giúp cho sự lựa chọn của người dùng tối ưu
hơn.
4


Chương 3. Kết quả ứng dụng
I.

PHÂN TÍCH YÊU CẦU BÀI TỐN

Phần mềm “Xếp lịch cơng việc” đặt ra u cầu trọng tâm là áp
dụng thuật toán Tham ăn vào việc lựa chọn công việc để lợi nhuận tốt.
Dữ liệu đầu vào của phần mềm sẽ là một mảng các công việc
(mỗi công việc gồm: Tên, thời gian bắt đầu, thời gian kết thúc và lợi
nhuận) nhập bằng tay hoặc import file bằng tập tin văn bản.

Nhập bằng tay: Ngay tại giao diện chính của phần mềm đã sắp
xếp bố cục gồm các textbox và button để người dùng có thể nhập các
thông tin từng công việc với số lượng công việc không giới hạn
Nhập bằng import file: Với cách này, người dùng sẽ có thể tiết
kiệm được thời gian và hiệu quả cao hơn.
Dữ liệu đầu ra sẽ là danh sách công việc được xếp theo lợi
nhuận từ lớn đến nhỏ cùng với thông báo đã xếp xong để người dùng
có thể kiểm tra lại bằng tay.
II.

CẤU TRÚC DỮ LIỆU CẦN THIẾT

3.2.1. Lớp Công việc:
public class Job
{
private float profit;
private float finishtime;
private float starttime;
private string name;
public Job(string name, float start, float finish, float pro)
{
this.Name = name;
this.Starttime = start;

5


this.Finishtime = finish;
this.Profit = pro;
}

}

Lớp công việc được xây dựng với các thuộc tính :





Tên cơng việc (name): kiểu dữ liệu String
Thời gian bắt đầu (starttime): kiểu dữ liệu float
Thời gian kết thúc (finishtime): kiểu dữ liệu float
Lợi nhuân (profit) : kiểu dữ liệu float

3.2.2. Hàm đọc danh sách công việc từ file text:

List<Job> ReaFile(string[] File)
{
List<Job> list = new List<Job>();
try
{
foreach (var item in File)
{
string[] job = item.Split(' ');
string name = job[0].ToString();
float start = (float)Convert.ToDouble(job[1]);
float end = (float)Convert.ToDouble(job[2]);
float profit = (float)Convert.ToDouble(job[3]);
Job newjob = new Job(name, start, end, profit);
list.Add(newjob);
}

}
catch (Exception ex)
{
MessageBox.Show("Có lỗi khi nhập công việc \n" +

6


ex.ToString(), "thông báo");
}
return list;
}
private void btnOpenfile_Click(object sender, EventArgs e)
{
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Text Files (*.txt) |*.txt| All Files (*.*) |*.*";

if(open.ShowDialog() == DialogResult.OK)
{
txtFile.Text = open.FileName;

string path = open.FileName;
string[] lines = System.IO.File.ReadAllLines(path);

List<Job> listJob = ReaFile(lines);
foreach (var item1 in listJob)
{
int count = JobList.Count;
JobList.Add(item1);
string name = item1.Name;

float start = item1.Starttime;
float finish = item1.Finishtime;
float profit = item1.Profit;
ListViewItem item = new ListViewItem((count).ToString());
item.SubItems.Add(name);
item.SubItems.Add(start.ToString());
item.SubItems.Add(finish.ToString());
item.SubItems.Add(profit.ToString());

7


listvwEntry.Items.Add(item);

}

}
}

Khi hộp thoại OpenFileDialog ghi nhận được địa chỉ url của file
danh sách công việc sẽ tiến hành đọc từng dịng của file thơng qua
hàm ReadFile() và ghi nhận các công việc đưa vào danh sách công
việc ban đầu. Nếu có lỗi, sẽ tự động dừng lại và phần mềm thông báo
lỗi đến người sử dụng.

3.2.3. Hàm nhập công việc

private void btnAddJob_Click(object sender, EventArgs e)
{
string name = "";

float start, finish, profit;
try {
name = txtJobname.Text;
start = (float)Convert.ToDouble(txtTimestart.Text);
finish = (float)Convert.ToDouble(txtTimeend.Text);
profit = (float)Convert.ToDouble(txtProfit.Text);
int count = JobList.Count;

Job job = new Job(name, start, finish, profit);
JobList.Add(job);

ListViewItem item = new ListViewItem((count).ToString());

8


item.SubItems.Add(name);
item.SubItems.Add(start.ToString());
item.SubItems.Add(finish.ToString());
item.SubItems.Add(profit.ToString());

listvwEntry.Items.Add(item);

txtJobname.Text = "";
txtTimestart.Text = "";
txtTimeend.Text = "";
txtProfit.Text = "";
}
catch(Exception ex) {
MessageBox.Show("Có lỗi \n"+ex.ToString(),"Thơng báo");


}

}

Đây là hàm nhập cơng việc bằng tay, khi người dùng nhập các
thông tin công việc vào các ô textbox tương ứng phần mềm sẽ ghi
nhận và thêm công việc vào danh sách công việc ban đầu. Nếu có lỗi
xảy ra, phần mềm thơng báo lỗi đến người dùng và k ghi nhận công
việc được thêm vào.

3.2.4. Hàm Sắp xếp danh sách công việc

void SwapJob(Job a, Job b)
{
Job t = new Job(a);

a.Name = b.Name;

9


a.Starttime = b.Starttime;
a.Finishtime = b.Finishtime;
a.Profit = b.Profit;

b.Name = t.Name;
b.Starttime = t.Starttime;
b.Finishtime = t.Finishtime;
b.Profit = t.Profit;

}
void Sort(List<Job> list)
{

int count = list.Count;
int i, j;
for( i = 0; i< count-1; i++)
{
for (j = (count-1); j >= i+1; j--)
{
if (list[i].Profit < list[j].Profit)
{
SwapJob(list[i], list[j]);
}
}
if (list[i].Finishtime > Maxtime) Maxtime = list[i].Finishtime;
}

}

Dựa theo thuật toán sắp xếp nổi bọt, duyệt qua danh sách công
việc những công việc có lợi nhuận cao sẽ được xếp lên hàng đầu và
tiếp theo là các cơng việc có lợi nhuận ít hơn.
10


3.2.5. Hàm Greedy (chọn các công việc từ danh sách công việc)

List<Job> Greedy(List<Job> list)
{

List<Job> newlist = new List<Job>();
bool add = false;
int i;
foreach (var item in list)
{
int j ;
float start = item.Starttime;
float finish = item.Finishtime;

if (newlist.Count < 1) { newlist.Add(item); }
else
{
for (j = 0; j < newlist.Count; j++)
{
if(finish > newlist[j].Finishtime && start >
newlist[j].Finishtime || finish < newlist[j].Starttime && start <
newlist[j].Starttime)
// if (start > newlist[j].Finishtime || finish <
newlist[j].Starttime)
{
add = true;
}else { add = false; break; }
}
}
if (add) { newlist.Add(item); add = false; }

11


}


return newlist;
}

Phần mềm sẽ duyệt tuần tự danh sách công việc ban đầu và
chọn các công việc không bị trùng thời gian với các cơng việc đã có
trong danh sách công việc được chọn và đưa vào danh sách công việc
được chọn.

12


III.

Giải thuật – Lưu đồ

hình 1. Lưu đồ thuật tốn sắp xếp nổi bọt

13


hình 2. Lưu đồ thuật tốn Greedy

14


IV.

GIỚI THIỆU PHẦN MỀM


3.4.1. Sơ đồ Usecase

Hình 3. Sơ đồ trường hợp sử dụng (Usecase)

3.4.2. Giao diện chính

Hình 4. Giao diện chính của phần mền

Bố cục giao diện được chia làm ba phần: Upload File, Nhập công
việc, Sắp xếp công việc
15


- UploadFile : Giúp người dùng nhập danh sách công việc bằng
cách đọc tập tin từ file *.txt.
+ Nút nhấn Chọn File: Hộp thoại select file sẽ hiện ra để
người dùng chọn file để nhập vào
+ Địa chỉ url của file sẽ hiện trên textbox chọn file

- Nhập công việc: Tại đây, người dùng sẽ thêm, sửa công từng
công việc vào phần mềm
+ Các textbox: tên công việc, thời gian bắt đầu, thời gian
kết thúc, lợi nhuận.
+ Các button: thêm, sửa, làm lại
- Sắp xếp công việc: Đây là khu vực xử lý chính của phần mền
+ Danh sách cơng việc ban đầu người dùng nhập vào qua
xử lý các cơng việc có lợi nhuận cao và khơng trùng nhau sẽ được
thêm vào Danh sách công việc được chọn, các công việc bị loại sẽ
được đưa vào danh sách công việc bị loại để người dùng dễ dàng quan
sát.

+ Các button Sắp xếp, Thêm, Xóa, Xóa tất cả, textbox tính
tổng lợi nhuận các công việc được chọn.
3.4.3. Giao diện Upload File
Nhấn vào button “Chọn File”
Sau đó chọn tập tin .txt,
phần mềm sẽ tự động đọc
ghi danh sách cơng việc.
Hình 5. Giao diện Upload File

16


3.4.4. Giao diện nhập công việc
- Thêm công việc: Nhập dữ liệu
theo định dạng vào các ô
textbox. Nhấn button “Thêm”
- Sửa công việc: chọn công việc
cần sửa trong danh sách ban
đầu, sửa
- Button “Làm lại”: Trong q
trình 1 Thêm cơng việc, nếu
muốn nhập các ô dữ liệu từ
đầu. Khi nhấn button “Làm lại”
các ơ textbox sẽ được xóa.

Hình 6. Giao diện nhập cơng việc

3.4.5. Giao diện Sắp xếp cơng việc

Hình 7. Giao diện sắp xếp công việc


17


- Xóa cơng việc : Chọn cơng việc trong danh sách ban đầu, sau đó
nhấn button “Xóa”.
- Xóa tất cả cơng việc: Nhấn vào button “Xóa tất cả”, tất cả công việc
trong danh sách công việc ban đầu sẽ được xóa, phải nhập lại danh
sách từ đầu.
- Sắp xếp: Nhấn vào button “Sắp xếp”, Hệ thống sẽ xử lý và chọn ra
danh sách cơng việc và tính Tổng lợi nhuận, các công việc không được
lựa chọn sẽ được hiển thị tại bảnh danh “sách công việc loại bỏ”
- Thêm công việc không được chọn: Chọn công việc trong danh sách
ban đầu, nhấn vào button “Thêm”, công việc sẽ được thêm vào danh
sách được chọn và các công việc trùng với cơng việc được chọn sẽ bị
xóa, tổng lợi nhuận được tính lại.

Chương 4. Kết luận – Đánh giá
I.

KẾT QUẢ ĐẠT ĐƯỢC:

IV.1.1.

Về mặt chuyên môn:

-

Nắm vững hơn kiến thức cấu trúc dữ liệu và giải thuật tham ăn.


-

Xây dựng được phần mềm “ Sắp xếp lịch công việc” với yêu cầu đã đề ra, có
giao diện đồ họa và áp dụng thuật toán tham ăn.
IV.1.2.

Về mặt kinh nghiệm:

-

Vận dụng giải thuật Tham ăn vào giao diện.

-

Biết cách viết tài liệu theo mẫu chuẩn.

-

Biết thiết kế và đánh giá giao diện.
IV.1.3.

-

Những ưu điểm và hạn chế

Ưu điểm:
18


o Giao diện đơn giản.

o Cho phép người dùng thay đổi lựa chọn các công việc theo ý muốn.
o Không giới hạn số lượng công việc đầu vào.
-

Hạn chế:
o Số lượng công việc càng lớn, tốc độ xử lý càng lâu
o Chưa xử lý nhập dữ liệu cho nhiều loại tập tin ( chỉ xử lý file .txt).

19


II.

TÀI LIỆU THAM KHẢO

[1] Nguyễn Văn Linh. Giáo trình Phân tích & thiết kế thuật tốn. Chương 3
Trang: 55-64. Nhà xuất bản Đại học Cần Thơ. Cần Thơ, 2009.
[2] />[3] />Ngồi ra, cịn có tham khảo thêm các câu hỏi trong stackoverflow.com và các diễn
đàn khác.

20


×