兰顿蚂蚁:从无序到有序的伟大征程

1. 问题

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

2. 思考

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

解析:

  1. 创建棋盘类(Board),包含一个二维数组表示棋盘状态,以及一个方法用于显示棋盘。
  2. 创建蚂蚁类(Ant),包含蚂蚁当前的位置.方向,和爬行方法 move。
  3. 在主函数中,创建一个1000*1000的棋盘实例和一个蚂蚁实例。
  4. 让蚂蚁爬行10000次。
  5. 显示爬行后的棋盘状态。

3. 代码

3.1 设计 Board类 和 Ant 类, 代码如下:

复制代码
import matplotlib.pyplot as plt
import numpy as np

class Board:
    def __init__(self, size):
        self.size = size
        # 创建初始棋盘,设置为全0的格子: 注意: 0 表示 白色,1表示 黑色
        self.board = np.zeros((size, size))
        
    def display(self):
        # Create the figure and axes
        fig, ax = plt.subplots()
        # Display the array as an image using imshow
        # cmap='gray' sets the colormap to grayscale
        # imshow 似乎 0 表示黑的,1 表示白色,因此,我这里用函数 np.logical_not()取反了一下 
        plt.imshow(np.logical_not(self.board), cmap='gray')  
        # Set axis labels and title (optional)
        ax.set_xlabel("X-axis")
        ax.set_ylabel("Y-axis")
        ax.set_title("Footprint of Ant on 2D World")
        # Display the plot
        plt.show()
		
		
class Ant:
    def __init__(self, board):
        # 假定初始在 棋盘中央
        self.x = board.size // 2
        self.y = board.size // 2
        # 假定初始方向朝上, 90度
        self.direction = 90
        
    def climb_one(self, board):
        if self.direction == 0 :       # right, 向右边爬行一格
            self.x = self.x + 1
        elif self.direction == 270:    # down,  向下爬行一格
            self.y = self.y - 1             
        elif self.direction == 180:    # left,   向左爬行一格
            self.x = self.x - 1
        elif self.direction == 90:     # up,     向上爬行一格
            self.y = self.y + 1  
        # 处理一下跑出边界问题:
        #    如果小于0, 则移动到最大值处, PS: 这样设置是有部分道理的,因为小于0 时候,direction是向左 或 向上的,
        #                                 移动到最大值时候,ant 方向向内
        #    如果大于最大值,则移动到0 处
        if self.x == -1 : 
            self.x = board.size - 1
        if self.y == -1 : 
            self.y = board.size - 1
        if self.x == board.size - 1 : 
            self.x = 0
        if self.y == board.size - 1 : 
            self.y = 0
			
    def move(self, board):
        if board.board[self.x][self.y] == 0:  # 原来是白色0 
            # Step 1: 脚下格子设置为黑色1 
            board.board[self.x][self.y] = 1   
            # Step 2: 右转
            self.direction = (self.direction - 90) % 360
            # Step 3:爬行一格
            self.climb_one(board)
        else:   # 原来是黑色1 
            # Step 1: 脚下格子设置为白色0
            board.board[self.x][self.y] = 0
            # Step 2:左 转
            self.direction = (self.direction + 90) % 360
            # Step 3:爬行一格
            self.climb_one(board)

3.2 测试代码

复制代码
def run():
    board = Board(250)       # 棋盘大小设置
    ant = Ant(board)
    
    for _ in range(1000000):   # 蚂蚁爬行次数
        ant.move(board)
    
    print("moving ......")
    board.display()

if __name__ == '__main__':
    run()

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次

相关推荐
Element_南笙14 分钟前
吴恩达新课程:Agentic AI(笔记2)
数据库·人工智能·笔记·python·深度学习·ui·自然语言处理
倔强青铜三23 分钟前
苦练Python第69天:subprocess模块从入门到上瘾,手把手教你驯服系统命令!
人工智能·python·面试
倔强青铜三27 分钟前
苦练 Python 第 68 天:并发狂飙!concurrent 模块让你 CPU 原地起飞
人工智能·python·面试
星期天要睡觉1 小时前
深度学习——循环神经网络(RNN)实战项目:基于PyTorch的文本情感分析
人工智能·python·rnn·深度学习·神经网络
ERROR_LESS1 小时前
【ADS-1】【python基础-2】基本语法与数据结构(列表、字典、集合)
python
2401_841495641 小时前
【数据结构】基于Floyd算法的最短路径求解
java·数据结构·c++·python·算法··floyd
一晌小贪欢1 小时前
Python爬虫第6课:Selenium自动化浏览器与动态内容抓取
爬虫·python·selenium·网络爬虫·python基础·python3·pathon爬虫
番石榴AI2 小时前
自己动手做一款ChatExcel数据分析系统,智能分析 Excel 数据
人工智能·python·数据挖掘·excel
星期天要睡觉2 小时前
深度学习——循环神经网络(RNN)
人工智能·python·rnn·深度学习·神经网络
Blossom.1183 小时前
把AI“撒”进农田:基于极值量化与状态机的1KB边缘灌溉决策树
人工智能·python·深度学习·算法·目标检测·决策树·机器学习