ToB企服应用市场:ToB评测及商务社交产业平台

标题: 兰顿蚂蚁:从无序到有序的巨大征程 [打印本页]

作者: 花瓣小跑    时间: 2024-5-17 23:13
标题: 兰顿蚂蚁:从无序到有序的巨大征程
1. 问题

在一个1000*1000格子的棋盘上,有一只蚂蚁(ant),蚂蚁的爬行规则是:(1)如果蚂蚁地点的棋盘是白色的,则蚂蚁将地点格子设置为黑色,并向右边爬行一个格子。(2)如果蚂蚁地点的棋盘是黑色的,则蚂蚁将地点格子设置为白色,并向左边爬行一个格子。问:请表现蚂蚁爬行10000次后,棋盘的样子。
2. 思索

首先,我们需要创建一个棋盘类(Board)和一个蚂蚁类(Ant)。棋盘类包含一个二维数组表示棋盘的状态,以及一个方法用于表现棋盘。蚂蚁类包含蚂蚁当前的位置和爬行方法。
解析:
3. 代码

3.1 设计 Board类 和 Ant 类, 代码如下:
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. class Board:
  4.     def __init__(self, size):
  5.         self.size = size
  6.         # 创建初始棋盘,设置为全0的格子: 注意: 0 表示 白色,1表示 黑色
  7.         self.board = np.zeros((size, size))
  8.         
  9.     def display(self):
  10.         # Create the figure and axes
  11.         fig, ax = plt.subplots()
  12.         # Display the array as an image using imshow
  13.         # cmap='gray' sets the colormap to grayscale
  14.         # imshow 似乎 0 表示黑的,1 表示白色,因此,我这里用函数 np.logical_not()取反了一下
  15.         plt.imshow(np.logical_not(self.board), cmap='gray')  
  16.         # Set axis labels and title (optional)
  17.         ax.set_xlabel("X-axis")
  18.         ax.set_ylabel("Y-axis")
  19.         ax.set_title("Footprint of Ant on 2D World")
  20.         # Display the plot
  21.         plt.show()
  22.                
  23.                
  24. class Ant:
  25.     def __init__(self, board):
  26.         # 假定初始在 棋盘中央
  27.         self.x = board.size // 2
  28.         self.y = board.size // 2
  29.         # 假定初始方向朝上, 90度
  30.         self.direction = 90
  31.         
  32.     def climb_one(self, board):
  33.         if self.direction == 0 :       # right, 向右边爬行一格
  34.             self.x = self.x + 1
  35.         elif self.direction == 270:    # down,  向下爬行一格
  36.             self.y = self.y - 1            
  37.         elif self.direction == 180:    # left,   向左爬行一格
  38.             self.x = self.x - 1
  39.         elif self.direction == 90:     # up,     向上爬行一格
  40.             self.y = self.y + 1  
  41.         # 处理一下跑出边界问题:
  42.         #    如果小于0, 则移动到最大值处, PS: 这样设置是有部分道理的,因为小于0 时候,direction是向左 或 向上的,
  43.         #                                 移动到最大值时候,ant 方向向内
  44.         #    如果大于最大值,则移动到0 处
  45.         if self.x == -1 :
  46.             self.x = board.size - 1
  47.         if self.y == -1 :
  48.             self.y = board.size - 1
  49.         if self.x == board.size - 1 :
  50.             self.x = 0
  51.         if self.y == board.size - 1 :
  52.             self.y = 0
  53.                        
  54.     def move(self, board):
  55.         if board.board[self.x][self.y] == 0:  # 原来是白色0
  56.             # Step 1: 脚下格子设置为黑色1
  57.             board.board[self.x][self.y] = 1   
  58.             # Step 2: 右转
  59.             self.direction = (self.direction - 90) % 360
  60.             # Step 3:爬行一格
  61.             self.climb_one(board)
  62.         else:   # 原来是黑色1
  63.             # Step 1: 脚下格子设置为白色0
  64.             board.board[self.x][self.y] = 0
  65.             # Step 2:左 转
  66.             self.direction = (self.direction + 90) % 360
  67.             # Step 3:爬行一格
  68.             self.climb_one(board)
  69.                        
  70.                        
复制代码
3.2 测试代码
  1. def run():
  2.     board = Board(250)       # 棋盘大小设置
  3.     ant = Ant(board)
  4.    
  5.     for _ in range(1000000):   # 蚂蚁爬行次数
  6.         ant.move(board)
  7.    
  8.     print("moving ......")
  9.     board.display()
  10. if __name__ == '__main__':
  11.     run()
  12.        
  13.        
复制代码
4 结果展示

4.1 蚂蚁初始方向头朝上,棋盘 100* 100 , 爬行 15000次


4.2 蚂蚁初始方向头朝上,棋盘 100* 100 , 爬行 1000次


4.3 蚂蚁初始方向头朝上,棋盘 1000* 1000 , 爬行 50000次


4.4 蚂蚁初始方向头朝,棋盘 250* 250 , 爬行 50000次


4.5 蚂蚁初始方向头朝,棋盘 250* 250 , 爬行 100W次



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4