আমাকে নির্দেশের অ্যাসাইক্লিক গ্রাফটি কী তা সহজ শর্তে কেউ ব্যাখ্যা করতে পারেন? আমি উইকিপিডিয়ায় দেখেছি কিন্তু প্রোগ্রামিংয়ে এটি আমাকে সত্যিকার অর্থে দেখতে দেয় না।
আমাকে নির্দেশের অ্যাসাইক্লিক গ্রাফটি কী তা সহজ শর্তে কেউ ব্যাখ্যা করতে পারেন? আমি উইকিপিডিয়ায় দেখেছি কিন্তু প্রোগ্রামিংয়ে এটি আমাকে সত্যিকার অর্থে দেখতে দেয় না।
উত্তর:
গ্রাফ = কাঠামোটি নোডগুলি সমন্বিত করে, যা একে অপরের সাথে প্রান্তের সাথে সংযুক্ত থাকে
নির্দেশিত = নোডের (প্রান্তগুলির) মধ্যে সংযোগগুলির একটি দিক রয়েছে: এ -> বি বি -> এ এর মতো নয়
এসাইক্লিক = "নন-সার্কুলার" = প্রান্তগুলি অনুসরণ করে নোড থেকে নোডে চলে যাওয়া, আপনি দ্বিতীয় বারের মতো একই নোডের মুখোমুখি হবেন না।
পরিচালিত অ্যাসাইক্লিক গ্রাফের একটি ভাল উদাহরণ একটি গাছ। দ্রষ্টব্য, তবে, নির্দেশিত সমস্ত অ্যাসাইক্লিক গ্রাফ গাছ নয়।
আমি প্রচুর উত্তর দেখতে পাচ্ছি যে ড্যাগের নির্দেশক (অ্যাকাইক্লিক গ্রাফ) নির্দেশ করে তবে এর প্রয়োগগুলিতে কোনও উত্তর নেই। এখানে একটি খুব সাধারণ একটি -
প্রাক-আবশ্যক গ্রাফ - ইঞ্জিনিয়ারিং কোর্সের সময় প্রতিটি শিক্ষার্থী এমন বিষয় বাছাইয়ের মুখোমুখি হয় যা প্রাক-প্রয়োজনীয়তার মতো প্রয়োজনীয়তা অনুসরণ করে। এখন এটি স্পষ্ট হয়ে গেছে যে আপনি অ্যালগরিদম [এ] এর পূর্ব প্রয়োজনীয় কোর্স ছাড়াই আর্টিফিশিয়াল ইন্টেলিজেন্স [বি] তে কোনও ক্লাস নিতে পারবেন না। সুতরাং বি A এর উপর নির্ভর করে বা আরও ভাল শর্তে A এর বি এর দিকে একটি প্রান্ত রয়েছে তাই নোড বিতে পৌঁছানোর জন্য আপনাকে নোড এ যেতে হবে এটি খুব শীঘ্রই পরিষ্কার হয়ে যাবে যে এর পূর্বের প্রয়োজনীয়তা সহ সমস্ত বিষয় একটি গ্রাফে যুক্ত করার পরে। , এটি একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ হিসাবে পরিণত হবে।
যদি কোনও চক্র থাকে তবে আপনি কখনই কোনও কোর্স শেষ করতে পারবেন না: পি
বিশ্ববিদ্যালয়ের একটি সফ্টওয়্যার সিস্টেম যা শিক্ষার্থীদের কোর্সের জন্য নিবন্ধন করতে দেয় তা নোড হিসাবে বিষয়গুলি মডেল করতে পারে তা নিশ্চিত করার জন্য যে শিক্ষার্থী বর্তমান কোর্সে নিবন্ধনের আগে প্রাক-প্রয়োজনীয় কোর্সটি গ্রহণ করেছে।
আমার অধ্যাপক এই সাদৃশ্যটি দিয়েছেন এবং এটি আমাকে জটিল জটিল ধারণা ব্যবহারের চেয়ে ড্যাজি বুঝতে সর্বোত্তমভাবে সহায়তা করেছে!
আর একটি রিয়েল টাইম উদাহরণ -> সংস্করণ সিস্টেমে ড্যাগের কীভাবে ব্যবহার করা যেতে পারে তার রিয়েল টাইম উদাহরণ
প্রোগ্রামিংয়ে নির্দেশিত অ্যাসাইক্লিক গ্রাফের উদাহরণগুলির মধ্যে কম-বেশি যে কোনও কিছু সংযোগ এবং কার্যকারিতা প্রতিনিধিত্ব করে include
উদাহরণস্বরূপ, ধরুন আপনার কাছে এমন একটি গণনা পাইপলাইন রয়েছে যা রানটাইমের সময় কনফিগারযোগ্য। এর একটি উদাহরণ হিসাবে ধরা যাক, এ, বি, সি, ডি, ই, এফ, এবং জি একে অপরের উপর নির্ভর করে: এ সি এর উপর নির্ভর করে, সি ই এবং ফ এর উপর নির্ভরশীল, বি ডি এবং ই এর উপর নির্ভরশীল, এবং ডি নির্ভর করে এফ। এটি একটি ডিএজি হিসাবে উপস্থাপন করা যেতে পারে। আপনার একবার মেমরির ডিএজি হয়ে গেলে, আপনি এখানে অ্যালগোরিদম লিখতে পারেন:
অন্যান্য অনেক কিছুর মধ্যে।
অ্যাপ্লিকেশন প্রোগ্রামিংয়ের ক্ষেত্রের বাইরে, কোনও প্রোগ্রামের উপাদানগুলির যথাযথ বিল্ড অর্ডার নিশ্চিত করতে যে কোনও শালীন অটোমেটেড বিল্ড টুল (মেক, পিঁপড়া, স্ক্যানস ইত্যাদি) ডিএজি ব্যবহার করবে।
বেশ কয়েকটি উত্তরে গ্রাফের ব্যবহারের উদাহরণ দেওয়া হয়েছে (যেমন নেটওয়ার্ক মডেলিং) এবং আপনি "প্রোগ্রামিংয়ের সাথে এর কী আছে?" জিজ্ঞাসা করেছেন।
এই সাব-প্রশ্নের উত্তরটি হ'ল এটির প্রোগ্রামিংয়ের সাথে খুব বেশি কিছু করার নেই। সমস্যা সমাধানের সাথে এটি করতে হবে।
সংযুক্ত-তালিকা যেমন সমস্যার নির্দিষ্ট শ্রেণীর জন্য ডেটা স্ট্রাকচার ব্যবহৃত হয় তেমনি নির্দিষ্ট সম্পর্ককে উপস্থাপনের জন্য গ্রাফগুলি দরকারী। লিঙ্কযুক্ত তালিকাগুলি, গাছগুলি, গ্রাফগুলি এবং অন্যান্য বিমূর্ত কাঠামোগুলি কেবল প্রোগ্রামিংয়ের সাথে একটি সংযোগ রয়েছে যাতে আপনি এগুলি কোডে প্রয়োগ করতে পারেন। এগুলি বিমূর্ততার উচ্চ স্তরে বিদ্যমান। এটি প্রোগ্রামিং সম্পর্কে নয়, এটি সমস্যার সমাধানে ডেটা স্ট্রাকচার প্রয়োগের বিষয়ে।
পরিচালিত অ্যাসাইক্লিক গ্রাফগুলিতে (ডিএজি) নিম্নলিখিত বৈশিষ্ট্য রয়েছে যা এগুলি অন্যান্য গ্রাফ থেকে পৃথক করে:
ঠিক আছে, আমি এখনই একটি ব্যবহার সম্পর্কে ভাবতে পারি - ডিএজি ( ওয়েট-ফর গ্রাফ হিসাবে পরিচিত - আরও প্রযুক্তিগত বিশদ ) তারা প্রক্রিয়া এবং সংস্থার একটি সেটগুলির মধ্যে নির্ভরতা চিত্রিত করার কারণে অচল লক সনাক্তকরণে কার্যকর (উভয়ই ডিএজি-র নোড) । কোনও চক্র সনাক্ত হলে ডিডলক ঘটবে।
আমি ধরে নিয়েছি আপনি ইতিমধ্যে বেসিক গ্রাফ পরিভাষা জানেন; অন্যথায় আপনার গ্রাফ তত্ত্ব সম্পর্কিত নিবন্ধ থেকে শুরু করা উচিত ।
নির্দেশ সত্য যে প্রান্ত (সংযোগ) দিকনির্দেশ আছে বোঝায়। চিত্রটিতে, এই দিকগুলি তীরগুলি দ্বারা দেখানো হয়েছে। বিপরীতটি একটি পুনর্নির্দেশিত গ্রাফ, যার প্রান্তটি দিকনির্দেশ নির্দিষ্ট করে না।
Acyclic অর্থ আপনি যদি কোনও যথেচ্ছ নোড এক্স থেকে শুরু করে সমস্ত সম্ভাব্য প্রান্ত দিয়ে চলে যান তবে ইতিমধ্যে ব্যবহৃত প্রান্তে ফিরে না গিয়ে আপনি এক্সে ফিরে যেতে পারবেন না।
বেশ কয়েকটি অ্যাপ্লিকেশন:
একটি ডিএজি হ'ল একটি গ্রাফ যেখানে সমস্ত কিছু একই দিকে প্রবাহিত হয় এবং কোনও নোড নিজেই আবার উল্লেখ করতে পারে না।
পৈতৃক গাছ সম্পর্কে চিন্তা করুন; তারা আসলে ডিএজিএস।
সব ডিএজি আছে
ডিএজিগুলি গাছ থেকে আলাদা। গাছের মতো কাঠামোতে প্রতি দুটি নোডের মধ্যে একটি অনন্য পথ থাকতে হবে। ডিএজিগুলিতে কোনও নোডের দুটি প্যারেন্ট নোড থাকতে পারে।
ডিএজিগুলি সম্পর্কে একটি ভাল নিবন্ধ এখানে । আমি আশা করি এটি সাহায্য করবে.
বিভিন্ন ধরণের বাস্তব-বিশ্ব সম্পর্কের মডেল করতে প্রোগ্রামিংয়ে সমস্ত প্রকারের গ্রাফ ব্যবহার করা হয়। উদাহরণস্বরূপ, একটি সামাজিক নেটওয়ার্ক প্রায়শই একটি গ্রাফ দ্বারা প্রতিনিধিত্ব করা হয় (এই ক্ষেত্রে চক্রযুক্ত)। তেমনি, নেটওয়ার্ক টোপোলজিস, পরিবারের গাছ, বিমান রুট, ...
উত্স কোড বা এমনকি তিনটি ঠিকানা (টিএসি) কোড দৃষ্টিকোণ থেকে আপনি এই পৃষ্ঠায় সমস্যাটি খুব সহজেই কল্পনা করতে পারবেন ...
http://cgm.cs.mcgill.ca/~hagha/topic30/topic30.html#Exptree
আপনি যদি এক্সপ্রেশন ট্রি বিভাগে যান, এবং তারপরে কিছুটা নীচে এটি গাছের "টপোলজিকাল বাছাই", এবং কীভাবে এক্সপ্রেশনকে মূল্যায়ন করবেন তার অ্যালগরিদম দেখায়।
সুতরাং সেই ক্ষেত্রে আপনি অভিব্যক্তিগুলি মূল্যায়নের জন্য ডিএজি ব্যবহার করতে পারেন, যা মূল্যায়ন সাধারণত কার্যকর হয় কারণ এই জাতীয় ড্যাগ মূল্যায়নকারী ব্যবহার করে মূল সূচকগুলিকে দ্রুততর করে তোলে কারণ এটি কোনও স্ট্যাকের দিকে ধাক্কা দেয় না এবং পপিং হয় না এবং কারণ এটি মুছে ফেলা হয় because সাধারণ উপ-এক্সপ্রেশন।
প্রাচীন প্রাচীন ইজিপস্টিয়ান (অর্থাত্ ইংরেজিতে) ডিএজি গণনা করার প্রাথমিক অ্যালগরিদম হ'ল:
1) আপনার ডিএজি অবজেক্টটি তেমন করুন
আপনার একটি লাইভ তালিকা প্রয়োজন এবং এই তালিকায় সমস্ত বর্তমান লাইভ ডিএজি নোড এবং ডিএজি সাব-এক্সপ্রেশন রয়েছে। একটি ডিএজি সাব এক্সপ্রেশন হ'ল একটি ডিএজি নোড, বা আপনি এটিকে অভ্যন্তরীণ নোডও বলতে পারেন। লাইভ ডিএজি নোড বলতে আমি যা বোঝাতে চাইছি তা হ'ল যদি আপনি কোনও ভেরিয়েবল এক্সকে অর্পণ করেন তবে তা লাইভ হয়ে যায়। একটি সাধারণ উপ-এক্সপ্রেশন যা তারপরে এক্স ব্যবহার করে সে উদাহরণটি ব্যবহার করে। যদি এক্সকে আবার নির্ধারিত করা হয় তবে একটি নতুন ড্যাগ নোড তৈরি করা হয় এবং লাইভ তালিকায় যুক্ত করা হয় এবং পুরাতন এক্স মুছে ফেলা হয় যাতে এক্স ব্যবহার করে পরবর্তী উপ-এক্সপ্রেশনটি নতুন উদাহরণটিকে উল্লেখ করবে এবং এইভাবে উপ-এক্সপ্রেশনগুলির সাথে দ্বন্দ্ব করবে না কেবল একই পরিবর্তনশীল নামটি ব্যবহার করুন।
একবার আপনি কোনও ভেরিয়েবল এক্সকে অর্পণ করার পরে, ঘটনাক্রমে অ্যাসাইনমেন্টের পয়েন্টে লাইভ থাকা সমস্ত ড্যাগ উপ-এক্সপ্রেশন নোডগুলি লাইভ হয় না, কারণ নতুন অ্যাসাইনমেন্টটি পুরানো মানটি ব্যবহার করে সাব এক্সপ্রেশনগুলির অর্থ অবৈধ করে দেয়।
class Dag {
TList LiveList;
DagNode Root;
}
// In your DagNode you need a way to refer to the original things that
// the DAG is computed from. In this case I just assume an integer index
// into the list of variables and also an integer index for the opertor for
// Nodes that refer to operators. Obviously you can create sub-classes for
// different kinds of Dag Nodes.
class DagNode {
int Variable;
int Operator;// You can also use a class
DagNode Left;
DagNode Right;
DagNodeList Parents;
}
সুতরাং আপনি যা করছেন তা আপনার নিজের কোডে আপনার গাছের মধ্য দিয়ে চলছেন যেমন উদাহরণস্বরূপ উত্স কোডে প্রকাশের গাছ। উদাহরণস্বরূপ বিদ্যমান নোডগুলি এক্সনোডে কল করুন।
সুতরাং প্রতিটি এক্সনোডের জন্য আপনাকে এটি কীভাবে ডিএজে যুক্ত করতে হবে তা সিদ্ধান্ত নেওয়া দরকার এবং এটি ইতিমধ্যে ডাগে থাকার সম্ভাবনা রয়েছে।
এটি খুব সাধারণ সিউডো কোড। সংকলনের উদ্দেশ্যে নয়।
DagNode XNode::GetDagNode(Dag dag) {
if (XNode.IsAssignment) {
// The assignment is a special case. A common sub expression is not
// formed by the assignment since it creates a new value.
// Evaluate the right hand side like normal
XNode.RightXNode.GetDagNode();
// And now take the variable being assigned to out of the current live list
dag.RemoveDagNodeForVariable(XNode.VariableBeingAssigned);
// Also remove all DAG sub expressions using the variable - since the new value
// makes them redundant
dag.RemoveDagExpressionsUsingVariable(XNode.VariableBeingAssigned);
// Then make a new variable in the live list in the dag, so that references to
// the variable later on will see the new dag node instead.
dag.AddDagNodeForVariable(XNode.VariableBeingAssigned);
}
else if (XNode.IsVariable) {
// A variable node has no child nodes, so you can just proces it directly
DagNode n = dag.GetDagNodeForVariable(XNode.Variable));
if (n) XNode.DagNode = n;
else {
XNode.DagNode = dag.CreateDagNodeForVariable(XNode.Variable);
}
return XNode.DagNode;
}
else if (XNode.IsOperator) {
DagNode leftDagNode = XNode.LeftXNode.GetDagNode(dag);
DagNode rightDagNode = XNode.RightXNode.GetDagNode(dag);
// Here you can observe how supplying the operator id and both operands that it
// looks in the Dags live list to check if this expression is already there. If
// it is then it returns it and that is how a common sub-expression is formed.
// This is called an internal node.
XNode.DagNode =
dag.GetOrCreateDagNodeForOperator(XNode.Operator,leftDagNode,RightDagNode) );
return XNode.DagNode;
}
}
সুতরাং এটি দেখার এক উপায়। গাছের একটি মৌলিক পদচারণা এবং ড্যাগ নোডগুলি যাবার সাথে যুক্ত করা এবং উল্লেখ করা। উদাহরণস্বরূপ গাছের মূলটি ডাগনোড যা দেয় তা ডাগের মূল।
স্পষ্টতই উদাহরণ পদ্ধতিটি ছোট ছোট ভাগে বিভক্ত হয়ে ভার্চুয়াল ফাংশন সহ উপ-শ্রেণি হিসাবে তৈরি করা যেতে পারে।
ড্যাগকে বাছাই করার জন্য, আপনি প্রতিটি ড্যাগনোড বাম থেকে ডানে যেতে পারেন। অন্য কথায় ডাগনোডগুলি বাম হাতের প্রান্তটি এবং তারপরে ডান হাতের প্রান্তটি অনুসরণ করুন। বিপরীতে সংখ্যা নির্ধারিত হয়। অন্য কথায় আপনি যখন বাচ্চাবিহীন কোনও ডাগনোডে পৌঁছান, সেই নোডকে বর্তমান বাছাই করা নম্বরটি এবং ক্রম সংখ্যা বাড়িয়ে দিন, যাতে পুনরাবৃত্তি সংখ্যাটি আনইন্ডাইন্ডস হিসাবে ক্রমবর্ধমান ক্রমে নির্ধারিত হয়।
এই উদাহরণটি কেবল নোডের সাথে গাছগুলি পরিচালনা করে যার শূন্য বা দুটি শিশু রয়েছে। স্পষ্টতই কিছু গাছে দুটিরও বেশি বাচ্চার সাথে নোড থাকে তাই যুক্তিটি এখনও একই। বাম এবং ডান গণনার পরিবর্তে, বাম থেকে ডানে ইত্যাদি গণনা করুন ...
// Most basic DAG topological ordering example.
void DagNode::OrderDAG(int* counter) {
if (this->AlreadyCounted) return;
// Count from left to right
for x = 0 to this->Children.Count-1
this->Children[x].OrderDag(counter)
// And finally number the DAG Node here after all
// the children have been numbered
this->DAGOrder = *counter;
// Increment the counter so the caller gets a higher number
*counter = *counter + 1;
// Mark as processed so will count again
this->AlreadyCounted = TRUE;
}
আপনি যদি জানেন যে প্রোগ্রামিংয়ে গাছগুলি কীভাবে থাকে তবে প্রোগ্রামিংয়ে ড্যাগগুলি একই রকম তবে তারা নোডকে একাধিক পিতামাতাকে রাখার অনুমতি দেয়। আপনি যখন কোনও নোডকে কেবলমাত্র একক পিতা-মাতার অধীনে রেখে দিতে চান তবে এটি সহজ হতে পারে, তবুও চক্র সহ একটি সাধারণ গ্রাফের গিঁটানো জঞ্জালের সমস্যা নেই। আপনি এখনও কোনও ডিএজি সহজেই নেভিগেট করতে পারেন তবে মূলটিতে ফিরে আসার একাধিক উপায় রয়েছে (কারণ একাধিক পিতামাতার থাকতে পারে)। একটি সিএজিএইজে সাধারণত একাধিক শিকড় থাকতে পারে তবে বাস্তবে গাছের মতো একটি শিকড় দিয়ে লেগে থাকাই ভাল। আপনি যদি ওওপিতে একক বনাম একাধিক উত্তরাধিকার বুঝতে পারেন তবে আপনি গাছ বনাম ডিএজি জানেন। আমি ইতিমধ্যে এখানে উত্তর ।
নামটি আপনাকে তার সংজ্ঞাটি সম্পর্কে যা জানা দরকার সেগুলির বেশিরভাগটি আপনাকে বলে: এটি এমন একটি গ্রাফ যেখানে প্রতি প্রান্তটি কেবল এক দিকে প্রবাহিত হয় এবং একবার আপনি একটি প্রান্তটি ক্রল করে ফেললে আপনার পথটি আপনাকে কেবল যে বাকী প্রান্তে ফেলেছিল তা কখনই আপনাকে ফিরিয়ে আনবে না।
আমি সমস্ত ব্যবহারের সাথে কথা বলতে পারি না (উইকিপিডিয়া সেখানে সহায়তা করে) তবে সংস্থানগুলির মধ্যে নির্ভরতা নির্ধারণ করার সময় আমার জন্য ডিএজিগুলি অত্যন্ত কার্যকর। উদাহরণস্বরূপ আমার গেম ইঞ্জিনটি সমস্ত লোড হওয়া সংস্থান (উপকরণ, টেক্সচার, শেডার, প্লেটেক্সট, পার্সড জসন ইত্যাদি) একক ডিএজি হিসাবে উপস্থাপন করে। উদাহরণ:
একটি উপাদান হ'ল এন জিএল প্রোগ্রামগুলি, যার প্রতিটিটির জন্য দুটি ছায়াছবি প্রয়োজন, এবং প্রতিটি শেডারের একটি প্লেটেক্সট শেডারের উত্স প্রয়োজন। এই সংস্থানগুলিকে একটি ডিএজি হিসাবে উপস্থাপন করে, সদৃশ লোডগুলি এড়াতে আমি বিদ্যমান উত্সগুলির জন্য গ্রাফটি সহজেই জিজ্ঞাসা করতে পারি। বলুন আপনি একই উত্স কোড সহ ভার্টেক্স শ্যাডার ব্যবহার করতে বেশ কয়েকটি উপকরণ চান। আপনি যখন বিদ্যমান সংস্থানটিতে কেবল একটি নতুন প্রান্ত স্থাপন করতে পারেন তবে উত্সটি পুনরায় লোড করা এবং প্রতিটি ব্যবহারের জন্য শেডারগুলি পুনরায় সংকলন করা অপব্যয়। এই উপায়ে আপনি গ্রাফটি নির্ধারণ করতে ব্যবহার করতে পারেন যে কোনও কিছু কোনও সংস্থার উপর নির্ভর করে কি না, এবং যদি না হয়, এটি মুছুন এবং এর স্মৃতি মুক্ত করুন, বাস্তবে এটি বেশ কিছুটা স্বয়ংক্রিয়ভাবে ঘটে।
এক্সটেনশনের মাধ্যমে, ড্যাগগুলি ডেটা প্রসেসিং পাইপলাইনগুলি প্রকাশের জন্য দরকারী। অ্যাসাইক্লিক প্রকৃতির অর্থ আপনি নিরাপদে প্রাসঙ্গিক প্রসেসিং কোডটি লিখতে পারেন যা একই প্রান্তের পুনরায় পুনর্বিবেচনা না করে কোনও ভার্টেক্স থেকে প্রান্তগুলি নীচে অনুসরণ করতে পারে। ভিভিভিভি , ম্যাক্স এমএসপি বা অটোডেস্ক মায়ার নোড-ভিত্তিক ইন্টারফেসগুলির মতো ভিজ্যুয়াল প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি সমস্ত ডিএজি-র উপর নির্ভর করে।
আপনি যখন প্রতিনিধিত্ব করতে চান তখন একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ কার্যকর হয় ... একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ! ক্যানোনিকাল উদাহরণটি একটি পারিবারিক গাছ বা বংশবৃত্ত।