首页 > 其他分享 >兰顿蚂蚁:从无序到有序的伟大征程

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

时间:2024-04-21 10:45:10浏览次数:29  
标签:蚂蚁 self 兰顿 无序 爬行 board 棋盘 征程 size

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次

image

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

image

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

image

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

image

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

image

标签:蚂蚁,self,兰顿,无序,爬行,board,棋盘,征程,size
From: https://www.cnblogs.com/juking/p/18148657

相关文章

  • 迈向人工智能LLM的新征程:我的2023年转行之旅
    随着2023年的日历即将翻到最后一页,我迎来了人生中的一个重要转折点——转行进入人工智能LLM领域。这是一个充满挑战和机遇的新征程,我满怀期待地踏上了这片未知而又充满可能性的土地。大型语言模型(LLM)作为人工智能的重要分支,近年来取得了令人瞩目的进展。它们在自然语言处理、文本......
  • 解锁光纤的力量:通往连接与未来的征程
    在一个信息以光速传播的世界中,连接性是进步的关键。而在这个数字革命的核心,隐藏着一个微小的英雄——光纤。是的,那根不起眼的玻璃或塑料丝是我们互联生活中默默无闻的英雄。让我们深入探讨光纤的世界,看看它如何塑造着我们的未来。一.光纤的革命还记得拨号上网的日子吗?那种焦......
  • day9 无序序列
    一、字典(dict)字典是一种无序的,可变的的序列,它的元素以键值对的形式存在,我们之前学的列表和元祖是有序的,在底层是紧挨一起存放的。 字典是唯一的映射类型,就是说通过一个元素可以找到另外一个元素,就像搜索引擎一样用正则表达式匹配关键字,进行搜索。1.1字典的创建键值......
  • 【数据结构】一元多项式的表示与相加(无序输入 有序输出)
    一元多项式的表示与运算——课程设计(无序输入有序输出)目录一元多项式的表示与运算——课程设计(无序输入有序输出)一.例题:(输入无序,指数升序排列的一元多项式)1.链表结点定义2.创建单链表存放一元多项式(将无序的输入有序存放于链表)3.输出一元多项式4.一元多项式求值......
  • C++示例:学习C++标准库,std::unordered_map无序关联容器的使用
    01std::unordered_map介绍std::unordered_map是C++标准库中的一种无序关联容器模板类,它提供了一种将键映射到值的方法。它的底层基于哈希表实现,内容是无序的,可以在平均情况下在O(1)的时间复杂度内完成插入、查找和删除操作。值得注意的是,哈希表可能存在冲突,即不同的键值......
  • 41无序关联容器与有序关联容器
    无序关联容器与有序关联容器参考迭代器普通的正向迭代器iterator反向迭代器reverse_iterator常量迭代器:const_iterator是iterator的基类,返回一个常指针vector<int>vec;vector<int>::iteratorit=vec.begin();//可以通过*it修改vec的值vector<int>::reverse_iterator......
  • [Go] go for range循环map是无序的 变成有序
    goforrange循环map是无序的,这个是goteam团队有意为之在进行循环遍历的时候,生成了一个随机数作为遍历开始的位置可以forrange循环map取出所有的key,sort.Strings(keys),排序所有的keys再循环所有的keys,按这个循环取出map里的值如果不依赖map中的key的话,或......
  • 2024,写作新征程
    layout:posttitle:"2024,新征程"tags:-"写作"category:"写作"description:"我的《大道至简,给所有人看的编程书》终于在今年最后一天收获了第600个订阅,达到了预设目标。明年,继续努力。"转眼,2023年已过去十分之一了。然而,在大多数人心里,年三十才算是过年,所以,今天是传......
  • 万字长文|院长寄语:知之,好之,乐之——中电金信研究院三年征程回望(下)
    04 从市场追随者到“市场定义者” 近几年,经过集团公司在承担国家战略任务、垂直打穿、系统工程和智算升级等领域的牵引和指导,随着“源启+”战略的展开,中电金信开始在某些领域成为“市场定义者”。 时至今日,中国的IT供应商包括互联网厂商,无论在技术还是在市场上,通常都是以国际先......
  • 万字长文|院长寄语:知之,好之,乐之——中电金信研究院三年征程回望(下)
    04 从市场追随者到“市场定义者” 近几年,经过集团公司在承担国家战略任务、垂直打穿、系统工程和智算升级等领域的牵引和指导,随着“源启+”战略的展开,中电金信开始在某些领域成为“市场定义者”。 时至今日,中国的IT供应商包括互联网厂商,无论在技术还是在市场上,通常都是......