Skip to content

Instantly share code, notes, and snippets.

@AngelicosPhosphoros
Created September 10, 2018 22:02
Show Gist options
  • Save AngelicosPhosphoros/f65e69422395d403c2c43c19de6fa1bb to your computer and use it in GitHub Desktop.
Save AngelicosPhosphoros/f65e69422395d403c2c43c19de6fa1bb to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# I. Generate all lattice walks, 2D square lattice"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"# This I showed in class:\n",
"\n",
"INF = float('inf')\n",
" \n",
"def generate_walks(init_point, n, check_intersections=True,\n",
" x_limits=(-INF, INF), y_limits=(-INF, INF)):\n",
" def append_and_ret(l, x):\n",
" l.append(x)\n",
" return l\n",
" def generate_walks_internal(init_point, used_points, n, check_intersections,\n",
" x_limits, y_limits):\n",
" if n <= 0:\n",
" return [[init_point]]\n",
" if check_intersections:\n",
" used_points.add(init_point)\n",
" answers = []\n",
" for move in [(-1,0),(1,0),(0,-1),(0,1)]:\n",
" nxt = (init_point[0] + move[0], init_point[1] + move[1])\n",
" if check_intersections and nxt in used_points:\n",
" continue\n",
" if nxt[0] < x_limits[0] or nxt[0] > x_limits[1] \\\n",
" or nxt[1] < y_limits[0] or nxt[1] > y_limits[1]:\n",
" continue \n",
" sub_answers = generate_walks_internal(nxt, used_points, n-1, check_intersections, x_limits, y_limits)\n",
" answers += [append_and_ret(x,init_point) for x in sub_answers] # We grow list by adding to end on O(1)\n",
" if check_intersections:\n",
" used_points.remove(init_point)\n",
" return answers\n",
" # revert them for further processing\n",
" return [list(reversed(x)) for x in generate_walks_internal(init_point, set(), n, check_intersections,\n",
" x_limits, y_limits)]\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## This is list with intersection checking"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"36\n"
]
},
{
"data": {
"text/plain": [
"[[(0, 0), (-1, 0), (-2, 0), (-3, 0)],\n",
" [(0, 0), (-1, 0), (-2, 0), (-2, -1)],\n",
" [(0, 0), (-1, 0), (-2, 0), (-2, 1)],\n",
" [(0, 0), (-1, 0), (-1, -1), (-2, -1)],\n",
" [(0, 0), (-1, 0), (-1, -1), (0, -1)],\n",
" [(0, 0), (-1, 0), (-1, -1), (-1, -2)],\n",
" [(0, 0), (-1, 0), (-1, 1), (-2, 1)],\n",
" [(0, 0), (-1, 0), (-1, 1), (0, 1)],\n",
" [(0, 0), (-1, 0), (-1, 1), (-1, 2)],\n",
" [(0, 0), (1, 0), (2, 0), (3, 0)],\n",
" [(0, 0), (1, 0), (2, 0), (2, -1)],\n",
" [(0, 0), (1, 0), (2, 0), (2, 1)],\n",
" [(0, 0), (1, 0), (1, -1), (0, -1)],\n",
" [(0, 0), (1, 0), (1, -1), (2, -1)],\n",
" [(0, 0), (1, 0), (1, -1), (1, -2)],\n",
" [(0, 0), (1, 0), (1, 1), (0, 1)],\n",
" [(0, 0), (1, 0), (1, 1), (2, 1)],\n",
" [(0, 0), (1, 0), (1, 1), (1, 2)],\n",
" [(0, 0), (0, -1), (-1, -1), (-2, -1)],\n",
" [(0, 0), (0, -1), (-1, -1), (-1, -2)],\n",
" [(0, 0), (0, -1), (-1, -1), (-1, 0)],\n",
" [(0, 0), (0, -1), (1, -1), (2, -1)],\n",
" [(0, 0), (0, -1), (1, -1), (1, -2)],\n",
" [(0, 0), (0, -1), (1, -1), (1, 0)],\n",
" [(0, 0), (0, -1), (0, -2), (-1, -2)],\n",
" [(0, 0), (0, -1), (0, -2), (1, -2)],\n",
" [(0, 0), (0, -1), (0, -2), (0, -3)],\n",
" [(0, 0), (0, 1), (-1, 1), (-2, 1)],\n",
" [(0, 0), (0, 1), (-1, 1), (-1, 0)],\n",
" [(0, 0), (0, 1), (-1, 1), (-1, 2)],\n",
" [(0, 0), (0, 1), (1, 1), (2, 1)],\n",
" [(0, 0), (0, 1), (1, 1), (1, 0)],\n",
" [(0, 0), (0, 1), (1, 1), (1, 2)],\n",
" [(0, 0), (0, 1), (0, 2), (-1, 2)],\n",
" [(0, 0), (0, 1), (0, 2), (1, 2)],\n",
" [(0, 0), (0, 1), (0, 2), (0, 3)]]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"moves = generate_walks((0,0), 3)\n",
"print(len(moves))\n",
"moves"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## This is list without intersection checking"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"64\n"
]
},
{
"data": {
"text/plain": [
"[[(0, 0), (-1, 0), (-2, 0), (-3, 0)],\n",
" [(0, 0), (-1, 0), (-2, 0), (-1, 0)],\n",
" [(0, 0), (-1, 0), (-2, 0), (-2, -1)],\n",
" [(0, 0), (-1, 0), (-2, 0), (-2, 1)],\n",
" [(0, 0), (-1, 0), (0, 0), (-1, 0)],\n",
" [(0, 0), (-1, 0), (0, 0), (1, 0)],\n",
" [(0, 0), (-1, 0), (0, 0), (0, -1)],\n",
" [(0, 0), (-1, 0), (0, 0), (0, 1)],\n",
" [(0, 0), (-1, 0), (-1, -1), (-2, -1)],\n",
" [(0, 0), (-1, 0), (-1, -1), (0, -1)],\n",
" [(0, 0), (-1, 0), (-1, -1), (-1, -2)],\n",
" [(0, 0), (-1, 0), (-1, -1), (-1, 0)],\n",
" [(0, 0), (-1, 0), (-1, 1), (-2, 1)],\n",
" [(0, 0), (-1, 0), (-1, 1), (0, 1)],\n",
" [(0, 0), (-1, 0), (-1, 1), (-1, 0)],\n",
" [(0, 0), (-1, 0), (-1, 1), (-1, 2)],\n",
" [(0, 0), (1, 0), (0, 0), (-1, 0)],\n",
" [(0, 0), (1, 0), (0, 0), (1, 0)],\n",
" [(0, 0), (1, 0), (0, 0), (0, -1)],\n",
" [(0, 0), (1, 0), (0, 0), (0, 1)],\n",
" [(0, 0), (1, 0), (2, 0), (1, 0)],\n",
" [(0, 0), (1, 0), (2, 0), (3, 0)],\n",
" [(0, 0), (1, 0), (2, 0), (2, -1)],\n",
" [(0, 0), (1, 0), (2, 0), (2, 1)],\n",
" [(0, 0), (1, 0), (1, -1), (0, -1)],\n",
" [(0, 0), (1, 0), (1, -1), (2, -1)],\n",
" [(0, 0), (1, 0), (1, -1), (1, -2)],\n",
" [(0, 0), (1, 0), (1, -1), (1, 0)],\n",
" [(0, 0), (1, 0), (1, 1), (0, 1)],\n",
" [(0, 0), (1, 0), (1, 1), (2, 1)],\n",
" [(0, 0), (1, 0), (1, 1), (1, 0)],\n",
" [(0, 0), (1, 0), (1, 1), (1, 2)],\n",
" [(0, 0), (0, -1), (-1, -1), (-2, -1)],\n",
" [(0, 0), (0, -1), (-1, -1), (0, -1)],\n",
" [(0, 0), (0, -1), (-1, -1), (-1, -2)],\n",
" [(0, 0), (0, -1), (-1, -1), (-1, 0)],\n",
" [(0, 0), (0, -1), (1, -1), (0, -1)],\n",
" [(0, 0), (0, -1), (1, -1), (2, -1)],\n",
" [(0, 0), (0, -1), (1, -1), (1, -2)],\n",
" [(0, 0), (0, -1), (1, -1), (1, 0)],\n",
" [(0, 0), (0, -1), (0, -2), (-1, -2)],\n",
" [(0, 0), (0, -1), (0, -2), (1, -2)],\n",
" [(0, 0), (0, -1), (0, -2), (0, -3)],\n",
" [(0, 0), (0, -1), (0, -2), (0, -1)],\n",
" [(0, 0), (0, -1), (0, 0), (-1, 0)],\n",
" [(0, 0), (0, -1), (0, 0), (1, 0)],\n",
" [(0, 0), (0, -1), (0, 0), (0, -1)],\n",
" [(0, 0), (0, -1), (0, 0), (0, 1)],\n",
" [(0, 0), (0, 1), (-1, 1), (-2, 1)],\n",
" [(0, 0), (0, 1), (-1, 1), (0, 1)],\n",
" [(0, 0), (0, 1), (-1, 1), (-1, 0)],\n",
" [(0, 0), (0, 1), (-1, 1), (-1, 2)],\n",
" [(0, 0), (0, 1), (1, 1), (0, 1)],\n",
" [(0, 0), (0, 1), (1, 1), (2, 1)],\n",
" [(0, 0), (0, 1), (1, 1), (1, 0)],\n",
" [(0, 0), (0, 1), (1, 1), (1, 2)],\n",
" [(0, 0), (0, 1), (0, 0), (-1, 0)],\n",
" [(0, 0), (0, 1), (0, 0), (1, 0)],\n",
" [(0, 0), (0, 1), (0, 0), (0, -1)],\n",
" [(0, 0), (0, 1), (0, 0), (0, 1)],\n",
" [(0, 0), (0, 1), (0, 2), (-1, 2)],\n",
" [(0, 0), (0, 1), (0, 2), (1, 2)],\n",
" [(0, 0), (0, 1), (0, 2), (0, 1)],\n",
" [(0, 0), (0, 1), (0, 2), (0, 3)]]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"moves = generate_walks((0,0), 3, check_intersections=False)\n",
"print(len(moves))\n",
"moves"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 0\n",
"\n",
"Compute the average end-to-end distance of random walks of a given length. What is the scaling of the end-to-end distance with the length of the walk? What is the scaling of the mean *square* end-to-end distance with the length?"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[(0, 0.0, 0.0), (1, 1.0, 1.0), (2, 1.5, 2.0), (3, 1.875, 3.0), (4, 2.1875, 4.0), (5, 2.4609375, 5.0), (6, 2.70703125, 6.0), (7, 2.9326171875, 7.0), (8, 3.14208984375, 8.0), (9, 3.338470458984375, 9.0)]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"results = []\n",
"for L in range(10):\n",
" w = generate_walks((0,0), L, check_intersections=False)\n",
" dif = lambda a,b: (a[0]-b[0], a[1]-b[1])\n",
" vects = list(map(lambda p:dif(p[-1],p[0]), w)) # total change of coord\n",
" len_manh = sum(map(lambda x:abs(x[0])+abs(x[1]), vects))/len(vects) # Manhattan metric\n",
" len_sq = sum(map(lambda x:x[0]*x[0]+x[1]*x[1], vects))/len(vects) # squared euclidian metric\n",
" results.append((L, len_manh, len_sq))\n",
"\n",
"print (results)\n",
"import matplotlib.pyplot as plt\n",
"plt.plot([x[0] for x in results], [x[1] for x in results])\n",
"plt.plot([x[0] for x in results], [x[2] for x in results])\n",
"plt.plot([x[0] for x in results], [x[2]**0.5 for x in results])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 1\n",
"\n",
"How many walks of a given length are there? What is the mean end-to-end distance of walks of a given length? What is mean *square* of the end-to-end distance?"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[(0, 0.0, 0.0),\n",
" (1, 1.0, 1.0),\n",
" (2, 2.0, 2.6666666666666665),\n",
" (3, 2.5555555555555554, 4.555555555555555),\n",
" (4, 3.2, 7.04),\n",
" (5, 3.704225352112676, 9.56338028169014),\n",
" (6, 4.276923076923077, 12.574358974358974),\n",
" (7, 4.731123388581952, 15.556169429097606),\n",
" (8, 5.249492900608519, 19.012846517917513),\n",
" (9, 5.67863289894271, 22.411359724612737)]"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# This is with checking intersections\n",
"results = []\n",
"for L in range(10):\n",
" w = generate_walks((0,0), L)\n",
" dif = lambda a,b: (a[0]-b[0], a[1]-b[1])\n",
" vects = list(map(lambda p:dif(p[-1],p[0]), w)) # total change of coord\n",
" len_manh = sum(map(lambda x:abs(x[0])+abs(x[1]), vects))/len(vects) # Manhattan metric\n",
" len_sq = sum(map(lambda x:x[0]*x[0]+x[1]*x[1], vects))/len(vects) # squared euclidian metric\n",
" results.append((L, len_manh, len_sq))\n",
"\n",
"results"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"plt.plot([x[0] for x in results], [x[1] for x in results], 'b')\n",
"plt.plot([x[0] for x in results], [x[2] for x in results], 'g')\n",
"plt.plot([x[0] for x in results], [x[2]**0.5 for x in results], 'r')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Extra tasks (for fun, no credit, a possible basis of a course project)\n",
"\n",
"1. Triangular lattice\n",
"2. Rewrite the recursive algorithm to use a queue"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment