1. Trang chủ
  2. » Tất cả

Microsoft Word - Bai 7.1.docx

6 2 0

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 6
Dung lượng 86,64 KB

Nội dung

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 gii 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 gii thuật tiến hóa vào loi cá thể xác ịnh : biểu thức i số II Nội dung : Áp dụng thuật gii tiến hóa tổng quát ể thử tiến hóa cá thể có giá trị ặc trng 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 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 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 BaiTH7), 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 xây dựng form giao diện ứng dụng sau Dùng li th viện miêu t thuật gii 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 li mức dùng li mã nguồn th việ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.New Folder ể to folder ặt tên cho folder GenLib Click phi chuột vào folder vừa to 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 li 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 li mức dùng li mã nguồn phân hệ 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.New Folder ể to folder ặt tên cho folder Expression Click phi chuột vào folder vừa to 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 (lu ý 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 trng biểu thức i số 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 ExprIndividual.cs, chọn button Add ể máy to class Viết code cho class nh sau (lu ý file mã nguồn ợc to ứng dụng ều phi 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 trng biểu thức private IExpression specVal; private static IExpressionFactory ef = new ExpressionFactory(); //hàm to cá thể cách ngẫu nhiên public ExprIndividual() { specVal = ef.createRandomExpression(); } //hàm to cá thể có giá trị ặc trng 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 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("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() { //to 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 bn 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 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 FuncTarget.cs, chọn button Add ể máy to 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 to số ngẫu nhiên tồn chng trình private static MyRandom rnd = MyRandom.getInstance(); Trang private static IExpressionFactory ef = new ExpressionFactory(); //hàm khởi to 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 gii mã ối tợng thành chuỗi vn bn 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 to hệ cá thể mà cá thể có giá trị ặt trng biểu thức 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 ExprPopFactory.cs, chọn button Add ể máy to class Viết code cho class nh sau : class ExprPopFactory : IPopulationFactory { //hàm to ối tợng mục tiêu public ITarget createTarget() { return new FuncTarget(); } //hàm to 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 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 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 li thuộc tính Text = "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ử gii 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 //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 ExprPopFactory(); //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 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 chy chng trình Nếu có lỗi sửa, hết lỗi chng trình s chy Mỗi lần ngời dùng click chuột vào button, chng trình s to biểu thức ngẫu nhiên làm mục tiêu tiến hóa ến, sau ó chng trình to hệ ban ầu gồm nhiều cá thể mà giá trị ặc trng biểu thức ngẫu nhiên Cuối chng trình thử chy gii thuật tiến hóa hệ ban ầu nhiều lần Cuối chng trình xuất hệ cuối file ể ta kiểm tra kết qu ánh giá mức ộ hội tụ gii thuật tiến hóa 13 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 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 (lu ý file mã nguồn ợc to ứng dụng ều phi 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 gii mã ối tợng thành chuỗi vn bn 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 chy chng trình Nếu có lỗi sửa, hết lỗi

Ngày đăng: 04/01/2023, 10:23