構文解析アルゴリズムコンテストのテーマ(9):高度な検索(4) - A *検索

「先進のアルゴリズムコンテストエントリー」(このシリーズは情報拡張このアルゴリズムの教科書であるJingdongは 详细)、清華大学プレス
:PDFダウンロードhttps://github.com/luoyongjun999/code「追加情報」の1
場合提案、してください連絡先:(1)QQグループ567554289;(2)QQの、15512356

  第4章の「高度なアルゴリズムコンテストへの行き方」、「検索技術」は、再帰の原理を説明し、BFS、DFSだけでなく、双方向の広い、プルーニングの反復は、IDA *古典的な例は、のために検索を深め、A *アルゴリズムを検索します検索アルゴリズムを取得します。
  この記事は、いくつかのプレゼンテーションは、拡張されたコンテンツを検索し、より演習を説明し、読者に検索技術の深い理解を容易に分割されます。
  最初の1:検索インフラストラクチャ。
  パート2:剪定。
  パート3:高度な検索広いです。
  パート4:A *検索。
  パート5:
  この記事はパート4です。

  特定の開始点を与えられた、明確な端部(又は予測可能の終わり)、始点終点までの最短経路を見つける:*検索アルゴリズム(A *検索アルゴリズム)を効率よく最短経路問題のクラスを解決することができます。
  *アルゴリズムは= G + H Fコア評価関数です。その効率は、関数hの設計に依存します。
  このような双方向のような多くのアルゴリズム最短経路問題は、広い高効率の検索、およびAより高い*アルゴリズムは、広い効率を検索双方向です。また、本明細書の実施例(K短絡、等)から分かるように、Aは、*アルゴリズムは、より複雑な問題を解決します。

詳細1 A *検索アルゴリズム

  A * =貪欲アルゴリズムの最適な検索+ BFS +プライオリティキュー:*アルゴリズム技術は、のように要約することができます。
  「ダイクストラ+キューの優先度は」「BFS +優先キュー」であるという問題点を鑑みて、この時間ものようにまとめることができます「A *アルゴリズム=貪欲最適な検索+ダイクストラ+プライオリティキュー」
  A *アルゴリズムを推論の原理の一例の最短経路図以下。
  図このアプリケーションに加えて、*アルゴリズムはより多くの場所で適用できることに注意してください。

1.1貪欲最適な検索

  最適な欲張り探索(欲張り最良優先探索は)ヒューリスティック検索、高効率であるが、得られた溶液は必ずしも最適ではありません。
  アルゴリズムの基本的な考え方は貪欲である:あなたが最後に最も近いノードを選択する際の開始点から、その隣接ノードの次のノードを選択します。もちろん、事前に仕上がりからノードを知っている、ましてや最近傍点を選び出すことは事実上不可能です。したがって、この方法のみ推定することができ、例えば、マンハッタン距離に応じてトレリス線図でエンドポイントに隣接ノードから推定されます。
  どのようにプログラムに?依然として「BFS +優先キュー」が、しかし、プライオリティキューはなく、現在の時点k sの開始点からの距離が、現在の点K T端からの距離を入力します。
  明らかに、非常に高速で、のみ「良い」ノードを選択し、多数のノードを回避するために最適な検索貪欲、どうやらパスを結果は必ずしも最善ではありません。
  トレリスダイアグラムのバリアフリー、欲張り探索アルゴリズムは、最適な結果に最適なソリューションです。マンハッタン距離を推定するために、それは最短実際に存在するので、次のノードを見つけるたびに、明らかに最高ですので。
  次ホップノードに応じマンハッタン距離から選択される障害を有するトレリス図において、ルートは常に壁に来る、次いで迂回最終的に得られる必ずしも最短経路ではありません。
  欲張り探索アルゴリズムの考え方である:「かかわらず、開始点の、終わりを見てみましょう。」ステップバイステップでは、戻って間違っを修正しないことを選択しないでください。そして、マンハッタンこの距離の簡単な見積もりで、我々は先に障害物バイパスすることはできません。

1.2ダイクストラ(BFS)

  ダイクストラ(BFS)を使用して実装プライオリティキューは、より効率的に他のすべての点に始点最短経路を求めることができます。ダイクストラのアルゴリズムBFSは、共通の問題を抱えている:次の検索はブラインド、方向の無駄な感覚です。エンドポイントを与え、ダイクストラはまた、優先順位キューの最後に飛び出すまで処理するための優先キューに、ほぼすべての頂点と辺を必要とします。これは、パスの最後に他のすべてのノードではなく、ただの開始地点への最適パスを求めるために適しています。
  ダイクストラのアルゴリズムが考えている:「かかわらず、最後の開始点を見て、。」などトラバースほぼ同じ、常に遭遇終了。

1.3原則とA *アルゴリズムの複雑

  *検索アルゴリズムは、貪欲とダイクストラの最適な組み合わせである「ルック・アンド・起点でなく、最後を参照してください。」それは盲目ダイクストラとしてではなかったので、速くダイクストラより、それは欲張り探索を予測する能力だけでなく、最適なソリューションを持っています。
  これは、これら2つのアルゴリズムを組み合わせる方法ですか?
  SIT:提供開始点をs、端部がT、iはアルゴリズムを歩く点の現在位置、STは、2つの部分に分割経路です。
  ダイクストラ保証最適(1)SI経路と、
  経路(2)私は、次のノードを選択し、欲張り探索予測を行い、
  iが壁に入るときに(3)、iが破棄され、再選択した新しい点j、jをまだダイクストラ保証最適に床に戻って落ちます。
  :アイデア上記の特定操作にコスト関数を使用することができる
    (私は)= FをG(I)+ H(I)
  F(I)は点Iの評価であり、G(i)はSからkにコストで、H( ⅰ)トンまでのkからコストです。
  G = 0の場合、F = H、A *縮重欲張り探索、
  A *はダイクストラを縮退する場合、H = 0、次に、= G F。
  A *各次の点を選択するために最小のF(I)に基づきます。G(i)が知られて走行している経路であり、H(i)は横断予測されたパスではない; F(I)を計算性能は、(i)時間に依存するように。
  アルゴリズムの*複雑さは、上限最悪の場合にはダイクストラ、またはキューBFS +は、一般的に良くなるです。

1.4 A *アルゴリズムの最適性

  ソリューションA *アルゴリズムは、最適な権利でありますか?答えが決定され、その溶液と溶液ダイクストラは、最短経路です。
  場合kは、その後(T)= G(T F、H(T)= 0と、Tの終わりに達する )+ H(T)= G(T)、 およびg(t)はダイクストラにより得られた最適解であります従って、Tの終わりに、この位置は、*アルゴリズム溶液が最適です。
  要約:A *は、最適な結果を得るためにダイクストラ法により得られ、延在方向によって最適な欲張り探索予測、探索ノードの数を減少させます。

1.5 3比較アルゴリズム

  この図の下には、正確には3つのアルゴリズムの違いを理解しています。図開始点S、端部がT、ヘイグの障害があります。図は、慎重に場所の障壁を設定し、3つのアルゴリズムを実証することは障害物の周りを取得する方法です。



図3比較アルゴリズム1

  3つのアルゴリズムが基づいている「BFS +プライオリティキュー。」デジタル格子がプライオリティキューに、ノードを検索して処理されます。シャドウ・グリッドは、得へのフルパスです。デジタル格子距離は、マンハッタン距離を計算しました。ダイクストラ(BFS)アルゴリズムは、最大でグリッド、グリッドを横断する少なくとも欲張り最適な探索アルゴリズムを横断します。
  (1)ダイクストラ(BFS)アルゴリズム。グリッド数、Sは、グリッドへの出発点からの最短距離です。場合は、検索アルゴリズム、および排出は、sはこれらの格子への最短経路を求めているプライオリティキューへの開始から格子までの距離、にそれらを書き込みます。最後に、時刻T優先キューポップ、すなわち、端部からの最短距離は、Tに14秒を得ました。
  (2)最適な欲張り探索。グリッド番号、tはグリッドからのマンハッタン距離の端にあります。読者は慎重に本明細書に簡単に次のように説明し、その作業プロセスを分析することができる:最小のマンハッタン距離に沿ってSから、2の壁になってきた。プライオリティキューから2取り出し、残りの3つは最小であり、ポップ-3を、最小残存しますそれは4であり、......、このプロセスを続け、トンへの最終的な障壁を回し、そしてまで、それらが行く1個の爆弾により近いが、最終的に拒絶のノードを1つずつ表示されます。得られたパスが最適パスではありません。
  (3)*検索。図中例えば、細胞i「はiをsはマンハッタン距離tの最短iに+」です。グリッドアルゴリズムの拡張の過程において、参照番号は、優先度キュー格子に入ります。図では、最初のイジェクトは、すべてのグリッド10としてマークされ、そして最後の終点Tまでグリッド12、ポップアップのラベルをポップ。得られた14番目の最短経路です。
  完全なパスをプリントアウトする方法?3つのアルゴリズムは、BFSに基づいて、BFSとルートレコードが非常に簡単である:Uは、その先行ノードvにUを記録する場合、即ち、U vから遡ることができる拡張された隣接ノードにポイントをV、オブジェクトに到達した後、徐々に開始点までのエンドポイントバックから、我々はパスを取得します。ダイクストラのアルゴリズムでは、優先順位キューからの各排出は、最短経路のノードを取得し、それらが隣接ノードから延びて、最短経路が形成され続ける、それは先行および後続ノードの間の関係に応じて可能です、簡単[完全な最短パスをプリントアウトあなたが最短パスをプリントアウトする必要がある場合は、「高度なアルゴリズムコンテストへの行き方、」参考文献「10.9最短経路」、番組コードパスの印刷 ]。最短パスを印刷することができ、また、後続先行の間の関係を決定するために、A *アルゴリズムダイクストラ法。最高の印刷最も簡単なパスの貪欲探索はBFS通常の印刷のパスです。

1.6デザイン関数h

  二次元では、三つの方法があることは時間を近似することができます。下記(IX、IY)は点の座標Iである、(TX、TY)は、エンドポイントTの座標です。
  (1)マンハッタン距離。シナリオ:唯一の4方向(上、下、左、右)の動き。
    H(I)= ABS(IX - - TX)+ ABS(TY IY)
  対角線から(2)。シナリオ:あなたは、このようなチェスの王の移動など8つの方向に移動することができます。
    H(I)=最大{ABS(IX - TX)、ABS(IY - TY)}
  ユークリッド距離(3)。シナリオ:あなたは任意の方向に移動することができます。
    H(I)= SQRT(( IX - TX)2 +(IY - TY)2)
  非平坦な問題は、適切な関数hを設計する必要性、後者の例として、いくつかのより複雑な関数hが存在します。
  :H設計する際、次の基本的なルールに注意してください
  (1)G及びH同じ計算方法であるべきです。例えば、マンハッタン距離h、Gはマンハッタン距離であるべきです。別々に計算した場合、F = G + hは意味がありません。
  (2)正しい選択hのアプリケーション。各ノードのH値は、それらが正確に距離の終点を反映することができなければなりません。例えば、次ホップノードは、2つのオプションがあります:A(280、319)、 B(300、300)は、 マンハッタン距離Aは、ユークリッド距離Bから選択されるべきである場合に選択されるべきです あなたが唯一の四方に行くことができるならば、(マンハッタン距離のパスで計算する)間違っているだろうユークリッド距離を用いて計算しました。
  (3)時間は、全ての既存のパスよりも優れているべきです。前の例では、H(I)は以下のすべての可能な経路長と同等であり、すなわち、得られた実際の経路長は、H(I)よりも大きいです。このルールは論じ、以下の2点によって説明することができます。
  1)H(i)は、それが実際に存在する最適経路よりも長くなります。プログラムはH(I)の他の非選択中にエラーが発生することがあり、最適な経路、尤パスを放棄することで、次のノードへ延びているので、この最適経路は、実際の経路であると仮定する。
  2)H(i)は、それのすべての既存のパスよりも短いです。H(I)に基づいて、プログラムは、次のノードを拡張する場合は、この場合、それは長さH(I)の経路上に存在しない場合、最終的に確実に拒絶、それは問題では、しかし、プログラムは離れBFSキュー操作爆弾これらのエラーが使用されませんポイントは、それによって実際のパスを拡大し、適切なノードに戻るために、我々はまだ精度を確保することができます。
  (3)上記の最も重要な点は、アプリケーションA *アルゴリズムは、特別な注意を払う必要があります。

例2 A *アルゴリズム

  *アルゴリズムは、主な問題は、適切な関数hを設計することで、コードすることが容易です。図の= G + F関数Hを用いてダイクストラBFS Gまたは関数、A *を用いて、例えば問題は、代わりにgのF限り、符号化時。読者はタイトルへの最短経路は、例えば、A *アルゴリズムでグラフ理論に変更しました試すことができます2243をPOJ
  ここではその複雑な2つの例を示します。

2.1 K短絡

  問題説明POJ 2249:グラフを考えると、開始と終了点T S、及び数kを定義し、T秒を求め、k番目のショートパス。ループを許可します。同じの異なる経路長は、また、完全に異なることが考えられます。
  K短絡の問題はほぼ完全にA *アルゴリズムの評価関数を適用し、A *アルゴリズムの典型的な例です。
  それぞれ暴力行為と以下のA *アルゴリズム。
(1)暴力:BFS +プライオリティキュー
  非常に短い長いパス出力から順に、すべてのパスのBFS、プライオリティキューを検索します。
  このセクションの「BFS +プライオリティキュー」の中で最もショートのための「BFS +キューの優先順位は、」先に説明されています。この新しいパスが私より短い経路の最後の時間に到達する場合、原則としては、私がポイントに再び延長したときにということで、それに取って代わる、キューは、ノードの利点はパス出力の長さに応じて最適性を保証しなければならないことができます。キュー要素は、タプル(I、DIST(SI))であり 、 すなわち、ノードiとSIの経路長。
  BFSは、すべてのパスを見つけたとき、私はその距離sを計算し、その後、直接キューにするために、最も簡単な「プライオリティキューBFS +」、再び拡張隣人で、キューに私の以前の場合に比べてではありません。それは各隣接の複数から来てもよいように、ノードiは、優先度キューを何度も入る、それぞれがsからIへのパスを表します。これらの経路は、iはx番目の短絡Sで優先待ち行列ポップx番目から、短期の長いものから順によって出力プライオリティキューDISTを可能にします。トンの終わりのために、それが倍のキュー統計、最初のピットストップのK倍の数である、これが最初のK短絡です。
  当該K短絡は、ループ経路を形成することができます。いくつかのトピックのループを可能にするためにあるものとないものがあります。あなたがループを許可する場合は、ループ内でどのように多くの周回を考えると、ループ上のノードが繰り返しキューを入力するように、Kは無限することができます。
  更新操作がループ暗黙の役割を削除したため、最短経路アルゴリズムで、ループが必要とされないかを判定する。
  複雑さ:のでパスの数が指数関数的であるため、暴力行為の複雑性が非常に高い一方で、ほとんどすべてのパスの生成する必要の暴力行為。
  シンプルなイラストと、すべてのパスのための以下の説明暴力BFS検索処理。

図2の単純な図。

  次の表は、アルゴリズムのステップを示しています。添字の後ろ例えばU2、ノードにノードsから経路長を表し、それはタプル(U、2)、即ち、ノードU、SU 2の経路長です。ステップループは表示されません。

ステップ チーム チームへの隣人 プライオリティキュー 結果として新しいパス チームのヘッド出力パス
1 \(S \) { \(s_0 \) }
2 \(s_0 \) U、V { \(U_2、V_4 \) } { \(S \) - \(U_2 \) \(S \) - \(V_4 \) }
3 \(U_2 \) \(V、T \) \(v_3、v_4、t_8 \) { \(\ S) - \(U_2 \) - \(v_3 \) (S \)\ - \(U_2 \) - \(t_8 \) } \(S \) - \(U_2 \)
4 \(V_3 \) \(T \) { \(v_4、t_8、t_6 \) } \(S \) - \(U_2 \) - \(v_3 \) - \(t_6 \) \(S \) - \(U_2 \) - \(V_3 \)
5 \(V_4 \) \(U、T \) { \(t_8、t_6、U_5、t_7 \) } \(S \) - \(v_4 \) - \(U_5 \) \(\ S) - \(v_4 \) - \(t_7 \) \(P \) - \(v_4 \)
6 \(U_5 \) \(T \) { \(t_8、t_6、t_7、T_ {11} \) } \(S \) - \(v_4 \) - \(U_5 \) - \(T_ {11} \) \(S \) - \(V_4 \) - \(U_5 \)
7 \(t_6 \) { \(t_8、t_7、T_ {11} \) } \(S \) - \(U_2 \) - \(v_3 \) - \(t_6 \)
8 \(t_7 \) \(U \) { \(t_8、T_ {11}、U_ {13} \) } \(S \) - \(v_4 \) - \(t_7 \) - \(U_ {13} \) \(S \) - \(v_4 \) - \(t_7 \)
9 \(t_8 \) \(V \) { \(T_ {11}、U_ {13}、V_ {11} \) } \(S \) - \(U_2 \) - \(t_8 \) - \(V_ {11} \) \(S \) - \(U_2 \) - \(t_8 \)
10 \(T_ {11} \) { \(U_ {13}、V_ {11} \) } \(S \) - \(v_4 \) - \(U_5 \)\( - T_ {11} \)
11 \(V_ {11} \) { \(U_ {13} \) } \(S \) - \(U_2 \) - \(t_8 \) - \(V_ {11} \)
12 \(U_ {13} \) {} \(S \) - \(v_4 \) - \(t_7 \) - \(U_ {13} \)

  从第二列的“出队”可以看到,共产生10个路径,按从短到长的顺序排队输出。从起点s到终点t共有4条路径,t在第7、8、9、10步出队的时候,输出了第1、第2、第3、第4路径。表格中也列出了s到每个结点的多个路径和它们的长度,例如s-u有3个路径,s-v有3个路径。
(2)A*算法求K短路
  从暴力法可以知道:
  1)从优先队列弹出的顺序,是按这些结点到s的距离排序的。
  2)一个结点i从优先队列第x次弹出,就是s-i的第x短路;终点t从队列中第K次弹出,就是s-t的第K短路。
  如何优化暴力法?是否可以套用A*算法?
  联想前面讲解A*算法求最短路的例子,A*算法的估价函数f(i) = g(i) + h(i),g是从起点s到i的距离,h是i到终点t的最短距离(例子中是曼哈顿距离)。
  那么在K短路问题中,可以设计几乎一样的估价函数。g(i)仍然是起点s到i的距离;而h(i),只是把曼哈顿距离改为从i到t的最短距离。这个最短距离如何求?用Dijkstra算法,以终点t为起点,求所有结点到t的最短距离即可。
  编程非常简单。仍用暴力法的“BFS+优先队列”,但是在优先队列中,用于计算的不再是g(i),而是f(i)。当终点t第K次弹出队列时,就是第K短路。
  根据前面对A*算法原理的解释,求K短路的过程将得到很大优化。虽然在最差情况下,算法复杂度的上界仍是暴力法的复杂度,但优化是很明显的。

2.2 poj 1945

Power Hungry Cows http://poj.org/problem?id=1945
题目描述:两个变量a、b,初始值a = 1, b = 0。每一步可以执行一次a×2,b×2,a+b,|a-b|之一的操作,并把结果再存回a或者b。问最快多少步能得到一个整数P,1 <= P <= 20,000。
  例如P = 31,需要6步:
         a  b
  初始值:   1  0
  a×2,存到b: 1  2
  b×2:    1  4
  b×2:    1  8
  b×2:    1  16
  b×2:    1  32
  b-a:     1  31
样例输入
31
样例输出
6
--------------------------------------------------------------

题解
(1)BFS+剪枝
  这一题是典型的BFS。从{a, b}可以转移到8种情况,即{2a, a}、{2a, b}、{2b,a}、{2b,b}等等。把每种{a, b}看成一个状态,那么1个状态可以转移到8个状态。编码时,再加上去重和剪枝。此题P不是太大,“BFS+剪枝”可行。
(2)A*算法
  如何设计估价函数f(i) = g(i) + h(i) ?
  g(i)是从初始态到i状态的步数。h(i)是从i状态到终点的预期步数,它应该小于实际的步数。如何设计呢?容易观察到,{a, b}中的较大数,一直乘以2递增,是最快的。例如样例中的31,在起点状态,\(2^5\) > 31,经5步可以超过目标值,所以h = 5。

3 一些习题

  下面的题目有多种实现方法,尝试用A*算法来做。
  洛谷P1379 八数码难题,https://www.luogu.com.cn/problem/P1379。八数码有多种解法,A*也是经典解法之一。
  洛谷 2324 骑士精神,https://www.luogu.com.cn/problem/P2324
  洛谷P2901 Cow Jogging https://www.luogu.com.cn/problem/P2901,K短路。

おすすめ

転載: www.cnblogs.com/luoyj/p/12515018.html