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ố 5.1: Xây dựng và kiểm thử thuật giải tiến hóa trên các cá thể đơn giản

Trang 1  
MÔN : CÁC MẪU THIẾT KẾ HỚNG ỐI TỢNG  
Bài thực hành số 5.1 : Xây dựng và kiểm thử thuật gii tiến hóa trên các cá thể  
n gin  
I. Mục tiêu :  
. Giúp SV làm quen với gii thuật tiến hóa và công dụng của nó. Giúp SV biết  
cách sử dụng các mẫu thiết kế Singleton, Prototype, Abstract Factory trong  
từng yêu cầu cụ thể.  
II. Nội dung :  
Xây dựng module thực hiện gii thuật tiến hóa trên các cá thể chứa số thực. Ý  
tởng gii thuật tiến hóa nh sau :  
1. lúc ầu, ta có 1 thế hệ gồm n cá thể, mỗi cá thể có 1 giá trị ặc trng (specval)  
và có ộ thích nghi (fitness) xác ịnh.  
2. quá trình tiến hóa của mỗi thế hệ diễn ra theo c chế lặp, mỗi chu kỳ tiến hóa  
có các hot ộng sau :  
-
-
xác ịnh li ộ thich nghi của từng cá thể.  
chọn lựa 1 số cá thể có ộ thích nghi cao nhất ể giữ chúng li làm nồng cốt cho  
thế hệ mới.  
-
-
cho các cá thể này phối giống ể to ra các cá thể con cho ủ số lợng.  
chọn 1 số cá thể và cho chúng ột biến thành các thể khác.  
Thế hệ các cá thể ầu tiên  
Thế hệ các cá thể kế tiếp  
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ế Singleton, Prototype,  
Abstract Factory ể có thể dùng li 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  
Trang 2  
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. BaiTH ), 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 giới thiệu yêu cầu của ứng  
dụng sau. Bây giờ ta s xây dựng th viện chứa các thành phần miêu t thuật  
gii tiến hóa tổng quát.  
4. Dời chuột về gốc cây Project trong cửa sổ "Solution xplorer", ấn phi chuột  
trên phần tử gốc này, chọn option Add.New Folder, ặt tên cho folder mới là  
GenLib.  
. Thờng bài toán dùng thuật gii tiến hóa cần to thế hệ ầu tiên các cá thể 1  
cách ngẫu nhiên. Việc to ối tợng ngẫu nhiên thờng liên quan ến việc to  
số nguyên, số thực ngẫu nhiên. ể việc lấy số ngẫu nhiên của nhiều phần tử  
trong phần mềm ợc nhất quán, ta s to 1 ối tợng duy nhất chuyên phục  
vụ to số ngẫu nhiên. ể bo m phần tử to số ngẫu nhiên là duy nhất, ta  
dùng mẫu thiết kế Singleton. Hãy hiện thực ối tợng này có các dịch vụ sau :  
. to số nguyên ngẫu nhiên bất kỳ.  
. to số nguyên ngẫu nhiên nằm trong khong từ 0 tới n.  
. to số thực ngẫu nhiên nằm trong khong từ 0 tới 1.  
Dời chuột về th mục GenLib trong cửa sổ “Solution xplorer”, ấ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à MyRandom.cs, chọn  
button Add ể máy to 1 class mới. Viết code cho class này nh sau :  
class MyRandom {  
//hàm khởi to private ể cấm bên ngoài to ối tợng MyRandom  
private MyRandom() { }  
//thông tin dùng chung trong class  
private static MyRandom myrnd = new MyRandom();  
public static MyRandom getInstance() { return myrnd; }  
//thông tin trong ối tợng  
private Random rnd = new Random();  
//tác vụ to số nguyên ngẫu nhiên bất kỳ  
public int RndInt() { return rnd.Next(); }  
//tác vụ to số nguyên ngẫu nhiên trong khong từ 0 ến n  
public int RndInt(int n) { return rnd.Next(n); }  
//tác vụ to số thực ngẫu nhiên từ 0 tới 1  
public double RndDouble() { return rnd.NextDouble(); }  
}
Lu ý rằng ta ã dùng mẫu Adapter ể xây dựng class MyRandom dựa trên  
class Random của .N T.  
Trang 3  
. ịnh nghĩa interface cho ối tợng cá thể của thuật gii tiến hóa tổng quát có  
các dịch vụ sau :  
. tham kho giá trị ặc trng.  
. tham kho/hiệu chỉnh ộ fitness.  
. phối giống với cá thể khác.  
. ột biến mình  
. nhân bn vô tính mình  
. gii mã mình thành chuỗi vn bn  
Dời chuột về th mục GenLib trong cửa sổ “Solution xplorer”, ấn phi chuột  
vào nó ể hiển thị menu lệnh, chọn chức nng Add.New Item ể hiển thị cửa sổ  
“Add New Item”, chọn mục “Interface”, hiệu chỉnh tên interface là  
IIndividual.cs, chọn button Add ể máy to 1 interface mới. Viết code cho  
interface này nh sau :  
interface IIndividual : IComparable<IIndividual> {  
//thuộc tính luận lý SpecValue : chỉ ọc  
Object SpecValue {get;}  
//thuộc tính luận lý Fitness : ọc/ghi  
double Fitness {get; set;}  
//hàm phối giống với other  
IIndividual cross(IIndividual other);  
//hàm ột biến mình  
void muter();  
//hàm to ối tợng mới theo c chế nhân bn vô tính (dùng mẫu Prototype)  
IIndividual clone();  
//hàm gii mã ối tợng thành dng chuỗi vn bn  
String ToString();  
}
. Viết thêm class abstract chứa những thông tin chung mà các ối tợng cá thể  
khác nhau s dùng. Dĩ nhiên class này phi hiện thực interface IIndividual :  
Dời chuột về th mục GenLib trong cửa sổ “Solution xplorer”, ấ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à  
AbstractIndividual.cs, chọn button Add ể máy to 1 class mới. Viết code cho  
class này nh sau :  
abstract class AbstractIndividual : IIndividual {  
protected double fitness = 0.0;  
protected bool muted = false;  
public AbstractIndividual()  
{
}
//thuộc tính luận lý SpecValue : ọc/ghi  
public abstract Object SpecValue { get; set; }  
Trang 4  
public bool Muted  
{
get { return muted; }  
set { muted = value; }  
}
public double Fitness  
{
get { return fitness; }  
set { fitness = value; }  
}
//hàm so sánh với cá thể khác (phục vụ sắp xếp danh sách)  
public int CompareTo(IIndividual o)  
{
if (o.Fitness == Fitness)  
return 0;  
else if (Fitness < o.Fitness)  
return -1;  
return 1;  
}
//hàm nhân bn mình theo mẫu Prototype  
public abstract IIndividual clone();  
//hàm ột biến mình  
public abstract void muter();  
//hàm phối giống với other  
public abstract IIndividual cross(IIndividual other);  
}
8. Ta cần ối tợng mục tiêu chuyên ánh giá cá thể ể tính ộ thích nghi của các  
thể ó theo ngữ nghĩa xác ịnh. Trớc hết ta ịnh nghĩa interface tối thiểu cho  
ối tợng mục tiêu này.  
Dời chuột về th mục GenLib trong cửa sổ “Solution xplorer”, ấn phi chuột  
vào nó ể hiển thị menu lệnh, chọn chức nng Add.New Item ể hiển thị cửa sổ  
“Add New Item”, chọn mục “Interface”, hiệu chỉnh tên interface là ITarget.cs,  
chọn button Add ể máy to 1 interface mới. Viết code cho interface này nh  
sau :  
interface ITarget {  
//tác vụ tính toán cá thể  
double eval(IIndividual ind);  
}
. Bây giờ ta ịnh nghĩa interface cho ối tợng thế hệ với các tính chất sau :  
. lúc ầu cha có cá thể nào.  
. cho phép thêm từng cá thể vào, số lợng các thể là bất kỳ.  
. cho phép tham kho số lợng cá thể.  
Trang 5  
. tiến hóa sang thế hệ mới theo 2 phng pháp : phối giống và ột biến.  
Dời chuột về th mục GenLib trong cửa sổ “Solution xplorer”, ấn phi chuột  
vào nó ể hiển thị menu lệnh, chọn chức nng Add.New Item ể hiển thị cửa sổ  
“Add New Item”, chọn mục “Interface”, hiệu chỉnh tên interface là  
IPopulation.cs, chọn button Add ể máy to 1 interface mới. Viết code cho  
interface này nh sau :  
interface IPopulation {  
//hàm tr về số cá thể  
int size();  
//hàm thêm cá thể mới vào thế hệ  
void add(IIndividual individu);  
//thuộc tính truy xuất cá thể thứ i  
IIndividual this[int i] { get; }  
//hàm gii mã ối tợng thành chuỗi vn bn  
String ToString();  
//hàm tiến hóa sang thế hệ mới  
IPopulation evoluer(ITarget cible);  
}
10.Ta hiện thực ối tợng thế hệ, ối tợng này s chứa thuật gii tiến hóa tổng  
quát.  
Dời chuột về th mục GenLib trong cửa sổ “Solution xplorer”, ấ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à Population.cs, chọn  
button Add ể máy to 1 class mới. Viết code cho class này nh sau :  
class Population : IPopulation {  
//qun lý thế hệ các cá thể bằng class List<T> của .N T  
private List<IIndividual> individus = new List<IIndividual>();  
//dùng ối tợng to số ngẫu nhiên duy nhất trong toàn chng trình  
private static MyRandom rnd = MyRandom.getInstance();  
//hàm tr về số cá thể  
public int size() {  
return individus.Count();  
}
//hàm thêm cá thể mới vào thế hệ  
public void add(IIndividual individu) {  
individus.Add(individu);  
}
//thuộc tính truy xuất cá thể thứ i  
public IIndividual this[int i] {  
get { return individus[i]; }  
}
//hàm gii mã ối tợng thành chuỗi vn bn  
public override String ToString() {  
String buf = "[";  
Trang 6  
bool fstart = true;  
for (int i = 0; i < individus.Count(); i++)  
if (fstart) {  
fstart = false;  
buf += individus[i].ToString();  
}
else buf += ", " + individus[i].ToString();  
return buf + "]";  
}
//hàm tiến hóa sang thế hệ mới  
public IPopulation evoluer(ITarget cible) {  
//tính ộ thích nghi các cá thể và sắp xếp chúng  
evaluer(cible);  
//to thế hệ mới  
Population pop = reproduire();  
//cho % cá thể bị ột biến  
pop.muter(0.0 );  
//tính li ộ thích nghi các cá thể và sắp xếp chúng  
//pop.evaluer(cible);  
return pop;  
}
//hàm tính ộ thích nghi của từng cá thể và sắp xếp các cá thể theo ộ thích nghi của  
chúng  
private void evaluer(ITarget cible) {  
//lặp tính ộ thích nghi của từng cá thể  
foreach (IIndividual ind in individus)  
{
ind.Fitness = cible.eval(ind);  
}
//sắp xếp các cá thể theo ộ thích nghi của chúng  
Sort();  
}
//hàm sắp xếp thự tự các cá thể theo ngữ nghĩa xác ịnh  
private void Sort() {  
individus.Sort();  
individus.Reverse();  
}
//hàm ột biến cho cá thể  
private void muter(double ratio) {  
//to tập hợp cá thể cần ột biến (trừ cá thể ầu tiên có ộ thích nghi tốt nhất)  
List<IIndividual> subl = individus. etRange(1, individus.Count - 1);  
//xử lý ột biến cho từng cá thể với xác suất ratio  
Trang 7  
foreach (IIndividual ind in subl) {  
if (rnd.RndDouble() < ratio)  
ind.muter();  
}
}
//hàm to thế hế mới  
private Population reproduire() {  
//chọn 20% cá thể có ộ thích nghi tốt nhất  
int max = individus.Count() / ;  
Population pop = new Population();  
//cho chúng thành cá thể của thế hệ mới  
for (int i = 0; i < max; i++) {  
pop.add(individus[i].clone());  
}
//lặp phối giống từng cặp cá thể ã có (chọn ngẫu nhiên) ể to thêm 80% cá thể mới  
for (int i = max; i < size(); i++) {  
int mec = rnd.RndInt(max);  
int mef = rnd.RndInt(max);  
pop.add(individus[mec].cross(individus[mef]));  
}
return pop;  
}
}
11.Ta dùng mẫu Abstract Factory ể cung cấp dịch vụ to các ối tợng mà chng  
trình ứng dụng dùng. ối tợng Factory có kh nng nh sau :  
. to ợc 1 thế hệ cá thể với số lợng xác ịnh.  
. to ợc ối tợng mục tiêu của bài toán.  
Dời chuột về th mục GenLib trong cửa sổ “Solution xplorer”, ấn phi chuột  
vào nó ể hiển thị menu lệnh, chọn chức nng Add.New Item ể hiển thị cửa sổ  
“Add New Item”, chọn mục “Interface”, hiệu chỉnh tên interface là  
IPopulationFactory.cs, chọn button Add ể máy to 1 interface mới. Viết code  
cho interface này nh sau :  
interface IPopulationFactory {  
//hàm to ối tợng mục tiêu  
ITarget createTarget() ;  
//hàm to thế hệ có size cá thể ngẫu nhiên  
IPopulation createRandomPopulation(int size) ;  
}
12. Bây giờ ta thử áp dụng thuật gii tiến hóa vào bài toán n gin nh sau : ta  
lấy 1 số thực mục tiêu ngẫu nhiên, ta to ngẫu nhiên 1 thế hệ xuất phát gồm n  
số thực có ngẫu nhiên. Thử áp dụng thuật gii tiến hóa tổng quát ợc xây  
dựng trong th viện GenLib ể xem thế hệ số thực ban ầu có hội tụ về giá trị  
mục miêu hay không ?  
Trang 8  
13. Ta ịnh nghĩa class MyDouble ể qun lý số thực. MyDouble chính là giá trị ặc  
trng của cá thể cần tiến hóa.  
Dời chuột về phần tử gốc của cây Project trong cửa sổ “Solution xplorer”, ấ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”, hiệu chỉnh tên class là MyDouble.cs, chọn button Add  
ể máy to 1 class mới. Viết code cho class này nh sau :  
class MyDouble {  
private double val  
public MyDouble(double v) { val = v }  
public double Val  
{
get { return val }  
set { val = value }  
}
//hàm gii mã ối tợng mục tiêu ra chuỗi vn bn  
public override String ToString()  
{
String buf = String.Format("{0:f }", val)  
return buf  
}
}
14.Hiện thực ối tợng cá thể có các tính chất cụ thể nh sau :  
. giá trị ặc trng là ối tợng MyDouble qun lý số thực từ 0 tới 1.  
. ộ fitness là số thực, càng lớn nghĩa là càng thích nghi tốt.  
. phối giống với cá thể khác ể to cá thể con có giá trị ặc trng bằng trung  
bình cộng của cha m.  
. ột biến mình theo nguyên tắc : to 1 các thể mới ngẫu nhiên, ột biến giá  
trị ặc trng của mình bằng trung bình cộng của cá thể mới với mình.  
. nhân bn vô tính mình (dùng mẫu Prototype)  
. gii mã mình thành chuỗi vn bn miêu t giá trị ặc trng.  
. Dời chuột về phần tử gốc của cây Project trong cửa sổ “Solution xplorer”,  
ấ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”, hiệu chỉnh tên class là DoubleIndividual.cs,  
chọn button Add ể máy to 1 class mới. Viết code cho class này nh sau :  
using BaiTH . enLib;  
...  
class DoubleIndividual : IIndividual {  
//giá trị ặc trng của cá thể  
private MyDouble spVal;  
//ộ thích nghi của cá thể  
private double fitness = 0.0;  
//thuộc tính miêu t ã bị ộ biến cha  
private bool muted = false;  
//ối tợng to số ngẫu nhiên duy nhất trong toàn chng trình  
private static MyRandom rnd = MyRandom.getInstance();  
//hàm khởi to cá thể có giá trị ặc trng ngẫu nhiên  
Trang 9  
public DoubleIndividual() {  
this.spVal = new MyDouble(rnd.RndDouble());  
}
//hàm khởi to cá thể có giá trị ặc trng xác ịnh  
public DoubleIndividual(MyDouble valeurPropre) {  
this.spVal = valeurPropre;  
}
//hiện thực thuộc tính luận lý Muted  
public bool Muted {  
get { return muted; }  
set { muted = value; }  
}
//hiện thực thuộc tính luận lý SpecValue  
public Object SpecValue {  
get { return spVal; }  
set { spVal = (MyDouble)value; }  
}
//hiện thực thuộc tính luận lý Fitness  
public double Fitness {  
get { return fitness; }  
set { fitness = 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("{0:f }", spVal);  
}
//hàm so sánh với cá thể khác (phục vụ sắp xếp danh sách)  
public int CompareTo(IIndividual o) {  
if (o.Fitness == Fitness)  
return 0;  
else if (Fitness < o.Fitness)  
return -1;  
return 1;  
}
//hàm phối giống với cá thể khác  
public IIndividual cross(IIndividual other) {  
MyDouble o1 = SpecValue as MyDouble; //giá trị ặc trng của mình  
MyDouble o2 = other.SpecValue as MyDouble;//giá trị ặc trng của ối tác  
//to cá thể con  
if (o1 == null && o2 == null) return new DoubleIndividual(new MyDouble(0));  
if (o1 == null) return other;  
if (o2 == null) return this;  
return new DoubleIndividual(new MyDouble((o1.Val + o2.Val) / 2));  
}
Trang 10  
//hàm ột biến cá thể hiện hành  
public void muter() {  
//ột biến tối a 10% biên ộ giá trị ặc trng  
// spVal += (rnd.RndDouble() < 0. ? 1 : -1) * rnd.RndDouble() * 0.1 * spVal;  
//theo trung bình cộng với giá trị ặc trng ngẫu nhiên  
spVal = new MyDouble((spVal.Val + rnd.RndDouble()) / 2);  
//theo giá trị ặc trng ngẫu nhiên  
// spVal = Math.random();  
}
//hàm to ối tợng mới theo c chế nhân bn vô tính (dùng mẫu Prototype)  
public IIndividual clone() {  
return new DoubleIndividual(spVal);  
}
}
1 .Hiện thực ối tợng mục tiêu nh sau :  
. nó có giá trị ặc trng là MyDouble chứa 1 số thực từ 0 tới 1 giống nh các  
cá thể.  
. tính ộ fitness của cá thể theo công thức 1/((sv1-sv2)^2), trong ố sv1 là  
giá trị ặc trng của nó và sv2 là giá trị ặc trng của cá thể cần tính toán.  
Dời chuột về phần tử gốc của cây Project trong cửa sổ “Solution xplorer”, ấ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à  
DoubleTarget.cs, chọn button Add ể máy to 1 class mới. Viết code cho class  
này nh sau :  
using BaiTH . enLib;  
...  
class DoubleTarget : ITarget {  
//giá trị mục tiêu mà ta mong muốn t ợc  
private double val;  
//ối tợng to số ngẫu nhiên duy nhất trong toàn chng trình  
private MyRandom rnd = MyRandom.getInstance();  
//hàm khởi to ngẫu nhiên giá trị mục tiêu  
public DoubleTarget() {  
val = rnd.RndDouble();  
}
//hàm khởi to giá trị mục tiêu xác ịnh  
public DoubleTarget(double d) {  
val = d;  
}
//hàm tính ộ thích nghi của ối tợng theo ngữ nghĩa mong muốn  
//càng gần với mục tiêu càng có ộ thích nghi cao  
public double eval(IIndividual i) {  
MyDouble o1 = i.SpecValue as MyDouble;  
if (o1 == null) return 0;  
return 1 / ((o1.Val - val) * (o1.Val - val));  
Trang 11  
}
//tác vụ tính toán trị của cá thể  
public double getVal(IIndividual i) {  
MyDouble o1 = i.SpecValue as MyDouble;  
if (o1 == null) return 0;  
return o1.Val;  
}
//hàm tr về giá trị mục tiêu  
public double getValue() {  
return val;  
}
//hàm gii mã ối tợng mục tiêu ra chuỗi vn bn  
public override String ToString() {  
String buf = String.Format(" iá trị mong muốn : {0:f }", val);  
return buf;  
}
}
1 .Hiện thực ối tợng Factory cho ứng dụng nh sau :  
Dời chuột về phần tử gốc của cây Project trong cửa sổ “Solution xplorer”, ấ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à  
DoublePopFactory.cs, chọn button Add ể máy to 1 class mới. Viết code cho  
class này nh sau :  
using BaiTH6. enLib;  
...  
class DoublePopFactory : IPopulationFactory {  
//hàm to ối tợng mục tiêu  
public ITarget createTarget() {  
return new DoubleTarget();  
}
//hàm to thế hệ có size cá thể ngẫu nhiên  
public IPopulation createRandomPopulation(int size) {  
//to 1 thế hệ rỗng  
IPopulation pop = new Population();  
//lặp thêm từng cá thể vào thế hệ  
for (int i = 0; i < size; i++) {  
pop.add(new DoubleIndividual());  
}
return pop;  
}
}
1 .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.  
18.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 =  
Trang 12  
"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ử thuật gii tiến hóa nh sau :  
using System.IO;  
using BaiTH6. enLib;  
...  
private void btnStart_Click(object sender, ventArgs e){  
int popSize = 20;  
int nb ens = 10;  
//to ối tợng qun lý file ể ghi dữ liệu  
StreamWriter oFile = new StreamWriter("data.txt", true, ncoding.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 DoublePopFactory();  
//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 < nb ens; i++)  
{
//xuất thế hệ hiện hành ra file  
oFile.WriteLine("Thế hệ " + i + ":");  
oFile.WriteLine(pop);  
pop = pop.evoluer(vc);  
}
//xuất thế hệ cuối cùng ra file  
oFile.WriteLine("Kết qu : " + pop);  
//óng file  
oFile.Close();  
}
1 .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. Chức nng của chng trình là to thử 1 thế hệ gồm popSize cá thể, cho  
nó tiến hóa nbGen chu kỳ, mỗi chu kỳ tiến hóa chng trình xuất giá trị ặc  
trng của các cá thể của thế hệ hiện hành ra file ể chúng ta kiểm tra.  
20.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 giá trị mục tiêu là bao nhiêu, giá trị ặc trng ban  
ầu của từng cá thể, giá trị ặc trng của các cá thể theo từng thế hệ và giá trị  
ặc trng của các cá thể ở thế hệ cuối cùng. So sánh xem chúng có gần sát với  
giá trị mục tiêu không ?  
pdf 12 trang myanh 22420 Free
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ố 5.1: Xây dựng và kiểm thử thuật giải tiến hóa trên các cá thể đơn giản", để 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:

  • pdfbai_tap_thuc_hanh_mon_cac_mau_thiet_ke_huong_doi_tuong_bai_t.pdf