في 06 نوفمبر 2008 12:44 م، غمغم ahmed ezz باستغراب قائلاً:
لايجاد المسار بين نقطتين يمكننا استخدام خوارزميات عديدة اكثرها انتشارا ومرونة هو ال *Aبتاريخ 06 نوفمبر 2008 12:44 م، قطب ahmed ezz حاجبيه بشدة وهو يقول:
لكن هناك خوارزم سمعت عنه وهو Floyd وبالبحث عنه وجدت انه يقوم بايجاد اقصر طريق بين كل نقطتين موجودتين في Graph او Gridinitial matrix:-
A B C D E
A 0 10 oo 5 oo
B 10 0 5 5 10
C oo 5 0 oo oo
D 5 5 oo 0 20
E oo 10 oo 20 0
ملاحظة : للتوضيح فقط لقد وضعت القيمة oo وتعني ما لا نهاية في حالة لم يوجد وصلة بين اي two nodesiteration no. 1
A B C D E
A 0 10 15 5 20
changes in C - E
هنا نضع ال node المراد العمل عليها في ال iteration الحالية علي هيئة صف وقيمه مأخوذة من ال initial matrixinitial matrix:-
A B C D E
A 0 10 oo 5 oo
B 10 0 5 5 10
C oo 5 0 oo oo
D 5 5 oo 0 20
E oo 10 oo 20 0
iteration no. 1
A B C D E
A 0 10 15 5 20
changes in C - E
iteration no. 2
A B C D E
B 10 0 5 5 10
changes in (no changes)
iteration no. 3
A B C D E
C 15 5 0 10 15
changes in A - D - E
iteration no. 4
A B C D E
D 5 5 10 0 15
changes in C - E
iteration no. 5
A B C D E
E 20 10 15 15 0
changes in A - C - D
so the final matrix is
A B C D E
A 0 10 15 5 20
B 10 0 5 5 10
C 15 5 0 10 15
D 5 5 10 0 15
E 20 10 15 15 0
This is the actual algorithm:
# dist(i,j) is "best" distance so far from vertex i to vertex j
# Start with all single edge paths.
For i = 1 to n do
For j = 1 to n do
dist(i,j) = weight(i,j)
For k = 1 to n do # k is the `intermediate' vertex
For i = 1 to n do
For j = 1 to n do
if (dist(i,k) + dist(k,j) < dist(i,j)) then # shorter path?
dist(i,j) = dist(i,k) + dist(k,j)
#include
int n; /* Then number of nodes */
int dist[16][16]; /* dist[i][j] is the length of the edge between i and j if
it exists, or 0 if it does not */
void printDist() {
int i, j;
printf(" ");
for (i = 0; i < n; ++i)
printf("%4c", 'A' + i);
printf("\n");
for (i = 0; i < n; ++i) {
printf("%4c", 'A' + i);
for (j = 0; j < n; ++j)
printf("%4d", dist[i][j]);
printf("\n");
}
printf("\n");
}
/*
floyd_warshall()
after calling this function dist[i][j] will the the minimum distance
between i and j if it exists (i.e. if there's a path between i and j)
or 0, otherwise
*/
void floyd_warshall() {
int i, j, k;
for (k = 0; k < n; ++k) {
printDist();
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j)
/* If i and j are different nodes and if
the paths between i and k and between
k and j exist, do */
if ((dist[i][k] * dist[k][j] != 0) && (i != j))
/* See if you can't get a shorter path
between i and j by interspacing
k somewhere along the current
path */
if ((dist[i][k] + dist[k][j] < dist[i][j]) ||
(dist[i][j] == 0))
dist[i][j] = dist[i][k] + dist[k][j];
}
printDist();
}
int main(int argc, char *argv[]) {
FILE *fin = fopen("dist.txt", "r");
fscanf(fin, "%d", &n);
int i, j;
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j)
fscanf(fin, "%d", &dist[i][j]);
fclose(fin);
floyd_warshall();
return 0;
}
initial route matrix:-
A B C D E
A 1 2 3 4 5
B 1 2 3 4 5
C 1 2 3 4 5
D 1 2 3 4 5
E 1 2 3 4 5
iteration no. 1
A B C D E
A 0 10 15 5 20
changes in C - E
لاحظ ان التغير هنا في حالة ال E مثلا حيث ان المسار من A to E مباشرة لا يمكن الا انه يمكننا ذلك باعتبار ان ال node الوسيطة Bvoid printShortestPathBetween(char i, char j)
{
cout << "the shortest path between " << i << " and " << j << " is:\n";
/*
if from A to E through B
then A = i
and E = j
and k = B
*/
char currentNode = i; // 'A'
int indexJ = (int)j-'A';
while(currentNode != j)
{
cout << currentNode << " ";
int indexI = (int)currentNode-'A';
currentNode = route[indexI][indexJ];
}
cout << j << "\n\n";
}
حيث هنا نقوم بتتبع المسار بدءا من نقطة البداية مرورا بكل النقط الوسيطةفي 07 نوفمبر 2008 03:52 ص، قال ahmed ezz بهدوء وتؤدة:
في انتظار شرح حضرتك لطريقة استخراج المسار من طريقة Floydفي 07 نوفمبر 2008 03:52 ص، عقد ahmed ezz حاجبيه بتفكير وقال:
بصراحة طريقة ال Dynamic Programming والشرح الذي حضرتك ذكرته درسناه في الكلية في السنة الثالثة وكانت الدراسة بالفعل تتعلق ببحوث العملياتوفي 07 نوفمبر 2008 03:52 ص، قال ahmed ezz متحمساً:
الدكتور المشرف علي مشروع تخرجي طلب مننا ان نقوم بعمل برنامج بسيط يقوم بمقارنةوفي 07 نوفمبر 2008 03:52 ص، ظهر شبح ابتسامة على وجه ahmed ezz وهو يقول:
كنت قرأت ايضا عن بحث حديث حول استخدام ال HPA* او ال Hierarchal PathFinding using A* وذلك بعمل وتطبيق ال path finding عليبتاريخ 07 نوفمبر 2008 11:30 م، قطب همام البهنسي حاجبيه بشدة وهو يقول:
فيوفي 07 نوفمبر 2008 11:30 م، أعرب همام البهنسي عن رأيه بالموقف كالآتي:
حصلت على البحث، سأقوم بمراجعته والمشاركة بأي تفاصيل ذات أهمية حول هذا الموضوع...وفي 21 نوفمبر 2008 05:08 م، قال ahmed ezz متحمساً:
يبدوا ان هذا الموضوع سيكون اكثر من مجرد سؤال عن خوارزم فلويد 😄 😄وفي 21 نوفمبر 2008 05:08 م، ظهر شبح ابتسامة على وجه ahmed ezz وهو يقول:
لان الطريقة المذكورة في معظم المقالات لا تراعي حالة ال multi-cost nodesوفي 22 نوفمبر 2008 07:07 ص، ظهر شبح ابتسامة على وجه همام البهنسي وهو يقول:
بالنسبة لنقاش بقية المواضيع المطروحة سأخصص لها ردود لاحقة أن شاء الله.أما في 22 نوفمبر 2008 07:07 ص، فقد تنهد همام البهنسي بارتياح وهو يرد:
أخي الكريم، لا أدري ماذا تقصد بحالة multi-cost nodes في الـ A*؟؟؟ عادة عند القيام بتطبيق خوارزميات البحث ضمن أي Graph او حتى Grids تكون الأوزان (Costs) على الأضلاع الواصلة بين العقد وليست على العقد نفسهاوفي 22 نوفمبر 2008 05:44 ص، أعرب ahmed ezz عن رأيه بالموقف كالآتي:
انا في الانتظار علي احر من الجمر - وجزاك الله خيرا علي المجهود وسرعة الرد