Sabtu, 08 Juni 2019

Algoritma dan Pemrograman 2

Dijkstra dan Kruskal

1. Algoritma Dijkstra


Dijkstra adalah mengambil sisi yang memiliki bobot minimum untuk setiap langkahnya. Sisi yang diambil menghubungkan sebuah simpul yang sudah terpilih dengan simpul lain yang belum terpilih. Lintasan yang dipilih haruslah lintasan terpendek diantara semua lintasan ke simpul-simpul yang belum terpilih.
Algoritma Dijkstra adalah salah satu metode untuk memecahkan masalah pencarian rute terpendek. Algoritma ini biasanya diterapkan pada sebuah aplikasi pencari rute jalan yang terdekat dari suatu daerah ke daerah lainnya.      
Untuk bisa menerapkan algoritma ini dibutuhkan beberapa data yang harus disiapkan, yaitu :
1.    Beberapa Titik/simpul/daerah, titik/simpul/daerah yang bisa dijangkau secara langsung, dan juga jarak antara mereka.
2.    Titik/simpul/daerah awal.
3.    Titik/simpul/daerah tujuan.
Contoh Program :

Algortima
#include<stdio.h>
#include<conio.h>
#include<process.h>
#include<string.h>
#include<math.h>
#define IN 99
#define N 6

int dijkstra(int cost[][N], int source, int target);
int dijsktra(int cost[][N],int source,int target)
{
int dist[N],prev[N],selected[N]={0},i,m,min,start,d,j;
char path[N];
for(i=1;i< N;i++)
{
            dist[i] = IN;
             prev[i] = -1;
            }

start = source;
selected[start]=1;
dist[start] = 0;
while(selected[target] ==0)
{
            min = IN;
             m = 0;
             for(i=1;i< N;i++)
                        {
                        d = dist[start] +cost[start][i];
                         if(d< dist[i]&&selected[i]==0)
                        {
                        dist[i] = d;
                         prev[i] = start;
                        }
             if(min>dist[i] && selected[i]==0)
                        {
                        min = dist[i];
                         m = i;
                        }
            }
    start = m;
    selected[start] = 1;
    }

start = target;
j = 0;
while(start != -1)
{
            path[j++] = start+65;
            start = prev[start];
            }
path[j]='\0';
strrev(path);
printf("%s", path);
return dist[target];
}

int main()
{
            int cost[N][N],i,j,w,ch,co;
            int source, target,x,y;
            printf("\t****Lintaan Algoritma Terpendek (DIJKSRTRA's ALGORITHM)****\n\n");
            for(i=1;i< N;i++)
            for(j=1;j< N;j++)
            cost[i][j] = IN;
            for(x=1;x< N;x++)
                        {
                         for(y=x+1;y< N;y++)
                                    {
                                    printf(" Masukkan nilai dari jalur antara simpul %d dan %d: ",x,y);
                                    scanf("%d",&w);
                                    cost [x][y] = cost[y][x] = w;
                                    }
                        printf("\n");
                        }
            printf("\n Masukkan asal simpul: ");
            scanf("%d", &source);
            printf("\n Masukkan target simpul: ");
            scanf("%d", &target);
            co = dijsktra(cost,source,target);
            printf("\n Jalur Terpendek: %d",co);

            getch();
            return(0);
            }
Hasil Running 

2. Algoritma Kruskal


Algoritma ini adalah algoritma yang akan mencari sebuah pohon merentang minimum (minimum spanning tree) pada seabuah graf berbobot yang terhubung. Secara umum, algoritma Kruskal adalah memilih sisi yang memiliki bobot minimum yang tidak membentuk sirkuit pada pohon, kemudian menambahkan sisi tersebut sebagai solusi. Langkah tersebut diulangi sampai sebanyak jumlah simpul dikurangi satu.

Contoh Program :

Algoritma
#include <cstdlib>
#include <iostream>
#include <fstream>


using namespace std;

class kruskal
{
    private:
    int n ;//no of nodes
    int noe; //no edges in the graph
    int graph_edge[100][100];

    int tree[100][100];

    int sets[100][100];
    int top[100];

    public:
    int read_graph();
    void initialize_span_t();
    void sort_edges();
    void algorithm();
    int find_node(int );
    void print_min_span_t();
};

int kruskal::read_graph()
{
///cout<<"Program ini Mengimplementasikan Algoritma Kruskal\n";
cout<<"Banyak titik graph : ";
cin>>n;
noe=0;

cout<<"\nJarak antar tiap titik:\n";

for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
        cout<<"("<<i<<" , "<<j<<") = ";
        int w;
        cin>>w;
            if(w!=0)
            {
            noe++;

            graph_edge[noe][1]=i;
            graph_edge[noe][2]=j;
            graph_edge[noe][3]=w;
            }
        }
        cout << endl;
    }

}

void kruskal::sort_edges()
{
/** Sort the edges using bubble sort in increasing order******/

for(int i=1;i<=noe-1;i++)
{
    for(int j=1;j<=noe-i;j++)
    {
        if(graph_edge[j][3]>graph_edge[j+1][3])
        {
        int t=graph_edge[j][1];
        graph_edge[j][1]=graph_edge[j+1][1];
        graph_edge[j+1][1]=t;

        t=graph_edge[j][2];
        graph_edge[j][2]=graph_edge[j+1][2];
        graph_edge[j+1][2]=t;

        t=graph_edge[j][3];
        graph_edge[j][3]=graph_edge[j+1][3];
        graph_edge[j+1][3]=t;
        }
    }
}



cout<<"\n\nSetelah Jarak diurutkan adalah ::\n";
for(int i=1;i<=noe;i++)
cout<<"("<< graph_edge[i][1]
<<" , "<<graph_edge[i][2]
<<" ) = "<<graph_edge[i][3]<<endl;
}

void kruskal::algorithm()
{

    for(int i=1;i<=n;i++)
    {
    sets[i][1]=i;
    top[i]=1;
    }

cout<<"\nRentang Yang di Pakai\n\n";

    for(int i=1;i<=noe;i++)
    {
    int p1=find_node(graph_edge[i][1]);
    int p2=find_node(graph_edge[i][2]);

        if(p1!=p2)
        {
            cout<<"Rentang yg masuk ke pohon ::"
            <<" < "<<graph_edge[i][1]<<" , "
            <<graph_edge[i][2]<<" > "<<endl<<endl;

            tree[graph_edge[i][1]][graph_edge[i][2]]=graph_edge[i][3];
            tree[graph_edge[i][2]][graph_edge[i][1]]=graph_edge[i][3];

            // Mix the two sets

            for(int j=1;j<=top[p2];j++)
            {
                top[p1]++;
                sets[p1][top[p1]]=sets[p2][j];
            }

            top[p2]=0;
        }
        else
        {
            cout<<"Jika "
            <<" < "<<graph_edge[i][1]<<" , "
            <<graph_edge[i][2]<<" > "<<"di masukkan, maka terbentuk siklus. jadi di hapus\n\n";
        }
    }
}

int kruskal::find_node(int n)
{
    for(int i=1;i<=noe;i++)
    {
        for(int j=1;j<=top[i];j++)
        {
        if(n==sets[i][j])
            return i;
        }
    }

    return -1;
}


int main(int argc, char *argv[])
{
    kruskal obj;
    obj.read_graph();
    obj.sort_edges();
    obj.algorithm();

    system("PAUSE");
    return EXIT_SUCCESS;
}
     Hasil Running

0 komentar:

Posting Komentar

Cari Blog Ini