{"id":18551331,"url":"https://github.com/morvanzhou/pathfind","last_synced_at":"2025-11-09T11:02:40.917Z","repository":{"id":62982356,"uuid":"564158689","full_name":"MorvanZhou/pathfind","owner":"MorvanZhou","description":"path finding algorithms","archived":false,"fork":false,"pushed_at":"2024-04-17T07:07:22.000Z","size":374,"stargazers_count":17,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-09-29T00:14:03.199Z","etag":null,"topics":["astar","bfs","dfs","dijstra","graph","graph-algorithms","greedy-best-first-search","visualization"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MorvanZhou.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-10T05:33:38.000Z","updated_at":"2025-08-14T14:49:45.000Z","dependencies_parsed_at":"2024-04-17T08:29:51.435Z","dependency_job_id":"5b74211d-ce46-4eda-94bf-75aecefec19c","html_url":"https://github.com/MorvanZhou/pathfind","commit_stats":{"total_commits":49,"total_committers":1,"mean_commits":49.0,"dds":0.0,"last_synced_commit":"55bfdb356f921c00d8c2df150b1f2a276518c810"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/MorvanZhou/pathfind","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MorvanZhou%2Fpathfind","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MorvanZhou%2Fpathfind/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MorvanZhou%2Fpathfind/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MorvanZhou%2Fpathfind/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MorvanZhou","download_url":"https://codeload.github.com/MorvanZhou/pathfind/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MorvanZhou%2Fpathfind/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":283496071,"owners_count":26845317,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-09T02:00:05.828Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["astar","bfs","dfs","dijstra","graph","graph-algorithms","greedy-best-first-search","visualization"],"created_at":"2024-11-06T21:08:40.320Z","updated_at":"2025-11-09T11:02:40.874Z","avatar_url":"https://github.com/MorvanZhou.png","language":"Python","readme":"# PathFind\n\n[![Unittest](https://github.com/MorvanZhou/pathfind/actions/workflows/python-package.yml/badge.svg)](https://github.com/MorvanZhou/pathfind/actions/workflows/python-package.yml)\n[![License](https://img.shields.io/github/license/MorvanZhou/pathfind)](https://github.com/MorvanZhou/pathfind/blob/master/LICENSE)\n\u003ca href=\"https://pypi.org/project/pathfind\" target=\"_blank\"\u003e\n\u003cimg src=\"https://img.shields.io/pypi/v/pathfind?color=%2334D058\u0026label=pypi%20package\" alt=\"Package version\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://pypi.org/project/pathfind\" target=\"_blank\"\u003e\n\u003cimg src=\"https://img.shields.io/pypi/pyversions/pathfind.svg?color=%2334D058\" alt=\"Supported Python versions\"\u003e\n\u003c/a\u003e\n\nImplementation of path finding algorithms including:\n\n- Depth-First Search (DFS)\n- Breadth-First Search (BFS)\n- Dijkstra Search\n- Greedy Best-First Search\n- A\\*\n- D\\*-Lite\n- Jump Point Search (JPS)\n\n# Install\n\n```shell\npip install pathfind\n```\n\n# Basic Usage\n\nDefine a graph to transform graph from a matrix, then find a path from start point to end point. The value in `m`\nindicates a cost at that node. Note that the -1 in `m` represents the cost in that node is infinity, which means this\nnode is not connected to others.\n\n```python\nimport pathfind\n\nm = [\n    [1, 1, 1, 1, 1],\n    [1, 2, -1, 1, 1],\n    [1, 1, 1, 1, 1],\n    [8, 3, 1, 1, 1],\n    [1, 1, 1, 1, 1],\n]\ngraph = pathfind.transform.matrix2graph(m)\npath = pathfind.find(graph, start=\"4,0\", end=\"0,0\")\n# ['4,0', '4,1', '3,1', '2,1', '2,0', '1,0', '0,0']\n\ngraph.show(trace=path)\n```\n\n\u003cimg src=\"https://raw.githubusercontent.com/MorvanZhou/pathfind/master/demo/astar.png\" alt=\"drawing\" width=\"450\"/\u003e\n\n\nFinder can be changed by passing a string method (\"a*\", \"bfs\", \"greedy\", \"dijkstra\", \"dfs\", \"d*lite\", \"jps\").\n\n```python\npath = pathfind.find(graph, start=\"2,2\", end=\"0,2\", method=\"bfs\")\n# ['2,2', '2,1', '1,1', '0,1', '0,2']\n\ngraph.show(trace=path)\n```\n\n\u003cimg src=\"https://raw.githubusercontent.com/MorvanZhou/pathfind/master/demo/bfs.png\" alt=\"drawing\" width=\"450\"/\u003e\n\n# Graph setup\n\nAnother way to define a graph is to config the edge by give \\[node1's name, node2's name, cost] pairs.\n\n```python\nimport pathfind\n\nconf = [\n    # [node1's name, node2's name, weight, *back_weight]\n    [\"n1\", \"n2\", 0.1],\n    [\"n1\", \"n3\", 0.2],\n    [\"n2\", \"n3\", 0.3]\n]\ngraph = pathfind.Graph(conf)\ngraph.show()\n```\n\n\u003cimg src=\"https://raw.githubusercontent.com/MorvanZhou/pathfind/master/demo/graph.png\" alt=\"drawing\" width=\"450\"/\u003e\n\nOr you can set edge's and node's details by following way：\n\n```python\nimport pathfind\n\nmy_n0 = pathfind.Node(name=\"my_n0\")  # node name set to \"my_n0\"\nauto_name = pathfind.Node()  # node name automatically set to \"n0\"\nn2 = \"n2\"  # pass a string to represent node name\ne0 = pathfind.Edge(node1=my_n0, node2=auto_name, route_weight=0.2)\ne1 = pathfind.Edge(node1=my_n0, node2=n2, route_weight=0.1)\ne2 = pathfind.Edge(auto_name, n2, route_weight=0)\n\ng = pathfind.Graph()\ng.add_edges([e0, e1, e2])\ng.show()\ng.edges\n\"\"\"\n{'my_n0:n0': my_n0:n0, 'my_n0:n2': my_n0:n2, 'n0:n2': n0:n2}\n\"\"\"\n```\n\n\u003cimg src=\"https://raw.githubusercontent.com/MorvanZhou/pathfind/master/demo/custom.png\" alt=\"drawing\" width=\"450\"/\u003e\n\nA diagonal grid graph can be generated by following way:\n\n```python\nimport pathfind\n\nm = [\n    [1, 1, 1, 1],\n    [1, 1, 1, 1],\n    [1, 1, 1, 1],\n]\ngraph = pathfind.transform.matrix2graph(m, diagonal=True)\npath = pathfind.find(graph, start=\"0,0\", end=\"2,3\")\n# ['0,0', '1,1', '2,2', '2,3']\n\ngraph.show(trace=path)\n```\n\n\u003cimg src=\"https://raw.githubusercontent.com/MorvanZhou/pathfind/master/demo/diagonal.png\" alt=\"drawing\" width=\"450\"/\u003e\n\n# More examples\n\nMore examples and usages can be found in [test](/tests)\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorvanzhou%2Fpathfind","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmorvanzhou%2Fpathfind","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorvanzhou%2Fpathfind/lists"}