الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

graph

بدأه شرهان في 23 يونيو 2011 · 5 رد · 894 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمه الله وبركاته

اولاً اشكركم علي هذا الموقع المتميز والجميل والذي يساعد علي تطوير مهارات البرمجه بالطريقه الصحيحه

لقد بحثت فى المنتدي عن موضوع graph المتخصص بالجافا ولم اجد عنه اي شىء وانا كنت فعلا احتاج شرح عنه ولكن لم اجده وان شاء الله سوف اطرح موضوع شرح مفصل عنه فيما بعد لكي يستفيد الاخرون

المشكله عندي هي فى البرمجه اما الفهم وكيف يتم رسم ال graph وكيف يتم تحديد الابناء وكل هذا فقد فهمته ولكني لم استطيع ان ابداء بالبرمجه

فمثلا

       public void addEdge(Node startnode, Node endnode, int weight) {
		if (startnode != null && endnode != null) {

			// only add edges between nodes which are already part of this graph 
			if(nodes.values().contains(startnode) && nodes.values().contains(endnode)){
				startnode.addEdge(endnode, weight);
			}

		}
	}


	public void addEdge(int startnode, int endnode, int weight) {
		addEdge(nodes.get(startnode), nodes.get(endnode), weight);
	}


	public Node addNode() {
		Node newOne = null;

		int newId = nodes.size();
		newOne = new Node(newId);
		nodes.put(newId, newOne);

		return newOne;
	}


	public int getWeight(Node startnode, Node endnode) {
		if (startnode != null && endnode != null) {
			if(nodes.values().contains(startnode) && nodes.values().contains(endnode)){
				return startnode.getWeight(endnode);
			}
		}
		return Graph.WEIGHT_NO_EDGE;
	}

	public int getWeight(int startnode, int endnode) {
		return getWeight(nodes.get(startnode), nodes.get(endnode));
	}

	public List<Node> getNodes() {
		return new ArrayList<Node>(nodes.values());
	}

هذا الاكواد افهمها واعرفها جيدا لانها نفس محتوي الاشجار وال List وهو نوعا ما واضح

ولكن الان ينقصني ان افحص

اذا ماكان هناك بين Node واخري Edge او لا بالمعني هل يوجد شىء يصل بينهم الاثنين

واريد ايضا انا اعطي البرنامج Node ويعطيني جميع الابناء الذي هو متصل بهم بطريقه مباشره

      public List<Node> getAdjacentNodes(Node startnode) {
		List<Node> nodes = null;
		// فهنا مثلا لا اعرف هل يجب عليا استخدام list وايضا اقوم بعمل for لكي امر علي جميع الابناء او كيف اريد فقط توضيح للبدايه وعندها سوف افهم كيف يجب عليا ان اكمل الكود 
		return nodes;
	}


	public boolean isConnected(Node startnode, Node endnode) {
		// هنا لا اعرف كيف افحص هل هم متصلين او لا ؟ فكرت فى عمل طريقه تسمي EdgeTo لكي تفحص هل هم متصلين او لا ولكن لا اعرف ما استخدم هل List او ماذا 
		return false;
	}

	public boolean isConnected(int startNodeID, int endNodeID) {
		return isConnected(nodes.get(startNodeID), nodes.get(endNodeID));
	}

	/**
	 * resets the state of all nodes and edges to white
	 */
	public void clearMarks() {
		for (Node nextNode : nodes.values()) {
			nextNode.status = Node.WHITE;
			for (Edge nextEdge : nextNode.getIncidentEdges()) {
				nextEdge.status = Edge.WHITE;
			}
		}
	}

واتمني الافاده بشرح لكي افهم ماهو المطلوب ^_^ لا اريد كود فقط وانما شرح لكي استفيد

شكرا لكم

الايمان يماني والحكمهـ يمانيهـ

#2

اولا بالنسبة لمسألة الadjacent node ماهو شرط التجاور حسب ما اخذت في هيكلة البيانات؟

ثانيا في الدالة isconnected اعتقد ان الشرط هو ان يكون الnode النهائة يشير الى node البداية ، بمعني اخر قارن بين الreference الذي يشير اليه الend وانظر ماذا كان مساوي القيمة start reference

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#3

اخر ماتوصلت اليه واعتقد انهو صحيح ولكني بقي لي البحث فى القراف بشكل queue وايضا عن طريق stack

         public List<Node> getAdjacentNodes(Node startnode) {
		List<Node> nodes = null;
		if (startnode!= null && this.nodes.values().contains(startnode)){

			List<Edge> edges = this.nodes.get(startnode.getID()).getIncidentEdges();

			for (int i = 0 ; i < edges.size() ; i++ ){
				nodes = new LinkedList<Node>();
				nodes.add(edges.get(i).endnode);
			}

		}
		return nodes;
	}


	public boolean isConnected(Node startnode, Node endnode) {
		if ((startnode!= null || endnode!= null )&& this.nodes.values().contains(endnode)&&this.nodes.values().contains(startnode)){
		List<Node> nodes = this.getAdjacentNodes(startnode);	
		return nodes.contains(endnode) ; 
		}
		return  false ;
	}

هذه هي

   public List<Node> breadthFirstSearch(int nodeID) {
		return breadthFirstSearch(nodes.get(nodeID));
	}

	public List<Node> breadthFirstSearch(Node startNode){
		LinkedList<Node> nodeList = null;
		resetState();
		if(startNode == null)return null ; 

		List<Node> nodes1 =   this.getAdjacentNodes(startNode);
		startNode.status = 2 ; // start node is Black . 
		for (int i = 0 ; i< nodes1.size() ; i ++ ){
			nodes1.get(i).status = 1 ;
// هنااااااا			
		}



		return nodeList;
	}

	public List<Node> depthFirstSearch(int nodeID) {
		return depthFirstSearch(nodes.get(nodeID));
	}

	public List<Node> depthFirstSearch(Node startNode){
		LinkedList<Node> nodeList = null;
		resetState();
		// هنااااااا



		return nodeList;

	}

الايمان يماني والحكمهـ يمانيهـ

#4

لماذا تقوم بعمل ليسته جديده في كل لوب

for (int i = 0 ; i < edges.size() ; i++ ){
                                nodes = new LinkedList<Node>();
                                nodes.add(edges.get(i).endnode);
                        }

هل تعني

  nodes = new LinkedList<Node>();
for (int i = 0 ; i < edges.size() ; i++ ){
                                                             nodes.add(edges.get(i).endnode);
                        }

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#5

هذا كان غلطي ولكني لم الاحظه شكراااا لك ^_^ الف شكر الان خصلت عمل الكود يمكنك التعقيب عليه ^_^ واذا فيه اخطاء يمكنك التصحيح لي

             
	public List<Node> getAdjacentNodes(Node startnode) {

		List<Node> nodes = null;
		if(startnode==null)return null ; 
		if ( this.nodes!=null&& this.nodes.values().contains(startnode) ){	
			List<Edge> edges = this.nodes.get(startnode.getID()).getIncidentEdges();
			nodes = new LinkedList<Node>();
			for (int i = 0 ; i < edges.size() ; i++ ){		
				nodes.add(edges.get(i).endnode);
			}

		}
		return nodes;
	}


	public boolean isConnected(Node startnode, Node endnode) {
		List<Node> nodes = this.getAdjacentNodes(startnode);
		if (nodes == null){return false ;} 
		return nodes.contains(endnode) ; 
	}

الايمان يماني والحكمهـ يمانيهـ

#6

اذا كان الكلاس Node كلاس خاص بك انت ، اشك ان البرنامج سوف يعمل وهذا لانك لم تقوم بعمل overriding للدالة equals

بالطبع عليك الالتزام ببروتوكول الدالة symmetry, reflexiveness, transitivity, ..

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

مواضيع مشابهة