亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

掃地機(jī)器人的模擬程序 (4)

thekingisalwaysluc / 2853人閱讀

摘要:尋路模塊通過一番尋找,發(fā)現(xiàn)這系列文章,其不僅包含算法,連尋路算法中的一些基礎(chǔ)知識(shí)也一并介紹了,不愧是斯坦福出品,也很感謝譯者要實(shí)現(xiàn)點(diǎn)到點(diǎn)最短路徑,還需要做一些微小的工作,下面逐個(gè)說明計(jì)算曼哈頓距離的函數(shù)目的是尋路,肯定需要一個(gè)方法來估算兩點(diǎn)

尋路模塊 (2)

通過一番尋找,發(fā)現(xiàn)這系列文章,其不僅包含A*算法,連尋路算法中的一些基礎(chǔ)知識(shí)也一并介紹了,不愧是斯坦福出品,也很感謝譯者
要實(shí)現(xiàn)點(diǎn)A到點(diǎn)B最短路徑,還需要做一些微小的工作,下面逐個(gè)說明

計(jì)算曼哈頓距離的函數(shù)

目的是尋路,肯定需要一個(gè)方法來估算兩點(diǎn)間距離,由于我在移動(dòng)方式上限定了只有上下左右4個(gè)方向可動(dòng),那么很自然,兩點(diǎn)間最短距離就是就是曼哈頓距離
代碼:

import numpy as np
def get_manhanttan_distance(coordinate1, coordinate2):
    return np.abs(np.array(coordinate1) - np.array(coordinate2)).sum()
確定目的地

之前提到 “U型走法清掃一次,然后通過A*算法走到最近的未清潔點(diǎn),如此反復(fù)直到所有點(diǎn)都被清潔/走過”
說起來容易,具體實(shí)現(xiàn)還幾個(gè)步驟:

找出未清潔的點(diǎn)的合集

找出這些點(diǎn)中,離當(dāng)前所在點(diǎn)最近的點(diǎn)

如果其中有多個(gè)點(diǎn)到離當(dāng)前所在點(diǎn)的距離一樣,則需要按某個(gè)規(guī)則,在這些點(diǎn)中取一個(gè)出來

找出未清潔的點(diǎn)的合集

未清潔的點(diǎn)=未路過的點(diǎn),我們現(xiàn)在手頭上有coordinate_list,impassable_coordinate_list和robot.path_log,所以我們可以:

在coordinate_list中去掉impassable_coordinate_list的那些點(diǎn)(差集)得到passable_coordinate_list

在passable_coordinate_list中,中去掉robot.path_log的那些點(diǎn)(差集),得到uncleaned_coordinate_list

這里有需要做兩次交集,本來打算直接用numpy中的setdiff1d函數(shù),但因setdiff1d不支持多維(多維指(x,y)的形式),參考了SO上大神的辦法寫一個(gè)(用了view來降維)

def multidim_diff(coordinate_list_1, coordinate_list_2):  # 在1不在2中的集合
    coordinate_list_1, coordinate_list_2 = np.array(coordinate_list_1), np.array(coordinate_list_2)
    arr1_view = coordinate_list_1.view([("", coordinate_list_1.dtype)] * coordinate_list_1.shape[1])
    arr2_view = coordinate_list_2.view([("", coordinate_list_2.dtype)] * coordinate_list_2.shape[1])
    intersected = np.setdiff1d(arr1_view, arr2_view)
    return np.ndarray.tolist(intersected)

然后就可以得到未清潔的點(diǎn)列表了

def get_uncleaned_coordinate_list(self):
    passable_coordinate_list = multidim_diff(self.coordinate_list, self.impassable_coordinate_list)
    uncleaned_coordinate_list = multidim_diff(passable_coordinate_list, self.path_log)
    return uncleaned_coordinate_list
找出最近的未清潔點(diǎn)

寫完上面這段時(shí)候我突然想到,上面的曼哈頓距離沒考慮障礙,如果未清潔點(diǎn)和當(dāng)前所在點(diǎn)隔了一堵墻,反而會(huì)繞遠(yuǎn)路。但不用曼哈頓距離,對(duì)每個(gè)未清潔點(diǎn)求最短路徑似乎也不太合適
再次思考,想到這個(gè)搜索動(dòng)作是在U型走法后執(zhí)行的,U型走法覆蓋區(qū)域還是比較規(guī)律的,當(dāng)前點(diǎn)到之前路過的區(qū)域,不至于很繞路,那么是不是可以找U型走法覆蓋區(qū)域的周圍的點(diǎn),在這些點(diǎn)里再找最近的呢?
于是把上面的2和3改為:
2 . 找出所有走過的點(diǎn),取其上下左右4個(gè)點(diǎn)到passed_by_coordinate_list
3 . 去重復(fù),去掉非法點(diǎn)(和coordinate_list做交集),找到未清潔的點(diǎn)(和uncleaned_coordinate_list做交集),更新passed_by_coordinate_list
4 . 計(jì)算passed_by_coordinate_list中所有點(diǎn)到當(dāng)前點(diǎn)的曼哈頓距離,找到距離最近的那個(gè)(多個(gè)符合只取第一個(gè))
代碼如下:

def multidim_intersect(coordinate_list_1, coordinate_list_2):  # 兩個(gè)坐標(biāo)集的交集
    coordinate_list_1, coordinate_list_2 = np.array(coordinate_list_1), np.array(coordinate_list_2)
    arr1_view = coordinate_list_1.view([("", coordinate_list_1.dtype)] * coordinate_list_1.shape[1])
    arr2_view = coordinate_list_2.view([("", coordinate_list_2.dtype)] * coordinate_list_2.shape[1])
    intersected = np.intersect1d(arr1_view, arr2_view)
    return np.ndarray.tolist(intersected)

def get_passed_by_coordinate_list(self):
    passed_by_coordinate_list = []
    for coordinate in self.path_log:
        x, y = coordinate
        up = (x, y + 1)
        down = (x, y - 1)
        left = (x - 1, y)
        right = (x + 1, y)
        passed_by_coordinate_list.append(up)
        passed_by_coordinate_list.append(down)
        passed_by_coordinate_list.append(left)
        passed_by_coordinate_list.append(right)
    passed_by_coordinate_list = list(set(passed_by_coordinate_list))
    passed_by_coordinate_list = multidim_intersect(passed_by_coordinate_list, self.coordinate_list)
    passed_by_coordinate_list = multidim_intersect(passed_by_coordinate_list, self.get_uncleaned_coordinate_list())
    return passed_by_coordinate_list
    
def find_nearest_coordinate_by_manhanttan(coordinate1, coordinate_list):
    record = 50000
    for coordinate2 in coordinate_list:
        distance = get_manhanttan_distance(coordinate1, coordinate2)
        if distance < record:
            record = distance
            result = coordinate2
    return result
    
def get_nearest_uncleaned_coordinate(self):
    passed_by_coordinate_list = get_passed_by_coordinate_list(self)
    return find_nearest_coordinate_by_manhanttan(self.current_coordinate, passed_by_coordinate_list)

至此,我們實(shí)現(xiàn)了A*算法的目標(biāo)/前提,即出發(fā)點(diǎn)和終點(diǎn),之后再說A*算法的實(shí)現(xiàn)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/41292.html

相關(guān)文章

  • 掃地機(jī)器人模擬程序 (1)

    摘要:前言在朋友的推薦下,嘗試寫一個(gè)模擬的掃地機(jī)器人的程序,當(dāng)做是練習(xí)工程能力和算法寫這篇文章一是記錄和分享思路,也希望獲得更多意見和建議,歡迎評(píng)論效果本來是打算最后再貼圖的,文章沒啥人氣,加上感冒偷個(gè)懶就先貼個(gè)圖吧不知道為什么沒辦法直接貼圖片, 前言 在朋友的推薦下,嘗試寫一個(gè)模擬的掃地機(jī)器人的程序,當(dāng)做是練習(xí)(工程能力和算法)寫這篇文章一是記錄和分享思路,也希望獲得更多意見和建議,歡迎評(píng)...

    tanglijun 評(píng)論0 收藏0
  • 掃地機(jī)器人模擬程序 (2)

    摘要:上一篇文章中介紹了地圖模塊,接著來看主模塊和動(dòng)作模塊主模塊思路主模塊由一個(gè)類構(gòu)成,其調(diào)用各子模塊,且其屬性可用于保存信息這些信息,除了之前地圖模塊中的和之外,還包括初始坐標(biāo)現(xiàn)所在坐標(biāo)移動(dòng)路徑代碼動(dòng)作模塊思路所謂移動(dòng),在模擬程序里就是更新現(xiàn)所 上一篇文章中介紹了地圖模塊,接著來看主模塊和動(dòng)作模塊 主模塊 思路:主模塊由一個(gè)Robot類構(gòu)成,其調(diào)用各子模塊,且其屬性可用于保存信息這些信息,...

    stormgens 評(píng)論0 收藏0
  • 掃地機(jī)器人模擬程序 (3)

    摘要:話說我的地圖就是柵格形式用點(diǎn)坐標(biāo)來表示格子模板模型法很容易理解,就是有幾種走法,按情況調(diào)用。 尋路模塊 (1) 終于要挑戰(zhàn)尋路模塊,雖然我是在重復(fù)造輪子,但看一下別人的輪子怎么造也是很重要的,所以在這之前首先搜索下,看看有什么現(xiàn)成的思路和代碼,收獲如下: 兩種尋路邏輯 有兩種尋路邏輯, 隨機(jī)碰撞和路徑規(guī)劃,考慮到: a. 隨機(jī)碰撞似乎需要不少經(jīng)驗(yàn)/實(shí)驗(yàn)數(shù)據(jù)才能達(dá)到不錯(cuò)的效果,我缺經(jīng)驗(yàn)/...

    ccj659 評(píng)論0 收藏0
  • 人工智能商業(yè)化全面解析,內(nèi)含趨勢解讀

    摘要:在全球智能新商業(yè)峰會(huì)上,億歐公司發(fā)布中國人工智能商業(yè)落地強(qiáng)榜單與研究報(bào)告。一定程度上,該榜單反映了人工智能在中國各細(xì)分領(lǐng)域的商業(yè)化程度。 人工智能商業(yè)化是什么意思?它和商業(yè)智能有怎樣的聯(lián)系?本文從概念、重大發(fā)展事件、發(fā)展趨勢這幾個(gè)方面全面解讀人工智能商業(yè)化。 121 一、概念人工智能商業(yè)化,是指人工智能走向商業(yè)化的歷程,即人工智能實(shí)現(xiàn)商業(yè)場景的應(yīng)用。人工智能的商業(yè)化進(jìn)程正一步步通過各種...

    Amos 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<