2017-02-15 4 views
1

私は、リンク上の移動中にwalkerエージェントによって収集されたリンクノードのリストを持っています。 彼は目的地に到着したら、彼は道を救うがループはしない。移動エージェントのパス内のサイクルを削除します。

ループを排除する方法は、ソースリンクから開始する位置によってリンク位置を反復してスキャンすることによって行われます。i-thのリンクでは、リンクは最初のリンクが発生するまでスキャンされますたとえば、位置jにある(最新のiでスキャン処理が停止するため、常にi <= jが保持されます)。 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です。一致するものがあれば、その項目の最も早いインスタンスにジャンプします。リンクと数字のリストを使ってこれをテストしていたので、どのタイプのリストでも重複している項目を削除する必要があります。しかし、リストを返すので、リンクのリストを入力すると、でなくが返されます。もし、リンクに何かをしたいのであれば、askではなくforeach "your-list"を使用しなければなりません。必要なものがリストだけであれば、以下のコードは少なくともあなたを始めるはずです。

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を使用することができます。たとえば、リストの各リンクで変数を1つ増やしたい場合は、以下のコードブロックを使用できます。

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 

これにより、リンク自体の変数が変更されるため、変更が必要なリンクの1つを調べて、正しく動作していることを監視します。あなたが何をしているのかと期待しています!

+0

ありがとうございます。この 'no-cycle'プロシージャへのリンクのリストを渡しています。リンクのリストも返します。しかし、ループを削除した後、パスの各リンクに関連する変数の値をインクリメントする必要があるので、エージェントの集合( 'path-links')を返す方が良いと思うので、' 'パスリンク[アサインバリューリンク]を尋ねる。この手順でも、私は 'foreach'を使う必要がありますか? 'no-cycle'を返すが、エラーを返す各リンクに値を追加する' foreach'をテストしました。ありがとうございました。 – user1993416

+0

すべての問題は、ループをなくすためにリンクのリストを使用する必要があるために発生します。リンクエージェントセットを使用してループを削除することができれば、問題は少なくなると思います。問題は、 'set path(リンクセットパスnew-link)'を実行すると、重複を排除してリンクを失う可能性があるため、エージェントが従うパスを変更することでしょうか? – user1993416

+0

この手順を使用すると、残念ながら代理店を返すことはできません。ただし、リンクのリストを取得して変数の1つを変更するだけであれば、確実に 'foreach'を使って行うことができます。例について私の編集された答えを見てください。 –

関連する問題