2017-05-16 14 views
2

ノードの広告にいくつかの正の値を持つグラフがあり、エッジに負の値があります。私は移動 グラフ - 正のノードと負のエッジを持つグラフを移動するアルゴリズム

  • のためにノードに滞在するとき

    • :私はソース・ノードから宛先ノードに、グラフに正確x回を移動する必要が は
      、目標は、和の合計を最大化することです私が辺を通過するときの減算

    したがって、同じノードで移動すると合計が増えます。したがって、値10のノードに4回滞在すると、合計で40が得られます。例は下の画像にあります。この場合

    enter image description here

    最良の解決策は、次のとおり

    Move1 - >(ソースノード+3)3

    MOVE2 - >(+ 15 3-20)-2

    MOVE3 - >(15滞在)13

    ...(同じノードを滞在)...

    Move19 - >(滞在15)253

    Move20 - >(宛先ノード253から5 + 3)251

    何の問題を解決するための効率的な解決策になるだろうか?私は擬似コードのようなものを実装できますが、どうすれば解決できるのか理解するだけです。

    ありがとうございました。

  • +0

    グラフのスケールとは何ですか(そこにいくつのノードがありますか?)必要な移動数のスケールは何ですか? – amit

    +0

    移動回数は、私が想定しているグラフを横切るのに十分です。 ** x **は常に問題を解決するのに十分な大きさであると仮定します。 この問題は、一般的な数のノードVと、数xの移動が与えられたエッジのEについて解くよう求めます。 – RobKur

    答えて

    1

    これは|E|は、エッジの数であるとnはステップ数であるO(|E|*n)時間の複雑さ、で、Bellman-Ford algorithmの変動により解決することができます。

    簡単にするために、あなたはまた、すべてのノードでの自己ループを持っていると仮定し、ウェイト0の場合、これは「滞在操作」を表します。 、

    for all u in V: 
    (u,u) in E 
    w(u,u) = 0 
    

    Dynamic Programmingを使用して再帰式を適用します:だから、あなたは持っている

    D[v][0] = 0   if v is the source 
          -infinity otherwise 
    D[v][i] = max { D[u][i-1] + w(u,v) + cost(v) | where (u,v) is an edge } 
    

    ソリューションは、これは基本的に(max代わりのmin付き)ベルマン - フォード法であるD[target][n]

    ですしかし、|V|の代わりに、nの反復の後に停止します。

    +0

    +1ですが、私にとっては、元のグラフのコピーが複数あると仮定すると、各時間ステップごとに1つずつ(各コピーをグラフの垂直スタックに「スライス」として考える)スライスiの頂点からスライスi + 1の頂点に向かい、スライスiの各頂点からスライスi + 1のそれ自身のコピーまでの追加のエッジを持つ。次に、BFSは答えを見つけ出します(同じ再帰式と時間の複雑さを使用しますが、すでに訪問した頂点とその近隣に距離を更新するだけで済むことは明らかです)。 –

    +0

    @j_random_hackerしかし、それはまさにベルマンフォードがやっていることです。ここでの唯一の違いは、 '| V |'の反復の代わりに 'n'回の反復をやめ、グラフ(セルフループ)を非常に小さく変更することです。 BFはすでに発見したノードも更新することを思い出してください(それがDijkstraのアルゴリズムよりも堅牢で負の重みを処理できる理由です)。 – amit

    +0

    あなたがリンクしているWikipediaのページで説明されているBFアルゴリズムは、BFSがそうでない最も外側のすべての反復で、無関係で到達不能なエッジを更新しようと時間を無駄にします。 (ソースが含まれているコンポーネントにO(1)エッジがあるグラフを考えてみましょう。他のコンポーネントにはOmega(n^2)の "役に立たない"エッジが含まれています。)BFSがここに与える改善は、 「円の最初の改善」がありますが、これは明らかではありません。 –

    関連する問題