2017-02-15 56 views
1

我有一個鏈接節點列表,由代理在鏈接上的移動期間收集。 當他到達目的地時,他必須保存他的路徑,但沒有循環。刪除移動代理路徑中的週期

一種消除循環的方法是通過從源鏈接開始按位置迭代掃描鏈接位置:對於位於i-th位置的鏈接,從目標鏈接開始掃描路徑,直到遇到第一個鏈接例如,在位置j(它總是保留i <= j,因爲掃描進程最遲在i處停止)。如果我們有j > i,從位置i+1到位置j的鏈接的子路徑對應於一個循環並且可以被消除。

Scanning process for loop elimination

我一直在試圖編寫一個遞歸to-report這需要初始列表作爲參數,但沒有成功。我的測試代碼給了我循環,但沒有循環沒有路徑是這樣的:

to-report no-cycles [ lista ] 
    ifelse empty? lista [ 
    report lista ] [ 
    let x1 (first lista) 
    let rest (butfirst lista) 
    let rev-rest (reverse rest) 
    let rev-rest1 (first rev-rest) 
    ifelse x1 != rev-rest1 [ 
     report no-cycles (butlast rest) 
    ] [ 
     report lista ] 
] 
end 

我不知道這是否是一個好方法。

非常感謝您的幫助

+0

請分享您嘗試過的方式以及缺陷。 –

+0

以上是我試圖讓它工作的代碼,但是對於數字列表(不是鏈接)給了我循環,但沒有循環沒有路徑。 – user1993416

回答

1

我無法弄清楚如何使你的編碼方法的工作完全是,但你總的概念是有意義的。下面的代碼是to-report,它接受一個列表並向後遍歷它,將當前項目之前的所有項目與當前項目進行比較。如果匹配,則跳轉到該項目的最早實例。請注意,我使用鏈接和數字列表測試了它,所以它應該刪除任何類型的列表中的重複項目。然而,它確實會返回一個列表,所以如果你輸入一個鏈接列表,它將而不是返回一個代理集 - 如果你想讓鏈接做一些事情,你必須使用foreach "your-list"而不是ask。如果你需要的只是列表,下面的代碼至少應該讓你開始。

to-report no-cycles [ input_list ] 

    ifelse empty? input_list [ 
    report input_list 
    ] 
    [ 
    let final_list [] 
    let temp_list reverse input_list 
    let n 0 

    while [ n < length temp_list] [ 
     let x n 
     let cur item n temp_list 
     while [ x < length temp_list ] [ 
     if (item x temp_list) = cur [ 
      set n x   
     ] 
     set x x + 1 
     ] 
     set final_list fput (item n temp_list) final_list 
     set n n + 1 
    ] 
    report final_list 
    ] 

end 

編輯下面

一旦你有你的鏈接列表,你可以使用一個foreach通過列表進行迭代,做你喜歡什麼。例如,如果您想要列表中的每個鏈接增加一個變量,您可以使用下面的代碼塊。

to-report modify-links-in-list [ input_list_of_links ] 

    ;;; input must be a list of links, not an agentset 
    foreach input_list_of_links [ 
    [x] -> 
    ask x [ 
     set example_var example_var + 1 
    ] 
    ] 

    report input_list_of_links 
end 

這將修改鏈接本身的變量,因此請檢查您希望更改的鏈接之一以監視它是否正常工作。希望這就是你所追求的!

+0

非常感謝。我正在傳遞一個鏈接列表給這個「無循環」過程,它也會返回一個鏈接列表。但是,在刪除循環之後,我必須遞增與路徑中每個鏈接相關的變量的值,所以我認爲返回一組代理('path-links')會更好,所以我可以使'問路徑鏈接[add-value-to-links]'。這是可能的,或者我必須使用'foreach' ?.我測試過'foreach'爲每個鏈接添加一個值,以返回'無循環',但給我錯誤。謝謝。 – user1993416

+0

所有問題都是因爲要消除循環,我必須使用鏈接列表。我想如果我可以使用鏈接代理程序刪除循環,我會減少麻煩。問題是,如果我設置了路徑(鏈接集路徑new-link),我會改變代理所遵循的路徑,因爲它會消除重複,並且我可能會丟失一些鏈接,不是嗎? – user1993416

+0

使用這個程序,我不認爲你可以返回一個代理組,不幸的是。但是,如果你只需要獲得鏈接列表來修改其中的一個變量,那麼你可以使用'foreach'來完成。查看我的編輯答案的例子。 –