mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-30 16:31:08 +00:00
Fix astar (#1966)
* Fix astar Single character variable names are old school. * fixup! Format Python code with psf/black push * Tuple * updating DIRECTORY.md Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
This commit is contained in:
parent
3d9bb051a8
commit
a7cd633bb6
|
@ -266,6 +266,7 @@
|
||||||
* [Test Linear Algebra](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/test_linear_algebra.py)
|
* [Test Linear Algebra](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/test_linear_algebra.py)
|
||||||
|
|
||||||
## Machine Learning
|
## Machine Learning
|
||||||
|
* [Astar](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/astar.py)
|
||||||
* [Decision Tree](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/decision_tree.py)
|
* [Decision Tree](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/decision_tree.py)
|
||||||
* [Gaussian Naive Bayes](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/gaussian_naive_bayes.py)
|
* [Gaussian Naive Bayes](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/gaussian_naive_bayes.py)
|
||||||
* [Gradient Descent](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/gradient_descent.py)
|
* [Gradient Descent](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/gradient_descent.py)
|
||||||
|
@ -327,6 +328,7 @@
|
||||||
* [Hardy Ramanujanalgo](https://github.com/TheAlgorithms/Python/blob/master/maths/hardy_ramanujanalgo.py)
|
* [Hardy Ramanujanalgo](https://github.com/TheAlgorithms/Python/blob/master/maths/hardy_ramanujanalgo.py)
|
||||||
* [Is Square Free](https://github.com/TheAlgorithms/Python/blob/master/maths/is_square_free.py)
|
* [Is Square Free](https://github.com/TheAlgorithms/Python/blob/master/maths/is_square_free.py)
|
||||||
* [Jaccard Similarity](https://github.com/TheAlgorithms/Python/blob/master/maths/jaccard_similarity.py)
|
* [Jaccard Similarity](https://github.com/TheAlgorithms/Python/blob/master/maths/jaccard_similarity.py)
|
||||||
|
* [Kadanes](https://github.com/TheAlgorithms/Python/blob/master/maths/kadanes.py)
|
||||||
* [Karatsuba](https://github.com/TheAlgorithms/Python/blob/master/maths/karatsuba.py)
|
* [Karatsuba](https://github.com/TheAlgorithms/Python/blob/master/maths/karatsuba.py)
|
||||||
* [Kth Lexicographic Permutation](https://github.com/TheAlgorithms/Python/blob/master/maths/kth_lexicographic_permutation.py)
|
* [Kth Lexicographic Permutation](https://github.com/TheAlgorithms/Python/blob/master/maths/kth_lexicographic_permutation.py)
|
||||||
* [Largest Of Very Large Numbers](https://github.com/TheAlgorithms/Python/blob/master/maths/largest_of_very_large_numbers.py)
|
* [Largest Of Very Large Numbers](https://github.com/TheAlgorithms/Python/blob/master/maths/largest_of_very_large_numbers.py)
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
import numpy as np
|
"""
|
||||||
|
|
||||||
'''
|
|
||||||
The A* algorithm combines features of uniform-cost search and pure
|
The A* algorithm combines features of uniform-cost search and pure
|
||||||
heuristic search to efficiently compute optimal solutions.
|
heuristic search to efficiently compute optimal solutions.
|
||||||
A* algorithm is a best-first search algorithm in which the cost
|
A* algorithm is a best-first search algorithm in which the cost
|
||||||
|
@ -11,11 +9,12 @@ from node n to a goal.A* algorithm introduces a heuristic into a
|
||||||
regular graph-searching algorithm,
|
regular graph-searching algorithm,
|
||||||
essentially planning ahead at each step so a more optimal decision
|
essentially planning ahead at each step so a more optimal decision
|
||||||
is made.A* also known as the algorithm with brains
|
is made.A* also known as the algorithm with brains
|
||||||
'''
|
"""
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
class Cell(object):
|
class Cell(object):
|
||||||
'''
|
"""
|
||||||
Class cell represents a cell in the world which have the property
|
Class cell represents a cell in the world which have the property
|
||||||
position : The position of the represented by tupleof x and y
|
position : The position of the represented by tupleof x and y
|
||||||
co-ordinates initially set to (0,0)
|
co-ordinates initially set to (0,0)
|
||||||
|
@ -24,7 +23,8 @@ class Cell(object):
|
||||||
g,h,f : The parameters for constructing the heuristic function
|
g,h,f : The parameters for constructing the heuristic function
|
||||||
which can be any function. for simplicity used line
|
which can be any function. for simplicity used line
|
||||||
distance
|
distance
|
||||||
'''
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.position = (0, 0)
|
self.position = (0, 0)
|
||||||
self.parent = None
|
self.parent = None
|
||||||
|
@ -32,10 +32,12 @@ class Cell(object):
|
||||||
self.g = 0
|
self.g = 0
|
||||||
self.h = 0
|
self.h = 0
|
||||||
self.f = 0
|
self.f = 0
|
||||||
'''
|
|
||||||
|
"""
|
||||||
overrides equals method because otherwise cell assign will give
|
overrides equals method because otherwise cell assign will give
|
||||||
wrong results
|
wrong results
|
||||||
'''
|
"""
|
||||||
|
|
||||||
def __eq__(self, cell):
|
def __eq__(self, cell):
|
||||||
return self.position == cell.position
|
return self.position == cell.position
|
||||||
|
|
||||||
|
@ -44,12 +46,11 @@ class Cell(object):
|
||||||
|
|
||||||
|
|
||||||
class Gridworld(object):
|
class Gridworld(object):
|
||||||
|
"""
|
||||||
'''
|
|
||||||
Gridworld class represents the external world here a grid M*M
|
Gridworld class represents the external world here a grid M*M
|
||||||
matrix
|
matrix
|
||||||
w : create a numpy array with the given world_size default is 5
|
world_size: create a numpy array with the given world_size default is 5
|
||||||
'''
|
"""
|
||||||
|
|
||||||
def __init__(self, world_size=(5, 5)):
|
def __init__(self, world_size=(5, 5)):
|
||||||
self.w = np.zeros(world_size)
|
self.w = np.zeros(world_size)
|
||||||
|
@ -59,40 +60,41 @@ class Gridworld(object):
|
||||||
def show(self):
|
def show(self):
|
||||||
print(self.w)
|
print(self.w)
|
||||||
|
|
||||||
'''
|
|
||||||
get_neighbours
|
|
||||||
As the name suggests this function will return the neighbours of
|
|
||||||
the a particular cell
|
|
||||||
'''
|
|
||||||
def get_neigbours(self, cell):
|
def get_neigbours(self, cell):
|
||||||
|
"""
|
||||||
|
Return the neighbours of cell
|
||||||
|
"""
|
||||||
neughbour_cord = [
|
neughbour_cord = [
|
||||||
(-1, -1), (-1, 0), (-1, 1), (0, -1),
|
(-1, -1),
|
||||||
(0, 1), (1, -1), (1, 0), (1, 1)]
|
(-1, 0),
|
||||||
|
(-1, 1),
|
||||||
|
(0, -1),
|
||||||
|
(0, 1),
|
||||||
|
(1, -1),
|
||||||
|
(1, 0),
|
||||||
|
(1, 1),
|
||||||
|
]
|
||||||
current_x = cell.position[0]
|
current_x = cell.position[0]
|
||||||
current_y = cell.position[1]
|
current_y = cell.position[1]
|
||||||
neighbours = []
|
neighbours = []
|
||||||
for n in neughbour_cord:
|
for n in neughbour_cord:
|
||||||
x = current_x + n[0]
|
x = current_x + n[0]
|
||||||
y = current_y + n[1]
|
y = current_y + n[1]
|
||||||
if (
|
if 0 <= x < self.world_x_limit and 0 <= y < self.world_y_limit:
|
||||||
(x >= 0 and x < self.world_x_limit) and
|
|
||||||
(y >= 0 and y < self.world_y_limit)):
|
|
||||||
c = Cell()
|
c = Cell()
|
||||||
c.position = (x, y)
|
c.position = (x, y)
|
||||||
c.parent = cell
|
c.parent = cell
|
||||||
neighbours.append(c)
|
neighbours.append(c)
|
||||||
return neighbours
|
return neighbours
|
||||||
|
|
||||||
'''
|
|
||||||
Implementation of a start algorithm
|
|
||||||
world : Object of the world object
|
|
||||||
start : Object of the cell as start position
|
|
||||||
stop : Object of the cell as goal position
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
|
||||||
def astar(world, start, goal):
|
def astar(world, start, goal):
|
||||||
'''
|
"""
|
||||||
|
Implementation of a start algorithm
|
||||||
|
world : Object of the world object
|
||||||
|
start : Object of the cell as start position
|
||||||
|
stop : Object of the cell as goal position
|
||||||
|
|
||||||
>>> p = Gridworld()
|
>>> p = Gridworld()
|
||||||
>>> start = Cell()
|
>>> start = Cell()
|
||||||
>>> start.position = (0,0)
|
>>> start.position = (0,0)
|
||||||
|
@ -100,7 +102,7 @@ def astar(world, start, goal):
|
||||||
>>> goal.position = (4,4)
|
>>> goal.position = (4,4)
|
||||||
>>> astar(p, start, goal)
|
>>> astar(p, start, goal)
|
||||||
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
|
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
|
||||||
'''
|
"""
|
||||||
_open = []
|
_open = []
|
||||||
_closed = []
|
_closed = []
|
||||||
_open.append(start)
|
_open.append(start)
|
||||||
|
@ -118,7 +120,7 @@ def astar(world, start, goal):
|
||||||
n.g = current.g + 1
|
n.g = current.g + 1
|
||||||
x1, y1 = n.position
|
x1, y1 = n.position
|
||||||
x2, y2 = goal.position
|
x2, y2 = goal.position
|
||||||
n.h = (y2 - y1)**2 + (x2 - x1)**2
|
n.h = (y2 - y1) ** 2 + (x2 - x1) ** 2
|
||||||
n.f = n.h + n.g
|
n.f = n.h + n.g
|
||||||
|
|
||||||
for c in _open:
|
for c in _open:
|
||||||
|
@ -130,23 +132,19 @@ def astar(world, start, goal):
|
||||||
path.append(current.position)
|
path.append(current.position)
|
||||||
current = current.parent
|
current = current.parent
|
||||||
path.append(current.position)
|
path.append(current.position)
|
||||||
path = path[::-1]
|
return path[::-1]
|
||||||
return path
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
'''
|
if __name__ == "__main__":
|
||||||
sample run
|
world = Gridworld()
|
||||||
'''
|
# stat position and Goal
|
||||||
# object for the world
|
|
||||||
p = Gridworld()
|
|
||||||
# stat position and Goal
|
|
||||||
start = Cell()
|
start = Cell()
|
||||||
start.position = (0, 0)
|
start.position = (0, 0)
|
||||||
goal = Cell()
|
goal = Cell()
|
||||||
goal.position = (4, 4)
|
goal.position = (4, 4)
|
||||||
print("path from {} to {} ".format(start.position, goal.position))
|
print(f"path from {start.position} to {goal.position}")
|
||||||
s = astar(p, start, goal)
|
s = astar(world, start, goal)
|
||||||
# Just for visual Purpose
|
# Just for visual reasons
|
||||||
for i in s:
|
for i in s:
|
||||||
p.w[i] = 1
|
world.w[i] = 1
|
||||||
print(p.w)
|
print(world.w)
|
||||||
|
|
|
@ -3,7 +3,7 @@ Kadane's algorithm to get maximum subarray sum
|
||||||
https://medium.com/@rsinghal757/kadanes-algorithm-dynamic-programming-how-and-why-does-it-work-3fd8849ed73d
|
https://medium.com/@rsinghal757/kadanes-algorithm-dynamic-programming-how-and-why-does-it-work-3fd8849ed73d
|
||||||
https://en.wikipedia.org/wiki/Maximum_subarray_problem
|
https://en.wikipedia.org/wiki/Maximum_subarray_problem
|
||||||
"""
|
"""
|
||||||
test_data = ([-2, -8, -9], [2, 8, 9], [-1, 0, 1], [0, 0], [])
|
test_data: tuple = ([-2, -8, -9], [2, 8, 9], [-1, 0, 1], [0, 0], [])
|
||||||
|
|
||||||
|
|
||||||
def negative_exist(arr: list) -> int:
|
def negative_exist(arr: list) -> int:
|
Loading…
Reference in New Issue
Block a user