Tuesday, July 3, 2018

مشروع التخرج ..زر الإقلاع من الحياة الجامعية إلى الحياة العملية

السلام عليكم ورحمة الله وبركاته ..
دلوقتي يا شباب اغلبكم بيسأل عن مشاريع التخرج والأفكار وعن إزاي يبدأ مشروع التخرج بتاعه وإزاي يكون تيم ...أسئلة كتيرة وهحاول هنا أشاركم ببعض النقاط اللي أنا شايفاها مفيدة في الموضوع ده ...

1- ما تدخلش تيم عشان إنتوا أصدقاء ...لأن بنسبة كبيرة بتحصل مشاكل كتير خلال ضغط الشغل وساعات فعلا بتخسروا بعض . فلما تدخل تيم لازم تكون عارف ايه الإضافة اللي حضرتك هتضيفها للجروب ده من خلال مهاراتك وطريقة تفكيرك مش تكون عالة عليهم .
2- مشروع التخرج غالبا هوة زر الإقلاع من مرحلة الحياة الجامعية إلى مرحلة الحياة العملية ..غالبا أكتر حاجة هتتسأل عليها في أي مقابلة أو منحة أو في أي وظيفة وبالتالي إبذل قصار جهدك إنه يكون أفضل مرآة ليك بعد التخرج .
3- إعتبر مشروع التخرج وفريقك هو أول بداية حقيقة لفكرة شركة ناشئة صغيرة  ..وكم من شركات كبرى في صناعة التكنولوجيا العالمية بدأت بأفكار مشاريع تخرج صغيرة ثم نمت إلى أن أصبحت شركات رائدة في مجال تكنولوجيا المعلومات وصناعة البرمجيات ..
4-حاول تتعلم مبادئ العمل الجماعي وتنظيم الوقت وحل الخلافات وتنظيم العمل في ظل قيود وضغوطات أخرى قد تؤثر سلبا على الفريق.لو قدرت إنك تحقق الموازنة دي وفي ظل وجود مواد أكاديمية أخرى مع مشروع التخرج وتطلع بمشروع تخرج ناجح ومحترم وفريق متعاون فأنا أؤكد لك أنك قادر على الإنضمام لأي شركة بعد الحياة الأكاديمية ..
5- خلي هدفك إنك تعمل مشروع تخرج غير تقليدي بمعنى إنه يحاول يحل مشكلة تقليدية في المجتمع ولكن بأسلوب يعتمد على الإبداع والإبتكار في التفكير ومش شرط يكون بأسلوب معقد في التفكير أوإستخدام خوارزميات معقدة  ..بل من الممكن أن يكون الحل تحت أقدامنا ولكننا نتطلع فقط للسماء ..
6- لا تعيد صناعة العجلة ..كم من مشاريع تخرج إبتدت من نفس النقطة وإنتهت عند نفس النقطة ..لماذا لا تذهب إلى المكتبة تلقي نظرة على أفكار مشاريع التخرج السابقة وتحاول التواصل مع أفرادها معرفة آخر ما توصلوا إليه ومن ثم تبدأ من حيث إنتهى الآخرون
7- حضور مناقشات مشاريع التخرج لجميع الأقسام في الكلية وكلية الهندسة للتعرف على نمط المشاريع  المشاركة ولأخذ خبرة عامة عن التجربة ككل ومعرفة الأفكار المطروحة وطريقة المناقشة وربما تساعدك في إيجاد أفكار إسثنائية بديلة لحل مشاكلهم .
8- مشروع التخرج الفرصة الأكاديمية الحقيقية الوحيدة لكي تتعلم ولكن بإختيارك أنت  وليس بما يضعه الآخرون لك فإغتنم هذه الفرصة ..لست مجبر على مشروع معين ..أنت وفريقك وحدكم من تقررون الفكرة ..بمساندة المشرف ..
9- أغلب مشاريع التخرج تخفق إخفاقا شنيعا في عمل
Project Proposal, Project Documentation (System Documentation, Code Documentation & User Manual), Project Presentation
رغم أنها الأساسيات والمبادئ  التي تمت مناقشتها بإستفاضة في مادة هندسة البرمجيات  أكثر من مرة  ولكن دائما ننتهي عند نفس الأسئلة ؟ البربوزل هيكون فيه ايه ؟ طب توثيق المشروع هنعمله إزاي ؟ طب لما نيجي نعرض مشروعنا قدام اللجنة هنتكلم عنه إزاي ؟
10 - في رأيي المتواضع  لازم  يكون قدامك هدف إنك تدخل مسابقة بمشروع التخرج بتاعك وإنك تدور على المسابقات المتاحة في كل سنة لمشاريع التخرج زي مسابقة كأس التخيل ومسابقات الشركات الناشئة ومسابقات شركة إنتل أو أي مسابقات تانية تقدر تسأل عنها يا في الكلية أو الجامعة أو على مستوى الجامعات المصرية أو على مستوى العالم ..في رأيي حتى لو يكفيك شرف المحاولة فإنته بتتعلم ولازم يكون طموحك دولي ومحلي وعالمي ومش صعب  على فكرة وحتى الطلبات اللي بتنطلب في الأول هتعلمك إزاي تعرض فكرتك بأسلوب شيق وإزاي تبيع فكرتك للمستهلك وإزاي تفكر بشكل مختلف ..بس أول خطوة  هية اللي هتكون صعبة والباقي إن شاء الله هيكون سهل وتذكر دائما طريق الألف ميل يبدأ بخطوة ..
11- حاول أن تحصل على دعم لمشروعك من خلال الشركات والهيئات الحكومية والخاصة الداعمة لمشاريع التخرج ..مش صعب على فكرة وهتتعلم إزاي تكتب
Project Grant Proposal   وهتفرق لما تيجي تتكلم عن مشروعك وتقول انه حاصل على دعم من شركة كذا وشركة كذا ..
12- بلاش الأحلام الخيالية وفكرة أنا عايز أعمل مشروع ما إتعملش قبل كده ... شوف الوقت اللي قدامك ..شوف إمكانياتك وإمكانيات فريقك ...إعمل دراسة جدوى مبسطة .. إبدأ بفكرة بسيطة وسهلة وكبرها بدل ما تبدأ بفكرة كبيرة وتصغرها ...
13-

 Believe in yourself, love what you are doing, and only compare yourself to you







Tuesday, March 27, 2012

A* vs Greedy Algorithms

A* visited Nodes on the above Figure in order start>a>b>d>e>Goal

Greedy visited Nodes on the above Figure in order start>a>b>c>Goal

I coded A* and Greedy Algorithms to show the order of visited Nodes on the above figure

Downloaded Link :
                                  http://www.mediafire.com/?9tt7ld7frkjxwy4

Uninformed Search Algorithms (Code Implementation)

v      Breadth First Search (BFS)
v      Uniform Cost Search (UCS)
v      Depth First Search (DFS)
v      Depth Limited Search (DLS)
v      Iterative Deepening Search (IDS)
v      Bidirectional Search (BS)
 
I implemented all of these algorithms to my students during AI sections through 2011,2012
I uploaded my code to help any person wants to learn AI algorithms and to share knowlege among people in the world
 
Downloaded Link:
               http://www.mediafire.com/?hl2cvtp44xm981r

Sunday, March 25, 2012

Informed Search Strategies

Informed Search (Heuristic Search ) use problem specific knowledge beyond the definition of the problem itself
Best First Search use Evaluation Function F(n) for each node as an estimate of desirability
expand most desirable unexpanded node
the node with lowest evaluation is selected for expansion 
measure is based on F(n) function
Note:
h(n)=estimated the cheapest cost from n to goal
g(n)=cost from initial start node to reach n
F(n)=eatimated total cost of path through n to goal
Best First Search can be recognized in two types:
Greedy search (F(n)=h(n))
A* search  (F(n)=g(n)+h(n))


I developed the following code to explain the concept of Best First Search Algorithms

[code]
public static void A_Star(Node1 Start, Node1 Goal, Hashtable h)
        {
            PriorityQueue Fringe = new PriorityQueue();
            List<Node1> RepeatedNode = new List<Node1>();
            double g_Cost = 0.0;
            //double F_Cost = 0.0;
            Start.Fn= 0.0;
            Fringe.Enqueue(Start);
            while(Fringe.Count !=0)
            {
                Node1 Current = (Node1)Fringe.Dequeue();
                Console.WriteLine("Node {0} Visited ", Current.Name);
                if (Current.Name == Goal.Name)
                {
                    Console.WriteLine("Find Goal {0} Path Completed ", Current.Name);
                    break;
                }
                RepeatedNode.Add(Current);
                foreach (Node1 city in Current.Neghibors)
                {
                    if (RepeatedNode.Contains(city))
                    {
                        continue;
                    }
                    g_Cost = city.cost + Current.cost;
                    city.Fn = g_Cost + (double)h[city];
                    Fringe.Enqueue(city);
               
               
                }


           
           
           
           
           
           
            }
       
       
        }[/code]


 

Monday, May 30, 2011

Part VIII : Bidirectional Search

v      Bidirectional Search
public static void Bidirectional_Search(Node Start,Node Goal)
        {
            GetSucc x = new GetSucc();
            ArrayList Children_1 = new ArrayList();
            ArrayList Children_2 = new ArrayList();
            Queue Fringe_IN = new Queue();
            Queue Fringe_GO = new Queue();
            Fringe_IN.Enqueue(Start);
            Fringe_GO.Enqueue(Goal);
            while((Fringe_IN.Count !=0)&&(Fringe_GO.Count!=0))
            {
                Node Parent1 = (Node)Fringe_IN.Dequeue();
                Console.WriteLine("Node {0} Visited ", Parent1.State);
                //Console.ReadKey();
                if ((Parent1.State == Goal.State)||Contain(Fringe_GO,Parent1))
                {
                    Console.WriteLine();
                    Console.WriteLine("Find Goal   " + Parent1.State);
                    break;
                }//end if
                Children_1 = x.GetSussessor(Parent1.State);
                for (int i = 0; i < Children_1.Count; i++)
                {
                    int State = (int)Children_1[i];
                    Node Tem = new Node(State, Parent1);
                    Fringe_IN.Enqueue(Tem);
                }//end for
                Node Parent2 = (Node)Fringe_GO.Dequeue();
                Console.WriteLine("Node {0} Visited ", Parent2.State);
                //Console.ReadKey();
                if ((Parent2.State == Start.State) || Contain(Fringe_IN,Parent2))
                {
                    Console.WriteLine();
                    Console.WriteLine("Find Goal   " + Parent2.State);
                    break;
                }//end if
                Children_2 = x.GetSussessor_Reverse(Parent2.State);
                for (int i = 0; i < Children_2.Count; i++)
                {
                    int State = (int)Children_2[i];
                    Node Tem = new Node(State, Parent2);
                    Fringe_GO.Enqueue(Tem);
                }//end for
            
            
            }//end while
        
        }//End Method
public static bool Contain(Queue Fringe,Node Parent)
        {
            object[] S = new object[Fringe.Count];
            S = Fringe.ToArray();
            for (int i = 0; i < S.Length; i++)
            {
                Node Target = (Node)S[i];
                if (Target.State == Parent.State)
                {
                    return true;
                
                }
            
            }
            return false;
        
        }

Part VII : Iterative Deepening Search

v      Iterative Deepening Search
public static void Iterative_Deepening_Search(Node Start, Node Goal)
        {
            bool Cutt_off = false;
            int depth = 0;
            while(Cutt_off == false)
            {
                Console.WriteLine("Search Goal at Depth {0}",depth);
                Depth_Limited_Search(Start, Goal, depth,ref Cutt_off);
                Console.WriteLine("-----------------------------");
                depth++;
            }
        
        
        }//end method
public static void Depth_Limited_Search(Node Start, Node Goal,int depth_Limite,ref bool Cut_off)
        {
            GetSucc x = new GetSucc();
            ArrayList children = new ArrayList();
            Stack Fringe = new Stack();
            Fringe.Push(Start);
            while (Fringe.Count != 0)
            {
                Node Parent = (Node)Fringe.Pop();
                Console.WriteLine("Node {0} Visited ", Parent.State);
                // Console.ReadKey();
                if (Parent.State == Goal.State)
                {
                    Console.WriteLine();
                    Console.WriteLine("Find Goal   " + Parent.State);
                    Cut_off = true;
                    break;
                }//end if
                if (Parent.depth == depth_Limite)
                {
                    continue;
                }
                else
                {
                    children = x.GetSussessor(Parent.State);
                    for (int i = 0; i < children.Count; i++)
                    {
                        int State = (int)children[i];
                        Node Tem = new Node(State, Parent);
                        Fringe.Push(Tem);
                    }//end for
                }//end else
               
            }//end while
        }//end method

Part VI :Depth Limited Search

v      Depth Limited Search
public static void Depth_Limited_Search(Node Start, Node Goal, int depth_Limite)
        {
            GetSucc x = new GetSucc();
            ArrayList children = new ArrayList();
            Stack Fringe = new Stack();
            Fringe.Push(Start);
            while (Fringe.Count != 0)
            {
                Node Parent = (Node)Fringe.Pop();
                Console.WriteLine("Node {0} Visited ", Parent.State);
                // Console.ReadKey();
                if (Parent.State == Goal.State)
                {
                    Console.WriteLine();
                    Console.WriteLine("Find Goal   " + Parent.State);
                    break;
                }//end if
                if (Parent.depth == depth_Limite)
                {
                    continue;
                }
                else
                {
                    children = x.GetSussessor(Parent.State);
                    for (int i = 0; i < children.Count; i++)
                    {
                        int State = (int)children[i];
                        Node Tem = new Node(State, Parent);
                        Fringe.Push(Tem);
                    }//end for
                }//end else
            }//end while
        }//end method