java, جاوا, گراف در جاوا

رابط برنامه نویسی گراف وزندار (Edge Weighted Graph)

رابط برنامه نویسی گراف وزندار

در این قسمت تیم کدگیت را با آموزش رابط برنامه نویسی گراف وزندار همراهی کنید. پیش نیاز این آموزش شامل موارد زیر است:

  1. آشنایی با گراف
  2. آشنایی با لیست پیوندی در جاوا
  3. Iterator در جاوا
  4. آشنایی با واژه رابطه برنامه نویسی(منظور api است)
  5. آشنایی با This در جاوا
  6. آشنایی با Constructor در جاوا
  7. آشنایی با متد در جاوا
  8. آشنایی با آرایه
  9. آشنایی با خواندن و نوشتن فایل در جاوا
  10. حلقه while در جاوا
  11. آشنایی مدیریت استثناها
  12. آشنایی با if
  13. آشنایی به for
  14. آشنایی با شی گرایی
  15. رابط برنامه نویسی گراف
  16. رابط برنامه نویسی گراف جهت دار

رابط برنامه‌نویسی نرم‌افزار

رابط برنامه‌نویسی نرم‌افزار یا به صورت خلاصه رابط برنامه نویسی، رابط بین یک کتابخانه یا سیستم‌عامل و برنامه‌هایی است که از آن تقاضای سرویس می‌کنند.

رابط کارکردهایی را تعریف می‌کند که کتابخانه یا سیستم‌عامل می‌تواند ارائه دهد و مفهومی مجرد است. این کارکردها سپس در قالب یک نرم‌افزار یا کتابخانه پیاده‌سازی می‌شوند. به عبارت ساده‌تر، رابط برنامه‌نویسی مجموعه توابعی است که یک برنامه می‌تواند از یک برنامه دیگر فرا بخواند.

برای مثال مایکروسافت برای  API‌ های ویندوز مرجع‌هایی استاندارد دارد که با استفاده از آنها برنامه‌نویسان می‌توانند از قابلیت‌ها و سرویس‌های سیستم‌عامل در توسعه و نوشتن برنامه‌های کاربردی خود استفاده کنند(ویکیپدیا).

پیاده سازی رابط برنامه نویسی گراف وزندار

در آموزش های گذشته دو رابط برنامه‌نویسی را پیاده سازی کرده‌ایم، یکی رابط برنامه نویسی گراف جهت دار و دیگری رابط برنامه نویسی گراف بوده است. همچنین در آموزش‌های قبل در مورد لیست پیوندی و نحوه پیاده سازی آن صحبت شد. در این جلسه با یکدیگر گراف وزندار (رابط برنامه نویسی گراف وزندار) را پیاده سازی می‌کنیم. برای پیاده سازی، ما نیاز به کلاس Bag یا همان لیست پیوندی که در آموزش رابط برنامه نویسی گراف توضیح داده شد، داریم. در مورد کلاس bag و ListIterator و Node در آموزش های قبل توضیحات داده شده است و در اینجا فقط کد آنها را آورده‌ایم.

کد کلاس Bag

import java.util.Iterator;

public class Bag<Item> implements Iterable<Item> {

     private Node<Item> first;
     private int size;

     public Bag() {
          size = 0;
          first = null;
     }

     public boolean isEmpty() {
          return first == null;
     }

     public int size() {
          return size;
     }

     public void add(Item item) {
          Node<Item> oldfirst = first;
          first = new Node<Item>(item, oldfirst);
          size++;
     }

     public Iterator<Item> iterator() {
          return new ListIterator<Item>(first);
     }

}

کد کلاس Node

public class Node<Item> {

     private Item data;
     private Node next_node;

     public Node(Item data, Node next_node) {
          this.data = data;
          this.next_node = next_node;
     }

     public Item getData() {
          return data;
     }

     public Node getNext_node() {
          return next_node;
     }
    
    

}

کد کلاس ListIterator

import java.util.Iterator;
import java.util.NoSuchElementException;

public class ListIterator<Item> implements Iterator<Item> {
     private Node<Item> current;

     public ListIterator(Node<Item> first) {
          current = first;
     }

     public boolean hasNext() {
          return current != null;
     }


     public Item next() {
          if (!hasNext())
              throw new NoSuchElementException();
          Item item = current.getData();
          current = current.getNext_node();
          return item;
     }
}

کلاس Edge

همانطور که از نام “رابط برنامه نویسی گراف وزندار” پیداست، ما نیاز داریم به یال‌های گرافمان وزن بدهیم و این کار را کلاس Edge انجام می‌دهد. این کلاس شامل سه فیلد به نام u و v و weight است. u و v دو راس ما هستند که یالی با وزن weight بین آنها وجود دارد. همچنین کلاس Edge شامل متدهای زیر می‌باشد:

  1. Edge: این متد همان Constructor ما است. متغیر u و v و weight را به عنوان ورودی می‌گیرد.
  2. Either: این متد یکی از راس‌ها را برمی‌گرداند.
  3. Other: این متد در ورودی، یکی از راس‌ها را گرفته و در خروجی راس دیگر (که با ورودی برابر نیست) را برمی‌گرداند.
  4. Weight: وزن یال را بر‌میگرداند.
  5. CompareTo: دو یال را با هم مقایسه می‌کند.
  6. ToString: این متد برای چاپ یال و راسها است.
public class Edge {

     private final int v;
     private final int w;
     private final double weight;


     public Edge(int v, int w, double weight) {
          if (v < 0)
              throw new IndexOutOfBoundsException(
                        "Vertex name must be a nonnegative integer");
          if (w < 0)
              throw new IndexOutOfBoundsException(
                        "Vertex name must be a nonnegative integer");
          if (Double.isNaN(weight))
              throw new IllegalArgumentException("Weight is NaN");
          this.v = v;
          this.w = w;
          this.weight = weight;
     }


     public double weight() {
          return weight;
     }


     public int either() {
          return v;
     }

     public int other(int vertex) {
          if (vertex == v)
              return w;
          else if (vertex == w)
              return v;
          else
              throw new IllegalArgumentException("Illegal endpoint");
     }


     public int compareTo(Edge that) {
          if (this.weight() < that.weight())
              return -1;
          else if (this.weight() > that.weight())
              return +1;
          else
              return 0;
     }


     public String toString() {
          return String.format("%d-%d %.5f", v, w, weight);
     }
}

کلاس EdgeWeightedGraph

EdgeWeightedGraph همان کلاس گراف ما است. این کلاس با استفاده از کلاس های بالا، رابط برنامه نویسی گراف وزندار ما را می‌سازد. در Constructor خود تعداد راس‌ها را به عنوان ورودی می‌گیرد و با استفاده از متد AddEdge، یالی را بین دو راس می‌سازد. بقیه متدها شبیه به متدهای رابط برنامه نویسی گراف می‌باشند.

public class EdgeWeightedGraph {
     private final int V;
     private int E;
     private Bag<Edge>[] adj;

     public EdgeWeightedGraph(int V) {
          if (V < 0)
              throw new IllegalArgumentException(
                        "Number of vertices must be nonnegative");
          this.V = V;
          this.E = 0;
          adj = (Bag<Edge>[]) new Bag[V];
          for (int v = 0; v < V; v++) {
              adj[v] = new Bag<Edge>();
          }
     }

     public int V() {
          return V;
     }

     public int E() {
          return E;
     }

     public void addEdge(Edge e) {
          int v = e.either();
          int w = e.other(v);
          if (v < 0 || v >= V)
              throw new IndexOutOfBoundsException("vertex " + v
                        + " is not between 0 and " + (V - 1));
          if (w < 0 || w >= V)
              throw new IndexOutOfBoundsException("vertex " + w
                        + " is not between 0 and " + (V - 1));
          adj[v].add(e);
          adj[w].add(e);
          E++;
     }

     public Iterable<Edge> adj(int v) {
          if (v < 0 || v >= V)
              throw new IndexOutOfBoundsException("vertex " + v
                        + " is not between 0 and " + (V - 1));
          return adj[v];
     }

     public Iterable<Edge> edges() {
          Bag<Edge> list = new Bag<Edge>();
          for (int v = 0; v < V; v++) {
              int selfLoops = 0;
              for (Edge e : adj(v)) {
                   if (e.other(v) > v) {
                        list.add(e);
                   } else if (e.other(v) == v) {
                        if (selfLoops % 2 == 0)
                             list.add(e);
                        selfLoops++;
                   }
              }
          }
          return list;
     }

     public String toString() {
          String NEWLINE = System.getProperty("line.separator");
          StringBuilder s = new StringBuilder();
          s.append(V + " " + E + NEWLINE);
          for (int v = 0; v < V; v++) {
              s.append(v + ": ");
              for (Edge e : adj[v]) {
                   s.append(e + "  ");
              }
              s.append(NEWLINE);
          }
          return s.toString();
     }

}

تست رابط برنامه نویسی گراف وزندار

برای تست کدهای بالا،کد Main زیر را بزنید:

   public static void main(String[] args) {
          EdgeWeightedGraph G = new EdgeWeightedGraph(10);
          Edge e1 = new Edge(1, 2, 3);
          Edge e2 = new Edge(1, 3, 1);
          Edge e3 = new Edge(2, 5, 1);
          Edge e4 = new Edge(4, 3, 2);
          Edge e5 = new Edge(6, 5, 2);

          G.addEdge(e1);
          G.addEdge(e2);
          G.addEdge(e3);
          G.addEdge(e4);
          G.addEdge(e5);
         
          System.out.println("print Graph With ToString Method:");
          System.out.println(G.toString());
         
          System.out.println("print Graph with edges Method");
          for (Edge w : G.edges()) {
              System.out.println(w.toString());

          }
         
     }

در کد Main ما 5 یال را ساختیم و به گراف اضافه کردیم سپس راسها و یال ها  را با دو روش متفاوت چاپ کردیم.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *