ノートアルゴリズム - 貪欲アルゴリズム

貪欲アルゴリズムは:すべてのステップが最適であることを保証するために、最終的な結果は確かにある最高の(多くの問題を簡単にするために、あなたはより大きな絵を持っている必要はありません)

シーン:需要制限値のセット(最短、アップ、安い、などなど...)

 

セッションの(1)組織

  説明:限られた時間内でより多くの会議は、任意の時間には、2回の会議は、競合を持つことができません。図は、会議の詳細です:

   アイデア:次回の会議は、(動的に開始時間を変更することと等価である会議のよりよい短い期間、)最早終了時間を取ることです

   コード:

1 <?PHP
 2  $ミーティング = [
 3      '1' => [3 ,. 6]、 '2'=> [1 ,. 4]、' 3' =>。5 ,. 7]、」4' => 2 5]、 '5' => [5,9]、
 4      '6' => [3,8]、 '7' => [8、11]、 '8' => [6]、[10]、[ 9 '=> [8]、[12]、' 10「=> [12、14]、
 5      ];
 6  
。7  // 時間順の終わり
8  uasort$ミーティング関数$ P1$ P2 ){
 9      IFP1の$ == [1] の$ P2)[1] 戻り 0 ;
10      リターン $ P1は、[1]>$ P2 [1]?1:-1 ;
11  });
12  
13  // 取不冲突
14  $最後の = nullを15  foreachの$会合 として $ K => $大会){
 16      であれば(($最後 === NULL)||($最後!== NULL && $満たす [0]> = $最後))
 17          リスト$ RES []、$最後)= $ K$満たす [1 ]。   
18 }
コードの表示

 

(2)最短パス

  説明:最短距離の他のすべてのポイントに最初のポイントを求めて、5つの景勝地があります。次のようにマッピングします。

   アイデア:最も近い点を見つけるためです。実質的に次のように:

     現在、1:1-2からである2; 1-3徒歩5へ。2とするために、次の3(なぜなら2 1 2及び3です)

     次いで2に行く:2-4からなる6; 2-3ランが1であり;上記の新しい結合から得られた:本明細書中に上位5未満、1-3(1-2-3から4 6からのリフレッシュ)1-4(ブランチが3と4の下に行きます)

       3-4のような7; 3-5ランが1であり;結合新規上記から得られる:次いで3に行く1-4又は離れる4,1-5 5(1-2-3-5)から(このブランチは4の下に行くと、5)

      以下のように...

  コード:

 

1 <?PHP
 2  $地図 = [                                                                         // ここで行列マップによって表される
。3      [ ヌル、2 ,. 5、NULLNULL ]、
 4      [ NULLNULL、2 ,. 6、NULL ]、
 5      [ NULLNULLNULL、 7 ,. 1]、
 6      [ NULLNULL、2、NULL、4]、
 7      [ NULLNULLNULLNULLNULL ]、
 8。 ];
 9  $位置 = $スタート = 0 ;
 10  $あっ = [];      //はポイントを訪れた
。11  
12である 関数 minPath($位置13である {
 14      グローバル $地図$スタートき$ ;
 15      静的 $のRESの = [];                                                            // 結果
16      $れて [] = $位置;                                                         // ポイントを介してレコード
17。     $次に = [];
 18である     foreachの$地図 [ $位置AS  $ K => $ V {)
 。19          IF$のV!== NULL ){
 20は             IF!(ISSETRES $ [ $スタート$ K ])||($ RES [ $スタート$ K ]> $ RES [ $スタート$の位置] + の$ V )){
 21は                 $ RES [ $スタート$ K ] = $ RES [ $スタート$ポジション ] + $ V ;               // 最短距離記録
22は                 IFin_array$ K$あっ))$次に [] = $ Kは ;                           // ここに後述する
23である             }
 24in_array$ K$あっ)&& $次の [] = $ K;                               // レコードの次のポイントに行く
25          }
 26である     } 
 27      
28      foreachの$次に AS  $ V){                                                      // また、再帰決意(次ブランク)の終わりで次のポイント、次に見つける
29          minPathを($のV )。
 30      }
 31は、     戻り $ RES ;
 32  }
 33が $ RES = minPath($位置)。
コードの表示

   追加:コードライン22注意:

    最初は私も問題を欠い上記のケースを実行し、問題を見つけることができませんでした。(何ライン22が存在しない場合)。ただし、この場合の実施次のような問題があります。距離もそれほど計算8 1-2、1-4 9と判定されたときに最初の2点に到達します。そして、私たちは、第三の点に最も近い1-2 3までの距離を得たが、それは遅すぎました。最初の2点は、「のleavinない、一度来ています。それは1-4から更新されません。したがって、それが検出された場合、より正確な距離(近より1-2 1-3-2)、その時点(第2点)の記録媒体からの除去点のアレイを介して、時間に戻って。

    または手動1-2-4が更新される1-2よりほぼ1-3-2、(最初の2点のうち全て)であることが判明した場合には、例えば、正確な精度を必要とする、結果を横切ることができます。しかし、ここで(だけではなく= 9 1-4を記録し、= 9 1-2-4を記録するために)パスを記録するために、パフォーマンスが最後のより多くの方にする必要があります。

  

 

 

  

おすすめ

転載: www.cnblogs.com/wangjianheng/p/11697363.html