Tải bản đầy đủ - 0 (trang)
CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ THUẬT TOÁN

CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ THUẬT TOÁN

Tải bản đầy đủ - 0trang

GVHD: TS. Hồ Quốc Dũng



Khóa luận tốt nghiệp

Lớp QuanThe:



Bước 1: Khai báo một mảng quần thể kiểu DuongDi. Khởi tạo quần thể có

kích thước l cho trước, chứa l đường đi.

Bước 2:

- Tạo method lấy đường đi tại một vị trí cụ thể trong mảng quanthe.

- Tạo method lưu đường đi tại một vị trí cụ thể .

- Tạo method tìm đường đi ngắn nhất trong lớp quần thể, được đánh giá lựa

chọn dựa trên độ thích nghi.







Lớp ThuatToanDiTruyen:



TẾ



và đưa ra đường đi ngắn nhất trong 5 đường nhóm đó.



H



U



Bước 1: Tạo method ChonLoc, nhóm 5 đường đi ngẫu nhiên trong quần thể



N

H



Bước 2: Tạo method GhepLai, lấy chu tình Cha Mẹ được chọn ra bằng



KI



ghép chọn lọc để tạo chu trình con. Chu trình con được tạo ra bằng cách lấy một





C



điểm ngẫu nhiên vitri, gán các giá trị trong đường đi cha trong khoảng vitri 0 đến



H



vitri, và gán các giá trị của đường đi cha mẹ chưa có trong duongdi con trong



ẠI



khoảng còn lại.



Đ



Bước 3: Tạo method DotBien, trong khoảng từ i = 1 đến n-1 của đường đi,



N



G



lấy một số ngẫu nhiên kiểu double trong khoảng từ 0 đến 1 nếu số đó lớn hơn tỉ lệ



Ư







đột biến, thì lấy một điểm ngẫu nhiên j trong khoảng từ 1 đến n-1, tiến hành đổi giá



TR



trị tại 2 vị trí i,j cho nhau.

Bước 4: Tạo method TienHoaQuanThe để tiến hóa đưa ra quần thể mới,

trong quanthemoi với kích thước cho trước, có phần tử đầu tiên là đường đi ngắn

nhất của quần thể hiện tại, và các phần tử tiếp theo được tạo ra bằng cách chọn lọc

và lai các đường đi để đưa ra đường đi mới. Tiếp theo là đột biến từng đường đi

trong quần thể và đưa ra quanthemoi.



SVTH: Hồ Minh Toàn - K48A Tin Học Kinh Tế



Trang 33



GVHD: TS. Hồ Quốc Dũng



Khóa luận tốt nghiệp



H





C



KI



N

H



TẾ



H



U







2.3. Sơ đồ lớp



ẠI



Hình 2. 1: Sơ đồ các lớp cho thuật tốn di truyền



Đ



2.4. Xây dựng chương trình



N



G



Ngơn ngữ xây dựng chương trình bằng C# cụ thể là Winform C# dùng dể



Ư







đưa ra kết quả chu trình ngắn nhất mà người giao hàng (shipper) sẽ thực hiện, bao



TR



gồm các bước xây dựng như sau:

- Xây dựng lớp biểu diễn đường đi.

- Xây dựng lớp biểu diễn quần thể.

- Cài đặt Thuật toán di truyền.

- Cài đặt Winform C# gồm Form1 là tìm kiếm đường đi và Form 2 là hiển

thị danh sách địa điểm được đánh số.

- Cài đặt hàm Main.



SVTH: Hồ Minh Toàn - K48A Tin Học Kinh Tế



Trang 34



GVHD: TS. Hồ Quốc Dũng



Khóa luận tốt nghiệp

2.4.1 Lớp DuongDi



public class DuongDi

{

public

public

double

double

public



static int[,] matranKC;

int[] duong;

khoangcach;

dothichnghi;

static Random rd = new Random();



TR



Ư







N



G



Đ



ẠI



H





C



KI



N

H



TẾ



H



U







// Tạo một ma trận khoảng cách giữa các thành phố

public static void taoMatranKC(string urlFile)

{

StreamReader file = new StreamReader(urlFile);

string dls = file.ReadToEnd();

file.Close();

string[] tach = dls.Split('\n');

int[,] duLieu = new int[tach.Length,

tach.Length];

for (int i = 0; i < tach.Length; i++)

{

string[] tach2 = tach[i].Split(' ');

if (tach2.Length != tach.Length)

{

return;

}

else

{

for (int j = 0; j < tach2.Length; j++)

{

try

{

duLieu[i, j] = Convert.ToInt32(tach2[j]);

}

catch



SVTH: Hồ Minh Toàn - K48A Tin Học Kinh Tế



Trang 35



GVHD: TS. Hồ Quốc Dũng



Khóa luận tốt nghiệp

{

return;

}

}

}

}

matranKC = duLieu;



TR



Ư







N



G



Đ



ẠI



H





C



KI



N

H



TẾ



H



U







}

// Khởi tạo đường đi

public DuongDi(int stp)

{

duong = new int[stp];

khoangcach = 0;

dothichnghi = 0;

}

// Tính độ dài đường đi

public int DoDaiDuongDi()

{

return duong.Count();

}

//Gán giá trị tại một ví trí nhất định trong đường đi

public void SetDiaDiem(int vitri, int giatri)

{

duong.SetValue(giatri, vitri);

dothichnghi = 0;

khoangcach = 0;

}

//Đưa ra thành phố tại vị trí

public int GetDiaDiem(int vitri)

{

return duong[vitri]; // dùng để đưa ra giá trị sd

trong lai ghép

}

//Kiểm tra một thành phố đã tồn tại trong đường đi

hay chưa

public bool ChuaDiaDiem(int giatri)

{



SVTH: Hồ Minh Toàn - K48A Tin Học Kinh Tế



Trang 36



GVHD: TS. Hồ Quốc Dũng



Khóa luận tốt nghiệp



Boolean kq = duong.Contains(giatri);

return kq;

}

// Đưa ra vị trí của thành phố bắt đầu trong mảng

đường đi



Đ



ẠI



H





C



KI



N

H



TẾ



H



U







//bằng giá trị của người dùng nhập trừ cho 1

public static int DiemBatDau(int dd)

{

return (dd);

}

//Mảng đường đi sẽ chứa các thành phố từ 1 đến n

public void TaoDuongDi(int diemdau)

{

for (int i = 1; i <= duong.Count(); i++)

{

duong[i - 1] = i;

}

shuffeDuongDi();

SetDiemBatDau(diemdau);

}



TR



Ư







N



G



// gán điểm bắt đầu vào đầu mảng

public void SetDiemBatDau(int diemdau)

{

for (int i = 0; i < duong.Count(); i++)

{

if (duong[i] == diemdau)

{

duong[i] = duong[0];

duong[0] = diemdau;

break;

}

}

}

//Xáo trộn vị trí các thành phố trong đường đi một

cách ngẫu nhiên



SVTH: Hồ Minh Toàn - K48A Tin Học Kinh Tế



Trang 37



GVHD: TS. Hồ Quốc Dũng



Khóa luận tốt nghiệp



TR



Ư







N



G



Đ



ẠI



H





C



KI



N

H



TẾ



H



U







public void shuffeDuongDi()

{

for (int i = 0; i < duong.Count(); i++)

{

int item1 = rd.Next(0, duong.Count() - 1);

int item2 = rd.Next(0, duong.Count() - 1);

var tp1 = duong[item1];

var tp2 = duong[item2];

duong[item1] = tp2;

duong[item2] = tp1;

}

}

public double TinhDoThichNghi()

{

dothichnghi = 0;

dothichnghi = 1 / TinhKhoangCach();

return dothichnghi;

}

public double TinhKhoangCach()

{

khoangcach = 0;

for (int i = 0; i < duong.Count() - 1; i++)

{

int tp1 = duong[i] - 1;

int tp2 = duong[i + 1] - 1;

khoangcach += matranKC[tp1, tp2];

}

khoangcach += matranKC[duong[duong.Count() - 1] 1, duong[0] - 1];

return khoangcach;

}

public override string ToString()

{

string hienthi = "";

for (int i = 0; i < duong.Count(); i++)

{

hienthi += (duong[i]).ToString() + " - ";



SVTH: Hồ Minh Toàn - K48A Tin Học Kinh Tế



Trang 38



GVHD: TS. Hồ Quốc Dũng



Khóa luận tốt nghiệp



}

hienthi += (duong[0]).ToString();

return hienthi;

}

}

}

2.4.2. Lớp QuanThe



TẾ



H



U







public class QuanThe

{

public DuongDi[] quanthe;

int n;



Ư



thể







N



G



Đ



ẠI



H





C



KI



N

H



public int KichThuocQuanthe()

{

return quanthe.Length;

}

//Lưu đường đi tại một vị trí trong mảng quần thể

public void LuuDuongDi(int i, DuongDi duongdi)

{

quanthe[i] = duongdi;

}

//Lấy đường đi tại một vị trí cụ thể trong mảng quân



TR



public DuongDi LayDuongDi(int vitri)

{

return quanthe[vitri];

}

public QuanThe(int kichthuoc, Boolean khoitao, int

sotpnhap, int tpbd)

{

quanthe = new DuongDi[kichthuoc];

n = 0;

if (khoitao == true)

{

while (n < quanthe.Count())



SVTH: Hồ Minh Toàn - K48A Tin Học Kinh Tế



Trang 39



GVHD: TS. Hồ Quốc Dũng



Khóa luận tốt nghiệp

{



DuongDi newduongdi = new

DuongDi(sotpnhap);

newduongdi.TaoDuongDi(tpbd);

LuuDuongDi(n, newduongdi);

n++;

}

}



TR



Ư







N



G



Đ



ẠI



H





C



KI



N

H



TẾ



H



U







}

//Tìm đường đi ngắn nhất trong quần thể

public DuongDi LayDuongDiNganNhat()

{

DuongDi duongdibest = quanthe[0];

for (int i = 1; i < quanthe.Count(); i++)

{

if (duongdibest.TinhDoThichNghi() <

quanthe[i].TinhDoThichNghi())

{

duongdibest = quanthe[i];

}

}

return duongdibest;

}

public DuongDi DuongDi

{

get

{

throw new System.NotImplementedException();

}

set

{

}

}

}

}



SVTH: Hồ Minh Toàn - K48A Tin Học Kinh Tế



Trang 40



GVHD: TS. Hồ Quốc Dũng



Khóa luận tốt nghiệp



2.4.3 Lớp ThuatToanDiTruyen



TR



Ư







N



G



Đ



ẠI



H





C



KI



N

H



TẾ



H



U







public class ThuatToanDitruyen

{

private static int diemdau;

private static int diemcuoi;

static Random r = new Random();

private static double tiledotbien = 0.01;

static int tp;

public QuanThe QuanThe

{

get

{

throw new System.NotImplementedException();

}

set

{

}

}

private static DuongDi ChonLoc(QuanThe qthe)

{

//nhóm 5 đường đi ngẫu nhiên trong quần thể và

tìm ra đường đi ngắn nhất

QuanThe nhomquanthe = new QuanThe(5, false,

diemcuoi, diemdau);

for (int i = 0; i < 5; i++)

{

int vitri = (int)(r.NextDouble() *

qthe.KichThuocQuanthe());

nhomquanthe.LuuDuongDi(i,

qthe.LayDuongDi(vitri));

}

DuongDi duongdibest =

nhomquanthe.LayDuongDiNganNhat();



SVTH: Hồ Minh Toàn - K48A Tin Học Kinh Tế



Trang 41



GVHD: TS. Hồ Quốc Dũng



Khóa luận tốt nghiệp

return duongdibest;



}

//Tạo ra đường đi con từ 2 đường đi cha mẹ

public static DuongDi GhepLai(DuongDi cha, DuongDi

me)

{

DuongDi con = new DuongDi(diemcuoi);

// set các thành phố trong đường đi cha vào đường

đi con

//trong khoảng từ vị trí 0 đến một điểm ngẫu

nhiên.



TR



Ư







N



G



Đ



ẠI



H





C



KI



N

H



TẾ



H



U







int vitri = (int)(r.NextDouble() *

con.DoDaiDuongDi());

for (int i = 0; i < con.DoDaiDuongDi(); i++)

{

if (i < vitri)

{

con.SetDiaDiem(i, cha.GetDiaDiem(i));

}

else break;

}

// set các thành phố của đường đi mẹ chưa có

trong đường đi con

// từ điểm ngẫu nhiên đến hết đường đi con.

for (int k = vitri; k < con.DoDaiDuongDi(); k++)

{

bool chua = false;

for (int i = 0; i < me.DoDaiDuongDi(); i++)

{

int a = con.GetDiaDiem(i);

if (con.ChuaDiaDiem(me.GetDiaDiem(i)) ==

false)

{

con.SetDiaDiem(k, me.GetDiaDiem(i));

break;

}

}



SVTH: Hồ Minh Toàn - K48A Tin Học Kinh Tế



Trang 42



GVHD: TS. Hồ Quốc Dũng



Khóa luận tốt nghiệp

}

return con;



TR



Ư







N



G



Đ



ẠI



H





C



KI



N

H



TẾ



H



U







}

//Lấy 2 điểm ngẫu nhiên trong đường đi con và hoán

đổi cho nhau

public static void DotBien(DuongDi duongdi) // chưa

xong

{

for (int i1 = 1; i1 < duongdi.DoDaiDuongDi() - 1;

i1++)

{

double diem = r.NextDouble();

if (diem > tiledotbien)

{

int i2 = (int)(r.NextDouble() *

duongdi.DoDaiDuongDi() - 1);

if (i2 != 0)

{

var tp1 = duongdi.GetDiaDiem(i1);

var tp2 = duongdi.GetDiaDiem(i2);

duongdi.SetDiaDiem(i1, tp2);

duongdi.SetDiaDiem(i2, tp1);

}

}

}

}

public static QuanThe TienHoaQuanThe(QuanThe quanthe)

{

QuanThe quanthemoi = new QuanThe(5, false,

diemcuoi, diemdau);

quanthemoi.LuuDuongDi(0,

quanthe.LayDuongDiNganNhat());

tp = 0;

while (tp < quanthemoi.KichThuocQuanthe())

{

DuongDi cha = ChonLoc(quanthe);

DuongDi me = ChonLoc(quanthe);



SVTH: Hồ Minh Toàn - K48A Tin Học Kinh Tế



Trang 43



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ THUẬT TOÁN

Tải bản đầy đủ ngay(0 tr)

×