DFS JARAK

class Node:
    def __init__(self,name):
        self.name = name
    def getName(self):
        return self.name
    def __str__(self):
        return self.name

class Edge:
    def __init__(self, asal, tujuan, jarak):
        self.asal = asal
        self.tujuan = tujuan
        self.jarak = jarak
    def getAsal(self):
        return self.asal
    def getTujuan(self):
        return self.tujuan
    def getJarak(self):
        return self.jarak
    def __str__(self):
        return f"{self.asal.getName()} -> {self.tujuan.getName()} ({self.jarak} km)"

class Digraph:
    def __init__(self):
        self.edge = {}
    def addNode(self,node):
        if node in self.edge:
            raise ValueError("Sudah ada")  
        else:
            self.edge[node] = []
    def addEdge(self, edge):
        asal = edge.getAsal()
        tujuan = edge.getTujuan()
        jarak = edge.getJarak()

        if not (asal in self.edge and tujuan in self.edge):
            raise ValueError("Node tidak ada")
        else:
            self.edge[asal].append((tujuan, jarak))
    def getNode(self, node):
        for n in self.edge:
            if n.getName() == node:
                return n
        raise NameError(f"Node '{node}' tidak ditemukan")
    def childrenOf(self,node):
        return self.edge[node]
    def __str__(self):
        res = ""
        for src in self.edge:
            for dest in self.edge[src]:
                res += res + f"{src} -> {dest}"
        return res
class Graph(Digraph):
    def addEdge(self, edge):
        return super().addEdge(edge)
       

def printPath(path):
    result = ""
    for i in range(len(path)):
        result += str(path[i])
        if i != len(path)-1:
            result += "->"
       
    return result


def dfs(graph,asal,tujuan,shortest,path=[],toPrint=False):
    path = path + [asal]
    if toPrint:
        print(printPath(path))
    if asal == tujuan:
        return path
    for nextNode in graph.childrenOf(asal):
        if nextNode not in path:
            if shortest == None or len(path) < len(shortest):
                newPath = dfs(graph,nextNode,tujuan,shortest,path,toPrint)

                if newPath != None:
                    shortest = newPath
       

    return shortest


def dfs(graph, asal, tujuan, path=None, jarak=0,
        shortest=None, toPrint=False):

    if path is None:
        path = []

    path = path + [asal]

    if asal == tujuan:
        if toPrint:
            print(f"{printPath(path)} = {jarak} km")

        if shortest is None or jarak < shortest[1]:
            return (path, jarak)

        return shortest

    if toPrint:
        print(f"{printPath(path)} = {jarak} km")

    for nextNode, bobot in graph.childrenOf(asal):

        if nextNode not in path:

            # Pangkas jalur jika sudah lebih panjang
            # daripada jarak terbaik yang ditemukan
            if shortest is None or jarak + bobot < shortest[1]:

                hasil = dfs(
                    graph,
                    nextNode,
                    tujuan,
                    path,
                    jarak + bobot,
                    shortest,
                    toPrint
                )

                if hasil is not None:
                    if shortest is None or hasil[1] < shortest[1]:
                        shortest = hasil

    return shortest




g = Digraph()

# Create 7 nodes
for name in (
    'Boston',
    'Providence',
    'New York',
    'Chicago',
    'Denver',
    'Phoenix',
    'Los Angeles'
):

    g.addNode(Node(name))

# Create edges

g.addEdge(Edge(g.getNode('Boston'),
               g.getNode('Providence'), 80))

g.addEdge(Edge(g.getNode('Boston'),
               g.getNode('New York'), 300))

g.addEdge(Edge(g.getNode('Providence'),
               g.getNode('Boston'), 80))

g.addEdge(Edge(g.getNode('Providence'),
               g.getNode('New York'), 250))

g.addEdge(Edge(g.getNode('New York'),
               g.getNode('Chicago'), 1_150))

g.addEdge(Edge(g.getNode('Chicago'),
               g.getNode('Denver'), 1_000))

g.addEdge(Edge(g.getNode('Chicago'),
               g.getNode('Phoenix'), 1_750))

g.addEdge(Edge(g.getNode('Denver'),
               g.getNode('Phoenix'), 950))

g.addEdge(Edge(g.getNode('Denver'),
               g.getNode('New York'), 2_600))

g.addEdge(Edge(g.getNode('Los Angeles'),
               g.getNode('Boston'), 4_800))




hasil = dfs(
    g,
    g.getNode("Boston"),
    g.getNode("Phoenix"),
    toPrint=True
)

if hasil is not None:
    jalur, totalJarak = hasil

    print("\nJalur terpendek:", printPath(jalur))
    print("Total jarak:", totalJarak, "km")
else:
    print("Jalur tidak ditemukan")


   
   

Komentar

Postingan populer dari blog ini

Analisis Data Menggunakan Orange

Pengenalan Bahasa C

Pengalaman Test ELPT ITB