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 1MÔ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ó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ác cá thể có giá trị ặc trng
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 li các mẫu này trong bất kỳ vị trí nào của chng trình mới cần xây dựng
IV Qui trình xây dựng chng trình
1 Chy 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 phi, 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 ể to 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 to mới/xóa/hiệu chỉnh thuộc tính/to 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 li th viện miêu t thuật gii 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 li ở mức dùng li 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 phi chuột vào nó ể hiển thị menu lệnh, chọn chức nng Add.New Folder ể to 1 folder mới ặt tên cho folder này là GenLib Click phi chuột vào folder mới vừa to 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 li 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 li ở mức dùng li 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 phi chuột vào nó ể hiển thị menu lệnh, chọn chức nng Add.New Folder ể to 1 folder mới ặt tên cho folder này là Expression Click phi chuột vào folder mới vừa to 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 2folder hiện hành (lu ý 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 trng
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 phi chuột vào nó ể 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 là ExprIndividual.cs, chọn button Add ể máy to 1 class mới Viết code cho class này nh sau (lu ý các file mã nguồn ợc to mới trong ứng dụng ều phi 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 trng là 1 biểu thức
privateIExpression specVal;
privatestaticIExpressionFactory ef = newExpressionFactory();
//hàm to cá thể 1 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
publicoverrideObject SpecValue
{
get { return specVal; }
set { specVal = (IExpression)value; }
}
//hàm gii mã ối tợng thành chuỗi vn bn
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()
{
//to 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 bn 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 phi chuột vào nó ể 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 là FuncTarget.cs, chọn button Add ể máy to 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 to số ngẫu nhiên duy nhất trong toàn chng trình
privatestaticMyRandom rnd = MyRandom.getInstance();
Trang 4privatestaticIExpressionFactory ef = newExpressionFactory();
//hàm khởi to
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 gii mã ối tợng thành chuỗi vn bn
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 to thế hệ các cá thể mà mỗi cá thể có giá trị
ặt trng 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 phi chuột vào nó ể 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 là ExprPopFactory.cs, chọn button Add ể máy to 1 class mới Viết code cho class này nh sau :
class ExprPopFactory : IPopulationFactory {
//hàm to ối tợng mục tiêu
public ITarget createTarget() {
return new FuncTarget ();
}
//hàm to 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 cha 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 phi 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 li thuộc tính Text = "Start", thuộc tính (Name) = btnStart To hàm xử lý sự kiện Click trên Button rồi viết on code kiểm thử gii 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
//to ối tợng qun 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ể" );
//to ối tợng Factory cho ứng dụng
IPopulationFactory pf = new ExprPopFactory ();
//nhờ Factory to ngẫu nhiên thế 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 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 6oFile.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à chy chng trình Nếu có lỗi thì sửa, nếu hết lỗi thì chng trình s chy Mỗi lần ngời dùng click chuột vào button, chng trình s to 1 biểu thức ngẫu nhiên làm mục tiêu tiến hóa ến, sau ó chng trình to thế hệ ban ầu gồm nhiều cá thể mà giá trị ặc trng là biểu thức ngẫu nhiên Cuối cùng chng trình thử chy gii thuật tiến hóa trên thế hệ ban ầu nhiều lần Cuối cùng chng 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 gii 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 chng 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