PDA

View Full Version : Trí Tuệ Nhân Tạo [help]



vanvu1310
12-09-2010, 17:03
Bác nào pro về cái này chỉ mình với
_Đây là file data của mình
9//số đỉnh
A B C D E F G H Z //tên các dỉnh
10 8 6 8 7 7 4 2 0 // chi phí ước lượng của mỗi đỉnh
0//đỉnh đầu
8// đích
11//số cạnh
0 1 1 //từ đỉnh 0-> đỉnh 1 có đọ dài là 1
0 2 4
0 3 5
1 2 2
1 5 3
2 6 3
5 6 3
3 4 5
3 7 3
7 8 2
6 7 3
_Đây là code của mình :
const int vc = -9999;
int so_dinh, so_canh, ddau, dcuoi;
string[] dinh;
string[] temp;
int[] chiphi_ul;
int[,] canh;
string text;
int i, j;
StreamReader input = File.OpenText(@"C:\data.txt");
text = input.ReadLine();
so_dinh = int.Parse(text);

text = input.ReadLine();
dinh = new string[so_dinh];
dinh = text.Split(new char[] { '\t' });


text = input.ReadLine();
temp = new string[so_dinh];
temp = text.Split(new char[] { '\t' });
chiphi_ul = new int[so_dinh];
for (i = 0; i < so_dinh; i++)
{
chiphi_ul[i] = int.Parse(temp[i]);
}


text = input.ReadLine();
ddau = int.Parse(text);

text = input.ReadLine();
dcuoi = int.Parse(text);

text = input.ReadLine();
so_canh = int.Parse(text);

//Khoi tao ma tran cạnh

canh = new int[so_dinh, so_dinh];
for (i = 0; i < so_dinh; i++)
for (j = 0; j < so_dinh; j++)
if (i == j)
canh[i, j] = 0;
else
canh[i, j] = vc;

//Doc cac canh
string[] tam = new string[3];
for (i = 0; i < so_canh; i++)
{
text = input.ReadLine();
tam = text.Split(new char[] { '\t' });
//đưa giá trị vào ma trận cạnh
canh[int.Parse(tam[0]), int.Parse(tam[1])] = int.Parse(tam[2]);
}

//Xuất thừ ma trận cạnh
for (i = 0; i < so_dinh; i++)
{
Console.WriteLine();
for (j = 0; j < so_dinh; j++)
Console.Write(canh[i, j] + "\t");
}
Console.WriteLine();
Console.ReadLine();
int[] NSL = new int[so_dinh];//danh sach cac dinh ke tiep cua dinh hien tai
int[] SL = new int[so_dinh];//danh sach chua cac dinh da di qua
int[] D = new int[so_dinh];//danh sach chua do dai cac canh tinh tu diem hien tai toi cac diem co lien quan
int ti = ddau;
int stop = -1;
int better = 0;
int k = 0;
for (i = 1; i < so_dinh; i++)
{
if (canh[ddau, i] > 0)
{
NSL[k] = i;
k++;
D[i] = canh[ddau, i];
SL[i] = ddau;
}
}
while (stop == -1)
{
if (ti == dcuoi)
{
stop = 1;
Console.ReadLine("tim được đường đi");
}
else
{
while (better == 0 || stop == -1)
{
int tk = NSL[0];
int min = chiphi_ul[tk];
for (i = 1; i < k; i++)
{
if (chiphi_ul[ti] > min)
{
tk = NSL[i];
min = D[tk];
}
}
ti = tk;
k = 0;
for (i = 1; i <= so_dinh - 1; i++)
{
if (canh[ti, i] > 0)
{
SL[i] = ti;
NSL[k] = i;
k++;
D[i] = D[ti] + canh[ti, i];
}
}

}
}
}
mục đích của mình là tìm đường đi từ đỉnh tới điểm goal khi xet qua các đỉnh kế tiếp có quan hệ với đỉnh bắt đầu ta dựa vào chi phí ước lượng VD:
A đi đến Z ,A có thể đi qua 3 đỉnh là B,C,D duyệt theo thứ tự A,B,C,D,E,F... mới vô đi vào B nếu chi phí ước lượng của B<A thì ta đi luôn ko cần xet 2 điểm C,D cứ thế tiếp tục cho tới khi nào gặp đích thì báo về đường đi

ueih
18-10-2010, 17:30
tên các đỉnh là a, b, v, ...
nhưng từ đỉnh o tới 1????
chỉ nên trình bày phần giãi thuật thôi, ghi tràn dang đại hải đọc qu1a nhứt đầu