1. Trang chủ
  2. » Công Nghệ Thông Tin

Các mẫu thiết kế hướng ₫ối tượngbai 5 1

12 3 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Microsoft Word Bai 5 1 docx Trang 1 MÔN CÁC MẪU THIẾT KẾ HỚNG ỐI TỢNG Bài thực hành số 5 1 Xây dựng và kiểm thử thuật gii tiến hóa trên các cá thể n gin I Mục tiêu  Giúp SV làm quen với gii t[.]

Trang MÔN : CÁC MẪU THIẾT KẾ HỚNG ỐI TỢNG Bài thực hành số 5.1 : Xây dựng kiểm thử thuật gii tiến hóa cá thể n gin I Mục tiêu :  Giúp SV làm quen với gii thuật tiến hóa cơng dụng Giúp SV biết cách sử dụng mẫu thiết kế Singleton, Prototype, Abstract Factory yêu cầu cụ thể II Nội dung : Xây dựng module thực gii thuật tiến hóa cá thể chứa số thực Ý tởng gii thuật tiến hóa nh sau : lúc ầu, ta hệ gồm n cá thể, cá thể có giá trị ặc trng (specval) có ộ thích nghi (fitness) xác ịnh q trình tiến hóa hệ diễn theo c chế lặp, chu kỳ tiến hóa có hot ộng sau : - xác ịnh li ộ thich nghi cá thể - chọn lựa số cá thể có ộ thích nghi cao ể giữ chúng li làm nồng cốt cho hệ - cho cá thể phối giống ể to cá thể cho ủ số lợng - chọn số cá thể cho chúng ột biến thành thể khác Thế hệ cá thể ầu tiên xác ịnh li ộ thich nghi cá thể chọn lựa số cá thể có ộ thích nghi cao ể giữ chúng li làm nồng cốt cho hệ cho cá thể phối giống ể to cá thể cho ủ số lợng chọn số cá thể cho chúng ột biến thành thể khác Thế hệ cá thể III Chuẩn ầu :  Nắm vững tính chất, cơng dụng mẫu thiết kế Singleton, Prototype, Abstract Factory ể dùng li mẫu vị trí chng trình cần xây dựng IV Qui trình xây dựng chng trình Trang Chy VS Net, chọn menu File.New.Project ể hiển thị cửa sổ New Project Mở rộng mục Visual C# TreeView "Project Types", chọn mục Window, chọn icon "Windows Form Application" listbox "Templates" bên phi, thiết lập th mục chứa Project listbox "Location", nhập tên Project vào textbox "Name:" (td BaiTH5), click button OK ể to Project theo thông số ã khai báo Form ầu tiên ứng dụng ã hiển thị cửa sổ thiết kế, việc thiết kế form trình lặp thao tác to mới/xóa/hiệu chỉnh thuộc tính/to hàm xử lý kiện cho ối tợng cần dùng form Ta s giới thiệu yêu cầu ứng dụng sau Bây ta s xây dựng th viện chứa thành phần miêu t thuật gii tiến hóa tổng quát Dời chuột gốc Project cửa sổ "Solution Explorer", ấn phi chuột phần tử gốc này, chọn option Add.New Folder, ặt tên cho folder GenLib Thờng tốn dùng thuật gii tiến hóa cần to hệ ầu tiên cá thể cách ngẫu nhiên Việc to ối tợng ngẫu nhiên thờng liên quan ến việc to số nguyên, số thực ngẫu nhiên ể việc lấy số ngẫu nhiên nhiều phần tử phần mềm ợc quán, ta s to ối tợng chuyên phục vụ to số ngẫu nhiên ể bo m phần tử to số ngẫu nhiên nhất, ta dùng mẫu thiết kế Singleton Hãy thực ối tợng có dịch vụ sau :  to số nguyên ngẫu nhiên  to số nguyên ngẫu nhiên nằm khong từ tới n  to số thực ngẫu nhiên nằm khong từ tới Dời chuột th mục GenLib cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class MyRandom.cs, chọn button Add ể máy to class Viết code cho class nh sau : class MyRandom { //hàm khởi to private ể cấm bên to ối tợng MyRandom private MyRandom() { } //thông tin dùng chung class private static MyRandom myrnd = new MyRandom(); public static MyRandom getInstance() { return myrnd; } //thông tin ối tợng private Random rnd = new Random(); //tác vụ to số nguyên ngẫu nhiên public int RndInt() { return rnd.Next(); } //tác vụ to số nguyên ngẫu nhiên khong từ ến n public int RndInt(int n) { return rnd.Next(n); } //tác vụ to số thực ngẫu nhiên từ tới public double RndDouble() { return rnd.NextDouble(); } } Lu ý ta ã dùng mẫu Adapter ể xây dựng class MyRandom dựa class Random NET Trang ịnh nghĩa interface cho ối tợng cá thể thuật gii tiến hóa tổng quát có dịch vụ sau :  tham kho giá trị ặc trng  tham kho/hiệu chỉnh ộ fitness  phối giống với cá thể khác  ột biến  nhân bn vơ tính  gii mã thành chuỗi vn bn Dời chuột th mục GenLib cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.New Item ể hiển thị cửa sổ “Add New Item”, chọn mục “Interface”, hiệu chỉnh tên interface IIndividual.cs, chọn button Add ể máy to interface Viết code cho interface nh sau : interface IIndividual : IComparable { //thuộc tính luận lý SpecValue : ọc Object SpecValue {get;} //thuộc tính luận lý Fitness : ọc/ghi double Fitness {get; set;} //hàm phối giống với other IIndividual cross(IIndividual other); //hàm ột biến void muter(); //hàm to ối tợng theo c chế nhân bn vơ tính (dùng mẫu Prototype) IIndividual clone(); //hàm gii mã ối tợng thành dng chuỗi vn bn String ToString(); } Viết thêm class abstract chứa thông tin chung mà ối tợng cá thể khác s dùng Dĩ nhiên class phi thực interface IIndividual : Dời chuột th mục GenLib cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class AbstractIndividual.cs, chọn button Add ể máy to class Viết code cho class nh sau : abstract class AbstractIndividual : IIndividual { protected double fitness = 0.0; protected bool muted = false; public AbstractIndividual() { } //thuộc tính luận lý SpecValue : ọc/ghi public abstract Object SpecValue { get; set; } Trang public bool Muted { get { return muted; } set { muted = value; } } public double Fitness { get { return fitness; } set { fitness = value; } } //hàm so sánh với cá thể khác (phục vụ xếp danh sách) public int CompareTo(IIndividual o) { if (o.Fitness == Fitness) return 0; else if (Fitness < o.Fitness) return -1; return 1; } //hàm nhân bn theo mẫu Prototype public abstract IIndividual clone(); //hàm ột biến public abstract void muter(); //hàm phối giống với other public abstract IIndividual cross(IIndividual other); }  Ta cần ối tợng mục tiêu chuyên ánh giá cá thể ể tính ộ thích nghi thể ó theo ngữ nghĩa xác ịnh Trớc hết ta ịnh nghĩa interface tối thiểu cho ối tợng mục tiêu Dời chuột th mục GenLib cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.New Item ể hiển thị cửa sổ “Add New Item”, chọn mục “Interface”, hiệu chỉnh tên interface ITarget.cs, chọn button Add ể máy to interface Viết code cho interface nh sau : interface ITarget { //tác vụ tính tốn cá thể double eval(IIndividual ind); } Bây ta ịnh nghĩa interface cho ối tợng hệ với tính chất sau :  lúc ầu cha có cá thể  cho phép thêm cá thể vào, số lợng thể  cho phép tham kho số lợng cá thể Trang  tiến hóa sang hệ theo phng pháp : phối giống ột biến Dời chuột th mục GenLib cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.New Item ể hiển thị cửa sổ “Add New Item”, chọn mục “Interface”, hiệu chỉnh tên interface IPopulation.cs, chọn button Add ể máy to interface Viết code cho interface nh sau : interface IPopulation { //hàm tr số cá thể int size(); //hàm thêm cá thể vào hệ void add(IIndividual individu); //thuộc tính truy xuất cá thể thứ i IIndividual this[int i] { get; } //hàm gii mã ối tợng thành chuỗi vn bn String ToString(); //hàm tiến hóa sang hệ IPopulation evoluer(ITarget cible); } 10 Ta thực ối tợng hệ, ối tợng s chứa thuật gii tiến hóa tổng quát Dời chuột th mục GenLib cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class Population.cs, chọn button Add ể máy to class Viết code cho class nh sau : class Population : IPopulation { //qun lý hệ cá thể class List NET private List individus = new List(); //dùng ối tợng to số ngẫu nhiên tồn chng trình private static MyRandom rnd = MyRandom.getInstance(); //hàm tr số cá thể public int size() { return individus.Count(); } //hàm thêm cá thể vào hệ public void add(IIndividual individu) { individus.Add(individu); } //thuộc tính truy xuất cá thể thứ i public IIndividual this[int i] { get { return individus[i]; } } //hàm gii mã ối tợng thành chuỗi vn bn public override String ToString() { String buf = "["; Trang bool fstart = true; for (int i = 0; i < individus.Count(); i++) if (fstart) { fstart = false; buf += individus[i].ToString(); } else buf += ", " + individus[i].ToString(); return buf + "]"; } //hàm tiến hóa sang hệ public IPopulation evoluer(ITarget cible) { //tính ộ thích nghi cá thể xếp chúng evaluer(cible); //to hệ Population pop = reproduire(); //cho 5% cá thể bị ột biến pop.muter(0.05); //tính li ộ thích nghi cá thể xếp chúng //pop.evaluer(cible); return pop; } //hàm tính ộ thích nghi cá thể xếp cá thể theo ộ thích nghi chúng private void evaluer(ITarget cible) { //lặp tính ộ thích nghi cá thể foreach (IIndividual ind in individus) { ind.Fitness = cible.eval(ind); } //sắp xếp cá thể theo ộ thích nghi chúng Sort(); } //hàm xếp thự tự cá thể theo ngữ nghĩa xác ịnh private void Sort() { individus.Sort(); individus.Reverse(); } //hàm ột biến cho cá thể private void muter(double ratio) { //to tập hợp cá thể cần ột biến (trừ cá thể ầu tiên có ộ thích nghi tốt nhất) List subl = individus.GetRange(1, individus.Count - 1); //xử lý ột biến cho cá thể với xác suất ratio Trang foreach (IIndividual ind in subl) { if (rnd.RndDouble() < ratio) ind.muter(); } } //hàm to hế private Population reproduire() { //chọn 20% cá thể có ộ thích nghi tốt int max = individus.Count() / 5; Population pop = new Population(); //cho chúng thành cá thể hệ for (int i = 0; i < max; i++) { pop.add(individus[i].clone()); } //lặp phối giống cặp cá thể ã có (chọn ngẫu nhiên) ể to thêm 80% cá thể for (int i = max; i < size(); i++) { int mec = rnd.RndInt(max); int mef = rnd.RndInt(max); pop.add(individus[mec].cross(individus[mef])); } return pop; } } 11 Ta dùng mẫu Abstract Factory ể cung cấp dịch vụ to ối tợng mà chng trình ứng dụng dùng ối tợng Factory có kh nng nh sau :  to ợc hệ cá thể với số lợng xác ịnh  to ợc ối tợng mục tiêu toán Dời chuột th mục GenLib cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.New Item ể hiển thị cửa sổ “Add New Item”, chọn mục “Interface”, hiệu chỉnh tên interface IPopulationFactory.cs, chọn button Add ể máy to interface Viết code cho interface nh sau : interface IPopulationFactory { //hàm to ối tợng mục tiêu ITarget createTarget() ; //hàm to hệ có size cá thể ngẫu nhiên IPopulation createRandomPopulation(int size) ; } 12 Bây ta thử áp dụng thuật gii tiến hóa vào toán n gin nh sau : ta lấy số thực mục tiêu ngẫu nhiên, ta to ngẫu nhiên hệ xuất phát gồm n số thực có ngẫu nhiên Thử áp dụng thuật gii tiến hóa tổng quát ợc xây dựng th viện GenLib ể xem hệ số thực ban ầu có hội tụ giá trị mục miêu hay không ? Trang 13 Ta ịnh nghĩa class MyDouble ể qun lý số thực MyDouble giá trị ặc trng cá thể cần tiến hóa Dời chuột phần tử gốc Project cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, hiệu chỉnh tên class MyDouble.cs, chọn button Add ể máy to class Viết code cho class nh sau : class MyDouble { private double val; public MyDouble(double v) { val = v; } public double Val { get { return val; } set { val = value; } } //hàm gii mã ối tợng mục tiêu chuỗi vn bn public override String ToString() { String buf = String.Format("{0:f5}", val); return buf; } } 14 Hiện thực ối tợng cá thể có tính chất cụ thể nh sau :  giá trị ặc trng ối tợng MyDouble qun lý số thực từ tới  ộ fitness số thực, lớn nghĩa thích nghi tốt  phối giống với cá thể khác ể to cá thể có giá trị ặc trng trung bình cộng cha m  ột biến theo nguyên tắc : to thể ngẫu nhiên, ột biến giá trị ặc trng trung bình cộng cá thể với  nhân bn vơ tính (dùng mẫu Prototype)  gii mã thành chuỗi vn bn miêu t giá trị ặc trng  Dời chuột phần tử gốc Project cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, hiệu chỉnh tên class DoubleIndividual.cs, chọn button Add ể máy to class Viết code cho class nh sau : using BaiTH5.GenLib; class DoubleIndividual : IIndividual { //giá trị ặc trng cá thể private MyDouble spVal; //ộ thích nghi cá thể private double fitness = 0.0; //thuộc tính miêu t ã bị ộ biến cha private bool muted = false; //ối tợng to số ngẫu nhiên tồn chng trình private static MyRandom rnd = MyRandom.getInstance(); //hàm khởi to cá thể có giá trị ặc trng ngẫu nhiên Trang public DoubleIndividual() { this.spVal = new MyDouble(rnd.RndDouble()); } //hàm khởi to cá thể có giá trị ặc trng xác ịnh public DoubleIndividual(MyDouble valeurPropre) { this.spVal = valeurPropre; } //hiện thực thuộc tính luận lý Muted public bool Muted { get { return muted; } set { muted = value; } } //hiện thực thuộc tính luận lý SpecValue public Object SpecValue { get { return spVal; } set { spVal = (MyDouble)value; } } //hiện thực thuộc tính luận lý Fitness public double Fitness { get { return fitness; } set { fitness = value; } } //hàm gii mã ối tợng thành chuỗi vn bn public override String ToString() { //return String.Format("vp={0:f4}, fit={1:f4}",valeurPropre, fitness); return String.Format("{0:f5}", spVal); } //hàm so sánh với cá thể khác (phục vụ xếp danh sách) public int CompareTo(IIndividual o) { if (o.Fitness == Fitness) return 0; else if (Fitness < o.Fitness) return -1; return 1; } //hàm phối giống với cá thể khác public IIndividual cross(IIndividual other) { MyDouble o1 = SpecValue as MyDouble; //giá trị ặc trng MyDouble o2 = other.SpecValue as MyDouble;//giá trị ặc trng ối tác //to cá thể if (o1 == null && o2 == null) return new DoubleIndividual(new MyDouble(0)); if (o1 == null) return other; if (o2 == null) return this; return new DoubleIndividual(new MyDouble((o1.Val + o2.Val) / 2)); } Trang 10 //hàm ột biến cá thể hành public void muter() { //ột biến tối a 10% biên ộ giá trị ặc trng // spVal += (rnd.RndDouble() < 0.5 ? : -1) * rnd.RndDouble() * 0.1 * spVal; //theo trung bình cộng với giá trị ặc trng ngẫu nhiên spVal = new MyDouble((spVal.Val + rnd.RndDouble()) / 2); //theo giá trị ặc trng ngẫu nhiên // spVal = Math.random(); } //hàm to ối tợng theo c chế nhân bn vơ tính (dùng mẫu Prototype) public IIndividual clone() { return new DoubleIndividual(spVal); } } 15 Hiện thực ối tợng mục tiêu nh sau :  có giá trị ặc trng MyDouble chứa số thực từ tới giống nh cá thể  tính ộ fitness cá thể theo công thức 1/((sv1-sv2)^2), ố sv1 giá trị ặc trng sv2 giá trị ặc trng cá thể cần tính tốn Dời chuột phần tử gốc Project cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class DoubleTarget.cs, chọn button Add ể máy to class Viết code cho class nh sau : using BaiTH5.GenLib; class DoubleTarget : ITarget { //giá trị mục tiêu mà ta mong muốn t ợc private double val; //ối tợng to số ngẫu nhiên toàn chng trình private MyRandom rnd = MyRandom.getInstance(); //hàm khởi to ngẫu nhiên giá trị mục tiêu public DoubleTarget() { val = rnd.RndDouble(); } //hàm khởi to giá trị mục tiêu xác ịnh public DoubleTarget(double d) { val = d; } //hàm tính ộ thích nghi ối tợng theo ngữ nghĩa mong muốn //càng gần với mục tiêu có ộ thích nghi cao public double eval(IIndividual i) { MyDouble o1 = i.SpecValue as MyDouble; if (o1 == null) return 0; return / ((o1.Val - val) * (o1.Val - val)); Trang 11 } //tác vụ tính tốn trị cá thể public double getVal(IIndividual i) { MyDouble o1 = i.SpecValue as MyDouble; if (o1 == null) return 0; return o1.Val; } //hàm tr giá trị mục tiêu public double getValue() { return val; } //hàm gii mã ối tợng mục tiêu chuỗi vn bn public override String ToString() { String buf = String.Format("Giá trị mong muốn : {0:f5}", val); return buf; } } 16 Hiện thực ối tợng Factory cho ứng dụng nh sau : Dời chuột phần tử gốc Project cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class DoublePopFactory.cs, chọn button Add ể máy to class Viết code cho class nh sau : using BaiTH6.GenLib; class DoublePopFactory : IPopulationFactory { //hàm to ối tợng mục tiêu public ITarget createTarget() { return new DoubleTarget(); } //hàm to hệ có size cá thể ngẫu nhiên public IPopulation createRandomPopulation(int size) { //to hệ rỗng IPopulation pop = new Population(); //lặp thêm cá thể vào hệ for (int i = 0; i < size; i++) { pop.add(new DoubleIndividual()); } return pop; } } 17 Nếu cửa sổ ToolBox cha hiển thị chi tiết, chọn menu View.Toolbox ể hiển thị (thờng nằm bên trái hình) Click chuột vào button (Auto Hide) nằm góc phi cửa sổ ToolBox ể chuyển chế ộ hiển thị thờng trực 18 Duyệt tìm phần tử Button cửa sổ ToolBox, chọn v góc trái Form Vào cửa sổ thuộc tính Button hiệu chỉnh li thuộc tính Text = Trang 12 "Start", thuộc tính (Name) = btnStart To hàm xử lý kiện Click Button viết on code kiểm thử thuật gii tiến hóa nh sau : using System.IO; using BaiTH6.GenLib; private void btnStart_Click(object sender, EventArgs e){ int popSize = 20; int nbGens = 10; //to ối tợng qun lý file ể ghi liệu StreamWriter oFile = new StreamWriter("data.txt", true, Encoding.Unicode); //xuất số cá thể hệ file oFile.WriteLine("Ta sử dụng cộng ồng có " + popSize + " cá thể"); //to ối tợng Factory cho ứng dụng IPopulationFactory pf = new DoublePopFactory(); //nhờ Factory to ngẫu nhiên hệ ầu tiên IPopulation pop = pf.createRandomPopulation(popSize); //nhờ Factory to ối tợng mục tiêu cần hội tụ tới ITarget vc = pf.createTarget(); //xuất ối tợng mục tiêu file oFile.WriteLine(vc); //lặp tiến hóa hệ với số lầ lặp xác ịnh for (int i = 0; i < nbGens; i++) { //xuất hệ hành file oFile.WriteLine("Thế hệ " + i + ":"); oFile.WriteLine(pop); pop = pop.evoluer(vc); } //xuất hệ cuối file oFile.WriteLine("Kết qu : " + pop); //óng file oFile.Close(); } 19 Dịch chy chng trình Nếu có lỗi sửa, hết lỗi chng trình s chy Chức nng chng trình to thử hệ gồm popSize cá thể, cho tiến hóa nbGen chu kỳ, chu kỳ tiến hóa chng trình xuất giá trị ặc trng cá thể hệ hành file ể kiểm tra 20 Dùng trình WordPad mở file data.txt th mục chứa file kh thi chng trình, quan sát xem giá trị mục tiêu bao nhiêu, giá trị ặc trng ban ầu cá thể, giá trị ặc trng cá thể theo hệ giá trị ặc trng cá thể hệ cuối So sánh xem chúng có gần sát với giá trị mục tiêu không ?    

Ngày đăng: 09/04/2023, 06:14

Xem thêm: