|
@@ -14,7 +14,7 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__)) +
|
|
|
from Search_based_Planning.Search_2D import plotting, env
|
|
from Search_based_Planning.Search_2D import plotting, env
|
|
|
|
|
|
|
|
|
|
|
|
|
-class Dstar:
|
|
|
|
|
|
|
+class DStar:
|
|
|
def __init__(self, s_start, s_goal):
|
|
def __init__(self, s_start, s_goal):
|
|
|
self.s_start, self.s_goal = s_start, s_goal
|
|
self.s_start, self.s_goal = s_start, s_goal
|
|
|
|
|
|
|
@@ -27,15 +27,17 @@ class Dstar:
|
|
|
self.y = self.Env.y_range
|
|
self.y = self.Env.y_range
|
|
|
|
|
|
|
|
self.fig = plt.figure()
|
|
self.fig = plt.figure()
|
|
|
|
|
+
|
|
|
self.OPEN = set()
|
|
self.OPEN = set()
|
|
|
- self.t = {}
|
|
|
|
|
- self.PARENT = {}
|
|
|
|
|
- self.h = {}
|
|
|
|
|
- self.k = {}
|
|
|
|
|
|
|
+ self.t = dict()
|
|
|
|
|
+ self.PARENT = dict()
|
|
|
|
|
+ self.h = dict()
|
|
|
|
|
+ self.k = dict()
|
|
|
self.path = []
|
|
self.path = []
|
|
|
self.visited = set()
|
|
self.visited = set()
|
|
|
self.count = 0
|
|
self.count = 0
|
|
|
|
|
|
|
|
|
|
+ def init(self):
|
|
|
for i in range(self.Env.x_range):
|
|
for i in range(self.Env.x_range):
|
|
|
for j in range(self.Env.y_range):
|
|
for j in range(self.Env.y_range):
|
|
|
self.t[(i, j)] = 'NEW'
|
|
self.t[(i, j)] = 'NEW'
|
|
@@ -46,6 +48,7 @@ class Dstar:
|
|
|
self.h[self.s_goal] = 0.0
|
|
self.h[self.s_goal] = 0.0
|
|
|
|
|
|
|
|
def run(self, s_start, s_end):
|
|
def run(self, s_start, s_end):
|
|
|
|
|
+ self.init()
|
|
|
self.insert(s_end, 0)
|
|
self.insert(s_end, 0)
|
|
|
while True:
|
|
while True:
|
|
|
self.process_state()
|
|
self.process_state()
|
|
@@ -93,8 +96,10 @@ class Dstar:
|
|
|
def process_state(self):
|
|
def process_state(self):
|
|
|
s = self.min_state()
|
|
s = self.min_state()
|
|
|
self.visited.add(s)
|
|
self.visited.add(s)
|
|
|
|
|
+
|
|
|
if s is None:
|
|
if s is None:
|
|
|
return -1
|
|
return -1
|
|
|
|
|
+
|
|
|
k_old = self.get_k_min()
|
|
k_old = self.get_k_min()
|
|
|
self.delete(s)
|
|
self.delete(s)
|
|
|
|
|
|
|
@@ -128,13 +133,25 @@ class Dstar:
|
|
|
return self.get_k_min()
|
|
return self.get_k_min()
|
|
|
|
|
|
|
|
def min_state(self):
|
|
def min_state(self):
|
|
|
|
|
+ """
|
|
|
|
|
+ choose the node with the minimum k value in OPEN set.
|
|
|
|
|
+ :return: state
|
|
|
|
|
+ """
|
|
|
|
|
+
|
|
|
if not self.OPEN:
|
|
if not self.OPEN:
|
|
|
return None
|
|
return None
|
|
|
|
|
+
|
|
|
return min(self.OPEN, key=lambda x: self.k[x])
|
|
return min(self.OPEN, key=lambda x: self.k[x])
|
|
|
|
|
|
|
|
def get_k_min(self):
|
|
def get_k_min(self):
|
|
|
|
|
+ """
|
|
|
|
|
+ calc the min k value for nodes in OPEN set.
|
|
|
|
|
+ :return: k value
|
|
|
|
|
+ """
|
|
|
|
|
+
|
|
|
if not self.OPEN:
|
|
if not self.OPEN:
|
|
|
return -1
|
|
return -1
|
|
|
|
|
+
|
|
|
return min([self.k[x] for x in self.OPEN])
|
|
return min([self.k[x] for x in self.OPEN])
|
|
|
|
|
|
|
|
def insert(self, s, h_new):
|
|
def insert(self, s, h_new):
|
|
@@ -144,13 +161,20 @@ class Dstar:
|
|
|
self.k[s] = min(self.k[s], h_new)
|
|
self.k[s] = min(self.k[s], h_new)
|
|
|
elif self.t[s] == 'CLOSED':
|
|
elif self.t[s] == 'CLOSED':
|
|
|
self.k[s] = min(self.h[s], h_new)
|
|
self.k[s] = min(self.h[s], h_new)
|
|
|
|
|
+
|
|
|
self.h[s] = h_new
|
|
self.h[s] = h_new
|
|
|
self.t[s] = 'OPEN'
|
|
self.t[s] = 'OPEN'
|
|
|
self.OPEN.add(s)
|
|
self.OPEN.add(s)
|
|
|
|
|
|
|
|
def delete(self, s):
|
|
def delete(self, s):
|
|
|
|
|
+ """
|
|
|
|
|
+ delete: move state s from OPEN set to CLOSED set.
|
|
|
|
|
+ :param s: state should be deleted
|
|
|
|
|
+ """
|
|
|
|
|
+
|
|
|
if self.t[s] == 'OPEN':
|
|
if self.t[s] == 'OPEN':
|
|
|
self.t[s] = 'CLOSED'
|
|
self.t[s] = 'CLOSED'
|
|
|
|
|
+
|
|
|
self.OPEN.remove(s)
|
|
self.OPEN.remove(s)
|
|
|
|
|
|
|
|
def modify(self, s):
|
|
def modify(self, s):
|
|
@@ -227,7 +251,7 @@ class Dstar:
|
|
|
def main():
|
|
def main():
|
|
|
s_start = (5, 5)
|
|
s_start = (5, 5)
|
|
|
s_goal = (45, 25)
|
|
s_goal = (45, 25)
|
|
|
- dstar = Dstar(s_start, s_goal)
|
|
|
|
|
|
|
+ dstar = DStar(s_start, s_goal)
|
|
|
dstar.run(s_start, s_goal)
|
|
dstar.run(s_start, s_goal)
|
|
|
|
|
|
|
|
|
|
|