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

Microsoft Word - Bai 7.1.docx

6 3 0
Tài liệu đã được kiểm tra trùng lặp

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tiến hóa các biểu thức về biểu thức mục tiêu
Trường học University of Science and Technology of Hanoi
Chuyên ngành Computer Science
Thể loại Thức bài thực hành
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 6
Dung lượng 86,64 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

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 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ó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ác cá thể có giá trị ặc trng

là biểu thức ngẫu nhiên ban ầu về biểu thức mục tiêu theo nghĩa giá trị của chúng gần bằng với giá trị của biểu thức mục tiêu nhất

III Chuẩn ầu ra :

 Nắm vững tính chất, công dụng của các mẫu thiết kế ợc dùng trong bài thực hành này ể có thể dùng li các mẫu này trong bất kỳ vị trí nào của chng trình mới cần xây dựng

IV Qui trình xây dựng chng trình

1 Chy VS Net, chọn menu File.New.Project ể hiển thị cửa sổ New Project

2 Mở rộng mục Visual C# trong TreeView "Project Types", chọn mục Window, chọn icon "Windows Form Application" trong listbox "Templates" bên phi, thiết lập th mục chứa Project trong listbox "Location", nhập tên Project vào textbox "Name:" (td BaiTH7), click button OK ể to Project theo các thông

số ã khai báo

3 Form ầu tiên của ứng dụng ã hiển thị trong cửa sổ thiết kế, việc thiết kế form là quá trình lặp 4 thao tác to mới/xóa/hiệu chỉnh thuộc tính/to hàm

xử lý sự kiện cho từng ối tợng cần dùng trong form Ta s xây dựng form giao diện ứng dụng sau

4 Dùng li th viện miêu t thuật gii tiến hóa tổng quát ở bài thực hành 5.1 : cách chính quy nhất là sử dụng file *.dll miêu t th viện Tuy nhiên ở ây ta chỉ dừng li ở mức dùng li mã nguồn của th viện

Dời chuột về phần tử gốc của cây Project trong cửa sổ “Solution Explorer”, ấn phi chuột vào nó ể hiển thị menu lệnh, chọn chức nng Add.New Folder ể to 1 folder mới ặt tên cho folder này là GenLib Click phi chuột vào folder mới vừa to và chọn option Add.Existing Item, duyệt chọn các file *.cs trong th mục GenLib trong project BaiTH5 ã có ể copy chúng vào folder hiện hành

5 Dùng li phân hệ miêu t biểu thức ở bài thực hành 6.1 : cách chính quy nhất

là sử dụng file *.dll miêu t phân hệ này Tuy nhiên ở ây ta chỉ dừng li ở mức dùng li mã nguồn của phân hệ

Dời chuột về phần tử gốc của cây Project trong cửa sổ “Solution Explorer”, ấn phi chuột vào nó ể hiển thị menu lệnh, chọn chức nng Add.New Folder ể to 1 folder mới ặt tên cho folder này là Expression Click phi chuột vào folder mới vừa to và chọn option Add.Existing Item, duyệt chọn các file *.cs trong th mục Expression trong project BaiTH6 ã có ể copy chúng vào

Trang 2

folder hiện hành (lu ý không copy file MyRandom.cs và dùng file này trong th mục GenLib ã có)

6 Hiện thực class ExprIndividual miêu t 1 cá thể có thuộc tính giá trị ặc trng

là 1 biểu thức i số

Dời chuột về phần tử gốc của cây Project trong cửa sổ “Solution Explorer”, ấn phi chuột vào nó ể 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 là ExprIndividual.cs, chọn button Add ể máy to 1 class mới Viết code cho class này nh sau (lu ý các file mã nguồn ợc to mới trong ứng dụng ều phi dùng 2 lệnh :

using BaiTH5.GenLib;

using BaiTH6.Expression;

vì chúng có dùng các phần tử trong 2 namespace cũ này):

classExprIndividual : AbstractIndividual {

//giá trị ặc trng là 1 biểu thức

privateIExpression specVal;

privatestaticIExpressionFactory ef = newExpressionFactory();

//hàm to cá thể 1 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

publicoverrideObject SpecValue

{

get { return specVal; }

set { specVal = (IExpression)value; }

}

//hàm gii mã ối tợng thành chuỗi vn bn

publicoverrideString ToString()

{

//return String.Format("vp={0:f4}, fit={1:f4}",valeurPropre, fitness);

returnString.Format("vp={0:s} fp={1:f5}\r\n", specVal.ToString(), Fitness);

}

//hàm phối giống với other

publicoverrideIIndividual cross(IIndividual other)

Trang 3

{

// on accède directement à la valeur propre, pas la peine d'utiliser d'accesseur

IExpression e2 = other.SpecValue asIExpression;

if (e2 != null)

{

IExpression ek = ef.createBinaryOp(Operator.DIV,

ef.createBinaryOp(Operator.PLUS, specVal, e2),

ef.createConstant(2));

returnnewExprIndividual(ek.simplify());

}

return clone();

}

//hàm ột biến

publicoverridevoid muter()

{

//to biểu thức mới ngẫu nhiên

IExpression e2 = ef.createRandomExpression();

//theo trung bình cộng của mình với biểu thức mới

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

publicoverrideIIndividual clone()

{

IIndividual ei = newExprIndividual(specVal);

ei.Fitness = Fitness;

return ei;

}

7 Hiện thực ối tợng mục tiêu mà các biểu thức muốn hội tụ về

Dời chuột về phần tử gốc của cây Project trong cửa sổ “Solution Explorer”, ấn phi chuột vào nó ể 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 là FuncTarget.cs, chọn button Add ể máy to 1 class mới Viết code cho class này nh sau :

classFuncTarget : ITarget {

//giá trị mục tiêu

privatedouble value;

//danh sách trị của các biến ợc dùng

privateIVarList env;

//ối tợng to số ngẫu nhiên duy nhất trong toàn chng trình

privatestaticMyRandom rnd = MyRandom.getInstance();

Trang 4

privatestaticIExpressionFactory ef = newExpressionFactory();

//hàm khởi to

public FuncTarget()

{

value = rnd.RndDouble();

env = ef.createRandomVarList();

}

//hàm tính toán giá trị cá thể

publicdouble getVal(IIndividual i)

{

IExpression e = i.SpecValue asIExpression;

if (e == null) return 0;

return e.eval(env);

}

//hàm tính toán cá thể

publicdouble eval(IIndividual i)

{

IExpression e = i.SpecValue asIExpression;

if (e == null) return 0;

double r1 = e.eval(env);

return 1 / ((value - r1) * (value - r1));

}

//hàm gii mã ối tợng thành chuỗi vn bn

publicoverrideString ToString()

{

returnString.Format("Ta tìm biểu thức có giá trị : {0:f5} nếu dùng giá trị các biến {1:s}", value, env.ToString());

}

8 Hiện thực class Factory chuyên to thế hệ các cá thể mà mỗi cá thể có giá trị

ặt trng là biểu thức

Dời chuột về phần tử gốc của cây Project trong cửa sổ “Solution Explorer”, ấn phi chuột vào nó ể 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 là ExprPopFactory.cs, chọn button Add ể máy to 1 class mới Viết code cho class này 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 thế hệ có size cá thể ngẫu nhiên

public IPopulation createRandomPopulation( int size)

Trang 5

{

IPopulation pop = newPopulation();

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

{

pop.add(newExprIndividual());

}

return pop;

}

 

9 Nếu cửa sổ ToolBox cha hiển thị chi tiết, chọn menu View.Toolbox ể hiển thị nó (thờng nằm ở bên trái màn hình) Click chuột vào button (Auto Hide) nằm ở góc trên phi cửa sổ ToolBox ể chuyển nó về chế ộ hiển thị thờng trực

10 Duyệt tìm phần tử Button trong cửa sổ ToolBox, chọn nó và v nó ở góc trên trái của Form Vào cửa sổ thuộc tính của Button và hiệu chỉnh li thuộc tính Text = "Start", thuộc tính (Name) = btnStart To hàm xử lý sự kiện Click trên Button rồi viết on code kiểm thử gii thuật tiến hóa các biểu thức i

số nh sau :

private void btnStart_Click(object sender, EventArgs e) {

int popSize = 20; //số cá thể trong từng thế hệ

int nbGens = 10; //số thế hệ cần tiến hóa

//to ối tợng qun lý file ể ghi dữ liệu

StreamWriter oFile = new StreamWriter ( "data.txt" , true , Encoding Unicode);

//xuất số cá thể của mỗi thế hệ ra 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 thế 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 ra file

oFile.WriteLine(vc);

//lặp tiến hóa thế hệ với số lầ lặp xác ịnh

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

{

//xuất giá trị thế hệ hiện hành ra file

oFile.WriteLine( "Thế hệ " + i + ":" );

OutExprPop(oFile, pop, vc);

pop = pop.evoluer(vc);

}

//xuất giá trị thế hệ cuối cùng ra file

oFile.WriteLine( "Kết qu : " );

OutExprPop(oFile, pop, vc);

//xuất thế hệ cuối cùng ra file

oFile.WriteLine( "Các biểu thức kết qu : " + pop);

oFile.WriteLine( "==========================================================" ); //óng file

Trang 6

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 các lệnh using sau vào ầu file Form1.cs :

using BaiTH6.GenLib;

using BaiTH7.Expression;

using System.IO;

12 Dịch và chy chng trình Nếu có lỗi thì sửa, nếu hết lỗi thì 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 1 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 thế hệ ban ầu gồm nhiều cá thể mà giá trị ặc trng là biểu thức ngẫu nhiên Cuối cùng chng trình thử chy gii thuật tiến hóa trên thế hệ ban ầu nhiều lần Cuối cùng chng trình xuất thế hệ cuối cùng ra file ể ta kiểm tra kết qu và

ánh giá mức ộ hội tụ của gii thuật tiến hóa

13 Dùng trình WordPad mở file data.txt trong th mục chứa file kh thi của chng trình, quan sát xem các biểu thức kết qu và giá trị của chúng có gần giống với biểu thức mục tiêu không

 

 

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