Bài tập thực hành 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
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ó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. BaiTH ), 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 .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 xplorer”, ấ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. xisting Item, duyệt chọn các file *.cs trong
th mục GenLib trong project BaiTH ã có ể copy chúng vào folder hiện
hành.
.
Dùng li phân hệ miêu t biểu thức ở bài thực hành .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 xplorer”, ấ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à xpression. Click phi chuột vào
folder mới vừa to và chọn option Add. xisting Item, duyệt chọn các file *.cs
trong th mục xpression trong project BaiTH ã có ể copy chúng vào
Trang 2
folder hiện hành (lu ý không copy file MyRandom.cs và dùng file này trong
th mục GenLib ã có).
.
Hiện thực class xprIndividual 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 xplorer”, ấ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à
xprIndividual.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 BaiTH .GenLib
using BaiTH . xpression
vì chúng có dùng các phần tử trong 2 namespace cũ này):
class ExprIndividual : AbstractIndividual {
//giá trị ặc trng là 1 biểu thức
private IExpression specVal;
private static IExpressionFactory ef = new ExpressionFactory();
//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
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:f }\r\n", specVal.ToString(), Fitness);
}
//hàm phối giống với other
public override IIndividual cross(IIndividual other)
Trang 3
{
// 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 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
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à 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 xplorer”, ấ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 :
class FuncTarget : ITarget {
//giá trị mục tiêu
private double value;
//danh sách trị của các biến ợc dùng
private IVarList env;
//ối tợng to số ngẫu nhiên duy nhất trong toàn chng trình
private static MyRandom rnd = MyRandom.getInstance();
Trang 4
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 toá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 1 / ((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:f } 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 xplorer”, ấ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à
xprPopFactory.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 = 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ị 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 nb ens = 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 < nb ens; 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. enLib;
using BaiTH .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.
Bạn đang xem tài liệu "Bài tập thực hành 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", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
bai_tap_thuc_hanh_mon_cac_mau_thiet_ke_huong_doi_tuong_bai_t.pdf

