Skip to content

Commit

Permalink
add testing module&modify several tasks
Browse files Browse the repository at this point in the history
  • Loading branch information
Mac1024 authored and Mac1024 committed Aug 28, 2018
1 parent 81c22fa commit 5bee397
Show file tree
Hide file tree
Showing 3 changed files with 142 additions and 36 deletions.
94 changes: 78 additions & 16 deletions P1_Robot_Controller/Robot Controller.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,15 @@
"print(\"迷宫中,第一行共有\", number_of_barriers_row1, \"个障碍物,第三列共有\", number_of_barriers_col3, \"个障碍物。\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%run -i -e test.py RobotControllortTestCase.test_cal_barriers"
]
},
{
"cell_type": "markdown",
"metadata": {},
Expand All @@ -143,7 +152,7 @@
"\n",
"**任务3:**在如下代码中:\n",
"\n",
"1. 创建一个名为 `loc_map` 的字典,它有两个键值,分别为 `start` 和 `destination`,对应的值分别为起点和目标点的坐标,它们以如 `(1,1)` 的形式保存为元组。\n",
"1. 创建一个名为 `loc_map` 的字典,它有两个键值,分别为 `start` 和 `destination`,对应的值分别为起点和目标点的坐标,它们以如 `(0,0)` 的形式保存为元组。\n",
"2. 从字典中取出 `start` 对应的值,保存在 `robot_current_loc` 对应的变量中,这个变量表示小车现在的位置。"
]
},
Expand All @@ -158,6 +167,15 @@
"robot_current_loc = None #TODO 7保存机器人当前的位置"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%run -i -e test.py RobotControllortTestCase.test_cal_loc_map"
]
},
{
"cell_type": "markdown",
"metadata": {},
Expand Down Expand Up @@ -200,7 +218,7 @@
"metadata": {},
"outputs": [],
"source": [
"def is_move_valid_sepcial(loc, act):\n",
"def is_move_valid_special(loc, act):\n",
" \"\"\"\n",
" Judge wether the robot can take action act\n",
" at location loc.\n",
Expand All @@ -213,12 +231,20 @@
" pass"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%run -i -e test.py RobotControllortTestCase.test_is_move_valid_special"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"**任务5:**在下方代码中,重新实现一个名为 `is_move_valid` 的函数,它有三个输入,分别为模拟环境的数据 `env_data`、机器人所在的位置坐标 `loc`、以及即将执行的动作 `act`。它的返回值与此前一样,是一个布尔值,表明小车在给定的虚拟环境中的 `loc` 位置下,是否可以执行动作 `act`。"
]
},
Expand All @@ -242,15 +268,29 @@
" pass"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%run -i -e test.py RobotControllortTestCase.test_is_move_valid"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"**任务6:**请回答:**在任务4及任务5中的实现的两个函数中,`env_data` 这个变量有什么不同?**\n",
"**任务6:**请回答:\n",
" 1. 在任务4及任务5中的实现的两个函数中,`env_data` 这个变量有什么不同?\n",
" 2. 调用``is_move_valid``函数,参数为``env_data_``、``loc_``、``act_``,如果在函数内修改``env_data``是否会改变``env_data_``的值?为什么?\n",
" \n",
"提示:_可以尝试从变量作用域的角度回答该问题1。_\n",
"\n",
"提示:_可以尝试从变量作用域的角度回答该问题。_\n",
"\n",
"提示:_可以尝试从可变类型变量和不可变类型变量的角度回答该问题2。_\n",
"\n"
]
},
Expand All @@ -271,7 +311,7 @@
"\n",
"---\n",
"\n",
"**任务7:**编写一个名为 `valid_actions` 的函数。它有两个输入,分别为虚拟环境的数据 `env_data`,以及机器人所在的位置 `loc`,输出是一个列表,表明机器人在这个位置所有的可行动作。\n",
"**任务6:**编写一个名为 `valid_actions` 的函数。它有两个输入,分别为虚拟环境的数据 `env_data`,以及机器人所在的位置 `loc`,输出是一个列表,表明机器人在这个位置所有的可行动作。\n",
"\n",
"提示:*可以尝试调用上方定义的`is_move_valid`函数。*\n"
]
Expand All @@ -285,6 +325,15 @@
"## TODO 10 从头定义、实现你的函数"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%run -i -e test.py RobotControllortTestCase.test_valid_actions"
]
},
{
"cell_type": "markdown",
"metadata": {},
Expand All @@ -295,7 +344,7 @@
"\n",
"当机器人收到一个动作的时候,你机器人的位置应发生相应的变化。\n",
"\n",
"**任务8:**编写一个名为 `move_robot` 的函数,它有两个输入,分别为机器人当前所在的位置 `loc` 和即将执行的动作 `act`。接着会返回机器人执行动作之后的新位置 `new_loc`。"
"**任务7:**编写一个名为 `move_robot` 的函数,它有两个输入,分别为机器人当前所在的位置 `loc` 和即将执行的动作 `act`。接着会返回机器人执行动作之后的新位置 `new_loc`。"
]
},
{
Expand All @@ -307,6 +356,15 @@
"##TODO 11 从头定义、实现你的函数"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%run -i -e test.py RobotControllortTestCase.test_move_robot"
]
},
{
"cell_type": "markdown",
"metadata": {},
Expand All @@ -317,7 +375,7 @@
"\n",
"接着,我们尝试在虚拟环境中随机移动机器人,看看会有什么效果。\n",
"\n",
"**任务9:**编写一个名为 `random_choose_actions` 的函数,它有两个输入,分别为虚拟环境的数据 `env_data`,以及机器人所在的位置 `loc`。机器人会执行一个300次的循环,每次循环,他会执行以下任务:\n",
"**任务8:**编写一个名为 `random_choose_actions` 的函数,它有两个输入,分别为虚拟环境的数据 `env_data`,以及机器人所在的位置 `loc`。机器人会执行一个300次的循环,每次循环,他会执行以下任务:\n",
"\n",
"1. 利用上方定义的 `valid_actions` 函数,找出当前位置下,机器人可行的动作;\n",
"2. 利用 `random` 库中的 `choice` 函数,从机器人可行的动作中,随机挑选出一个动作;\n",
Expand Down Expand Up @@ -361,13 +419,17 @@
"\n",
"在这里,你将综合上述的知识,编码控制机器人走到终点。这个任务对刚刚入门的你来说可能有些挑战,所以它是一个选做题。\n",
"\n",
"**任务10**:尝试实现一个算法,能够对给定的模拟环境,输出机器人的行动策略,使之能够走到终点。\n",
"\n",
"提示:_你可以尝试参考 [A星算法](https://zh.wikipedia.org/wiki/A*%E6%90%9C%E5%AF%BB%E7%AE%97%E6%B3%95) 。_\n",
"以及以下参考资料:\n",
"* https://baike.baidu.com/item/A%2A算法\n",
"\n",
"* https://blog.csdn.net/hitwhylz/article/details/23089415"
"**任务9**:尝试实现一个算法,能够对给定的模拟环境,输出机器人的行动策略,使之能够走到终点。\n",
"\n",
"提示:_你可以尝试参考:_\n",
"* 深度/广度优先算法。\n",
" 以及以下参考资料:\n",
" 1. https://blog.csdn.net/raphealguo/article/details/7523411 \n",
" 2. https://www.cnblogs.com/yupeng/p/3414736.html \n",
"* A星算法。\n",
" 以及以下参考资料:\n",
" 1. https://baike.baidu.com/item/A%2A算法 \n",
" 2. https://blog.csdn.net/hitwhylz/article/details/23089415"
]
},
{
Expand Down Expand Up @@ -403,7 +465,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
"version": "3.6.5"
}
},
"nbformat": 4,
Expand Down
25 changes: 5 additions & 20 deletions P1_Robot_Controller/helper.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,33 +1,18 @@
import random
import time

MAZE_1 = [
[0,0,0,0,0,2,3],
[1,2,2,2,0,2,0],
[2,0,0,0,0,2,0],
[2,2,2,2,0,0,0]]

MAZE_2 = [
[2,2,3,0,2,0],
[1,2,2,0,2,0],
[0,0,2,0,2,0],
[2,0,2,0,0,0],
[2,0,0,0,2,0]]

MAZE_3 = [
MAZE = [
[3,2,2,2,2,2,2,2,1],
[0,0,2,2,2,2,2,0,0],
[2,0,0,2,2,2,0,0,2],
[2,2,0,0,2,0,0,2,2],
[2,2,2,0,0,0,2,2,2]]

MAZE_LIST = [MAZE_1, MAZE_2, MAZE_3]

def fetch_maze():
maze_id = random.randint(0,len(MAZE_LIST)-1)
print("maze-id {}-{}".format(1, round(time.time())))
print('['+str(MAZE_LIST[maze_id][0])+',')
for line in MAZE_LIST[maze_id][1:-1]:
print('['+str(MAZE[0])+',')
for line in MAZE[1:-1]:
print(' '+str(line)+',')
print(' '+str(MAZE_LIST[maze_id][-1])+']')
return MAZE_LIST[maze_id]
print(' '+str(MAZE[-1])+']')
return MAZE
59 changes: 59 additions & 0 deletions P1_Robot_Controller/test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import unittest


class RobotControllortTestCase(unittest.TestCase):
"""Test for Robot Controller project"""

def test_cal_barriers(self):
self.assertEqual(number_of_barriers_row1, 7)
self.assertEqual(number_of_barriers_col3, 3)

def test_cal_loc_map(self):
self.assertEqual(loc_map["start"], (0, 8))
self.assertEqual(loc_map["destination"], (0, 0))

def test_is_move_valid(self):
self.assertEqual(is_move_valid(env_data, (0, 0), 'u'), False)
self.assertEqual(is_move_valid(env_data, (0, 0), 'l'), False)

self.assertEqual(is_move_valid(env_data, (4, 0), 'd'), False)
self.assertEqual(is_move_valid(env_data, (0, 8), 'r'), False)

self.assertEqual(is_move_valid(env_data, (0, 0), 'r'), False)
self.assertEqual(is_move_valid(env_data, (1, 0), 'd'), False)

self.assertEqual(is_move_valid(env_data, (1, 7), 'd'), True)
self.assertEqual(is_move_valid(env_data, (3, 5), 'r'), True)

self.assertEqual(is_move_valid(env_data, (1, 0), 'u'), True)

def test_is_move_valid_special(self):
self.assertEqual(is_move_valid_special((0, 0), 'u'), False)
self.assertEqual(is_move_valid_special((0, 0), 'l'), False)

self.assertEqual(is_move_valid_special((4, 0), 'd'), False)
self.assertEqual(is_move_valid_special((0, 8), 'r'), False)

self.assertEqual(is_move_valid_special((0, 0), 'r'), False)
self.assertEqual(is_move_valid_special((1, 0), 'd'), False)

self.assertEqual(is_move_valid_special((1, 7), 'd'), True)
self.assertEqual(is_move_valid_special((3, 5), 'r'), True)

self.assertEqual(is_move_valid_special((1, 0), 'u'), True)



def test_valid_actions(self):
self.assertEqual(valid_actions(env_data, (0, 8)), ['d'])
self.assertEqual(valid_actions(env_data, (1, 0)), ['u', 'r'])

def test_move_robot(self):
self.assertEqual(move_robot((1, 0), 'u'), (0, 0))
self.assertEqual(move_robot((0, 8), 'd'), (1, 8))
self.assertEqual(move_robot((3, 3), 'l'), (3, 2))
self.assertEqual(move_robot((1, 0), 'r'), (1, 1))


if __name__ == '__main__':
unittest.main()

0 comments on commit 5bee397

Please sign in to comment.