Microsoft Word Bai 7 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ố 7 1 Tiến hóa các biểu thức về biểu thức mục tiêu I Mục tiêu Giúp SV làm quen cách áp dụng gii thuật tiến hó[.]
Trang MÔN : CÁC MẪU THIẾT KẾ HỚNG ỐI TỢNG Bài thực hành số 7.1 : Tiến hóa biểu thức biểu thức mục tiêu I Mục tiêu : Giúp SV làm quen cách áp dụng gii thuật tiến hóa vào loi cá thể xác ịnh : biểu thức i số II Nội dung : Áp dụng thuật gii tiến hóa tổng quát ể thử tiến hóa cá thể có giá trị ặc trng biểu thức ngẫu nhiên ban ầu biểu thức mục tiêu theo nghĩa giá trị chúng gần với giá trị biểu thức mục tiêu III Chuẩn ầu : Nắm vững tính chất, cơng dụng mẫu thiết kế ợc dùng thực hành ể dùng li mẫu vị trí chng trình cần xây dựng IV Qui trình xây dựng chng trình Chy 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 phi, thiết lập th mục chứa Project listbox "Location", nhập tên Project vào textbox "Name:" (td BaiTH7), click button OK ể to 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 to mới/xóa/hiệu chỉnh thuộc tính/to hàm xử lý kiện cho ối tợng cần dùng form Ta s xây dựng form giao diện ứng dụng sau Dùng li th viện miêu t thuật gii tiến hóa tổng quát thực hành 5.1 : cách quy sử dụng file *.dll miêu t th viện Tuy nhiên ây ta dừng li mức dùng li mã nguồn th viện Dời chuột phần tử gốc Project cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.New Folder ể to folder ặt tên cho folder GenLib Click phi chuột vào folder vừa to chọn option Add.Existing Item, duyệt chọn file *.cs th mục GenLib project BaiTH5 ã có ể copy chúng vào folder hành Dùng li phân hệ miêu t biểu thức thực hành 6.1 : cách quy sử dụng file *.dll miêu t phân hệ Tuy nhiên ây ta dừng li mức dùng li mã nguồn phân hệ Dời chuột phần tử gốc Project cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.New Folder ể to folder ặt tên cho folder Expression Click phi chuột vào folder vừa to chọn option Add.Existing Item, duyệt chọn file *.cs th mục Expression project BaiTH6 ã có ể copy chúng vào Trang folder hành (lu ý không copy file MyRandom.cs dùng file th mục GenLib ã có) Hiện thực class ExprIndividual miêu t cá thể có thuộc tính giá trị ặc trng biểu thức i số Dời chuột phần tử gốc Project cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class ExprIndividual.cs, chọn button Add ể máy to class Viết code cho class nh sau (lu ý file mã nguồn ợc to ứng dụng ều phi dùng lệnh : using BaiTH5.GenLib; using BaiTH6.Expression; chúng có dùng phần tử namespace cũ này): class ExprIndividual : AbstractIndividual { //giá trị ặc trng biểu thức private IExpression specVal; private static IExpressionFactory ef = new ExpressionFactory(); //hàm to cá thể cách ngẫu nhiên public ExprIndividual() { specVal = ef.createRandomExpression(); } //hàm to cá thể có giá trị ặc trng xác ịnh public ExprIndividual(IExpression specVal) { this.specVal = specVal; } //hiện thực thuộc tính SpecValue public override Object SpecValue { get { return specVal; } set { specVal = (IExpression)value; } } //hàm gii mã ối tợng thành chuỗi vn bn public override String ToString() { //return String.Format("vp={0:f4}, fit={1:f4}",valeurPropre, fitness); return String.Format("vp={0:s} fp={1:f5}\r\n", specVal.ToString(), Fitness); } //hàm phối giống với other public override IIndividual cross(IIndividual other) Trang { // on accăde directement à la valeur propre, pas la peine d'utiliser d'accesseur IExpression e2 = other.SpecValue as IExpression; if (e2 != null) { IExpression ek = ef.createBinaryOp(Operator.DIV, ef.createBinaryOp(Operator.PLUS, specVal, e2), ef.createConstant(2)); return new ExprIndividual(ek.simplify()); } return clone(); } //hàm ột biến public override void muter() { //to biểu thức ngẫu nhiên IExpression e2 = ef.createRandomExpression(); //theo trung bình cộng với biểu thức specVal = ef.createBinaryOp(Operator.DIV, ef.createBinaryOp(Operator.PLUS, specVal, e2), ef.createConstant(2)); specVal = specVal.simplify(); } //hàm nhân bn theo mẫu Prototype public override IIndividual clone() { IIndividual ei = new ExprIndividual(specVal); ei.Fitness = Fitness; return ei; } } Hiện thực ối tợng mục tiêu mà biểu thức muốn hội tụ Dời chuột phần tử gốc Project cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class FuncTarget.cs, chọn button Add ể máy to class Viết code cho class nh sau : class FuncTarget : ITarget { //giá trị mục tiêu private double value; //danh sách trị biến ợc dùng private IVarList env; //ối tợng to số ngẫu nhiên tồn chng trình private static MyRandom rnd = MyRandom.getInstance(); Trang private static IExpressionFactory ef = new ExpressionFactory(); //hàm khởi to public FuncTarget() { value = rnd.RndDouble(); env = ef.createRandomVarList(); } //hàm tính toán giá trị cá thể public double getVal(IIndividual i) { IExpression e = i.SpecValue as IExpression; if (e == null) return 0; return e.eval(env); } //hàm tính tốn cá thể public double eval(IIndividual i) { IExpression e = i.SpecValue as IExpression; if (e == null) return 0; double r1 = e.eval(env); return / ((value - r1) * (value - r1)); } //hàm gii mã ối tợng thành chuỗi vn bn public override String ToString() { return String.Format("Ta tìm biểu thức có giá trị : {0:f5} dùng giá trị biến {1:s}", value, env.ToString()); } } Hiện thực class Factory chuyên to hệ cá thể mà cá thể có giá trị ặt trng biểu thức Dời chuột phần tử gốc Project cửa sổ “Solution Explorer”, ấn phi chuột vào ể hiển thị menu lệnh, chọn chức nng Add.Class ể hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class ExprPopFactory.cs, chọn button Add ể máy to class Viết code cho class nh sau : class ExprPopFactory : IPopulationFactory { //hàm to ối tợng mục tiêu public ITarget createTarget() { return new FuncTarget(); } //hàm to hệ có size cá thể ngẫu nhiên public IPopulation createRandomPopulation(int size) Trang { IPopulation pop = new Population(); for (int i = 0; i < size; i++) { pop.add(new ExprIndividual()); } return pop; } } Nếu cửa sổ ToolBox cha 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 phi cửa sổ ToolBox ể chuyển chế ộ hiển thị thờng trực 10 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 li thuộc tính Text = "Start", thuộc tính (Name) = btnStart To hàm xử lý kiện Click Button viết on code kiểm thử gii thuật tiến hóa biểu thức i số nh sau : private void btnStart_Click(object sender, EventArgs e) { int popSize = 20; //số cá thể hệ int nbGens = 10; //số hệ cần tiến hóa //to ối tợng qun 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ể"); //to ối tợng Factory cho ứng dụng IPopulationFactory pf = new ExprPopFactory(); //nhờ Factory to ngẫu nhiên hệ ầu tiên IPopulation pop = pf.createRandomPopulation(popSize); //nhờ Factory to ố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 giá trị hệ hành file oFile.WriteLine("Thế hệ " + i + ":"); OutExprPop(oFile, pop, vc); pop = pop.evoluer(vc); } //xuất giá trị hệ cuối file oFile.WriteLine("Kết qu : "); OutExprPop(oFile, pop, vc); //xuất hệ cuối file oFile.WriteLine("Các biểu thức kết qu : " + pop); oFile.WriteLine("=========================================================="); //óng file Trang oFile.Close(); } private void OutExprPop(StreamWriter oFile, IPopulation pop, ITarget vc) { int cnt = pop.size(); FuncTarget ft = (FuncTarget)vc; for (int i = 0; i < cnt; i++) { oFile.WriteLine(ft.getVal(pop[i]) + ", "); } } 11 Thêm lệnh using sau vào ầu file Form1.cs : using BaiTH6.GenLib; using BaiTH7.Expression; using System.IO; 12 Dịch chy chng trình Nếu có lỗi sửa, hết lỗi chng trình s chy Mỗi lần ngời dùng click chuột vào button, chng trình s to biểu thức ngẫu nhiên làm mục tiêu tiến hóa ến, sau ó chng trình to hệ ban ầu gồm nhiều cá thể mà giá trị ặc trng biểu thức ngẫu nhiên Cuối chng trình thử chy gii thuật tiến hóa hệ ban ầu nhiều lần Cuối chng trình xuất hệ cuối file ể ta kiểm tra kết qu ánh giá mức ộ hội tụ gii thuật tiến hóa 13 Dùng trình WordPad mở file data.txt th mục chứa file kh thi chng trình, quan sát xem biểu thức kết qu giá trị chúng có gần giống với biểu thức mục tiêu không ... code cho class nh sau (lu ý file mã nguồn ợc to ứng dụng ều phi dùng lệnh : using BaiTH5.GenLib; using BaiTH6.Expression; chúng có dùng phần tử namespace cũ này): class ExprIndividual : AbstractIndividual... i.SpecValue as IExpression; if (e == null) return 0; double r1 = e.eval(env); return / ((value - r1) * (value - r1)); } //hàm gii mã ối tợng thành chuỗi vn bn public override String ToString()... oFile.WriteLine(ft.getVal(pop[i]) + ", "); } } 11 Thêm lệnh using sau vào ầu file Form1.cs : using BaiTH6.GenLib; using BaiTH7.Expression; using System.IO; 12 Dịch chy chng trình Nếu có lỗi sửa, hết lỗi