ゆっくりとPythonを学ぶことに決め、CS188.1x人工知能の世界に入りました

こんにちはHabr、または紹介



画像



私の小さな背景をお話しします。



もう一度、次のコントローラー、回路、PCBを選ぶのにうんざりし、市場の平均給与に落胆した平均的な電子技術者が決めました-もう一度プログラマーに行きたいです。



私はすでにプログラマーだとは言えませんが、3年前にVoenmehで情報システムとテクノロジーの学位を取得して教育を受けました。 そして、運命は大学時代に電子回路を持ち帰りました。 以前は、頻繁にオブジェクトへの出張が保存されていました(若くて独身-興味深い)が、昨年は全員が完全に疲れていました。

Habrを読んで、自分でPythonを選択しました。



これらの最初の 2つの最近の記事は、開始方法と開始方法を決定するのに役立ちました。



実際、勧告に基づいて、私は9月上旬に研究を始めました:Mark Lutz。 Python 4th Editionの学習。 彼の歯を噛み締め、圧縮されたすべてのものを握りしめました-残りの動機については803ページまで読み、途中ですべての演習を行いました。 OOPの途中で、私は完全にひねりました。 本は良いが、退屈だ-強さ。



辞めたくなかったので、 Googleのpythonクラスコースを試しました うわー、最終的なパズルを解くのにどれほどクールでしたか! 2つの夜が一瞬で通り過ぎました。



それから私は、力で本を絞るのはおそらく最良の選択肢ではないことに気づきました。 そして、私は西洋の大学のコースに関する投稿を見たことを思い出しました。 以前は、話された英語の知識は停止しましたが、私はニックパーランテを理解しました!



言われたよりすぐに、そして今、私はすでに2つのコースに登録しています。 ここにすでに書かれた最初のものについて、2番目のものについて- ここに 。 そして、あるPython 2.7では別の3.2ではさらに優れているという事実は、私は思った。 綿密なルッツの後、両方のコースの最初の2週間はナッツのようにクリックしました。 動機付けの進行状況バーに感謝します。 そして、リンクをクリックすると、彼は見つかりました-CS188.1x:人工知能 。 彼らは何を書きますか?



前提条件

  • プログラミング

    1. オブジェクト指向プログラミング
    2. 再帰
    3. PythonまたはPythonをすばやく習得する能力(短い参照者が提供)
  • データ構造

    1. リストと セット(配列、ハッシュテーブル)
    2. キューイング(スタック、キュー、優先度キュー)
    3. 木対 グラフ(トラバーサル、バックポインター)
  • 数学

    1. 確率、確率変数、および期待(離散)
    2. 基本的な漸近的複雑度(Big-O)
    3. 基本的なカウント(組み合わせと順列)






いいね! 私はマタンを覚えています、私の小さなパイソンを訓練しますが、コースがすでに2週間続いていることは何もありません。



フルコースプログラム
AIの概要

  • 概要
  • エージェント:知覚、決定、および作動


検索と計画

  • 情報に基づいていない検索(深さ優先、幅優先、均一コスト)
  • インフォームドサーチ(A *、貪欲なサーチ)
  • ヒューリスティックと最適性


制約満足度の問題

  • バックトラック検索
  • 制約の伝播(前方チェック、アーク整合性)
  • グラフ構造の活用


ゲームツリーと決定理論

  • 決定論

    設定、合理性、およびユーティリティ

    最大期待ユーティリティ


  • ゲームツリーとツリー構造の計算

    Minimax、Expectimax、組み合わせ

    評価関数と近似

    アルファベータプルーニング


マルコフ決定プロセス(MDP)

  • ポリシー、報酬、および価値
  • 値の反復
  • ポリシーの反復


強化学習(RL)

  • TD / Qラーニング
  • 探検
  • 近似


結論とまとめ

講義なし、最終試験週





現実との最初の出会い


コースについて詳しく説明します。 入門講義は非常に好印象を与えました。 おもしろい(そして最も重要なことは、ひげを生やしていない!)おじさん、うまくデザインされたスライド(それから私は別のデザイナーが写真に取り組んだことを知りました)。 講義は実際の聴衆から記録され、学生の反応が聞こえます(ほとんど笑い)。 彼らは、50年代以降に変化したことを今日のAIで理解し、Googleマシンからのビデオと、シャツとTシャツをきれいに折り畳むロボットを示したと言いました。 うーん、私の大学ではAIに関する知識の伝達が始まり、チューリングテストに関する話で終わりました。



画像



私にとっての欠点は、字幕付きのビデオをローカルにダウンロードできないことです。



講義は良いが、練習? ええ、最初の週には(オプション)Math Self Diagnostic、(オプション)Python Refresherがあります。

数学セクションからの質問の例を次に示します。



あなたは、10枚のカード(1から10とマーク)の単純化されたデッキの代わりに3枚のカードが配られるソリティアゲームをプレイしています。 カードの1つが10であるか、すべてのカードが奇数である場合に勝ちます。

異なる注文が異なる場合、勝ち手はいくつありますか?

勝つチャンスは?





実際、高等技術教育はささやきます:「どこかですでに…」ウィキペディアを使って、私は数学を思い出しました。 Pythonリフレッシャーはそれを調査しましたが、Lutzと2つのコースの後に落ち着いた自信が怠lazに火をつけ、私はタスクを開始しませんでした。



検索と木


グラフの概念と検索ツリーの開示が大学に導入されました。 したがって、私はそれが退屈になると予想した。 しかし、教師によって示された黄色の古い仲間のパックマンは、関心を保持しました。 深さ優先、幅優先、均一コスト、貪欲、A *(ヒューリスティック)検索-これはすべて順次説明され、Pakmanは検索アルゴリズムに従ってポイントの迷路を快活に走る例でした。 講義のコード行ではありません。 気に入った。



同じ日の宿題は講義で習得されました-グラフと迷宮のバグに関する一般的な質問

しかし、プロジェクト1のさらなるタブは混乱に陥りました。 アーカイブをダウンロードし(詳細はこちらNboooに感謝します )、Python 2.7でpacman.pyを実行します-再生します(ヘルプについては-hスイッチで開始することもできます)。 search.py​​モジュールで関数を作成すると、パックマンは迷路の隅で食べ物を見つけるはずです。 これは見た目です。



画像



これを書く方法を教えられなかったからです。 しかし、それがかかったので。 仕事はさておき。 初日、いくつかのDepth First Search実装曲線が作成され、パックマンは定期的に食事を始めました。 しかし、それらは容赦なく削除され、検索によって開かれたブランチの数が判明し、パスの最適性が厳しく制御されました。 ソースコードをサーバーにダウンロードした後、関数とメソッドが自動的にテストされます。 もう一度、コードページを消去し、彼の剣を投げて大声で叫んだ。 紙片は木、パックマンと迷路の絵で覆われていました。 電子の同僚は、それをすり抜ける彼らの義務と考えました。 その結果、実装が見つかりました。 誰が学びたいかは、自分で苦しむ価値があります。 Pythonとアルゴリズムを使用している人から、このケースについてのコメントを聞いてうれしいです。



コード
ここではすべてが明確だと思います。util.Stack()とutilQueue()は、実際には、それぞれプッシュとポップ、FIFOメソッドとLIFOメソッドを使用して、学生の便宜のためにクラスにラップされたリストです。



def depthFirstSearch(problem): """ Search the deepest nodes in the search tree first Your search algorithm needs to return a list of actions that reaches the goal. Make sure to implement a graph search algorithm To get started, you might want to try some of these simple commands to understand the search problem that is being passed in: print "Start:", problem.getStartState() >>> Start: (4, 3) print "Is the start a goal?", problem.isGoalState(problem.getStartState()) >>> Is the start a goal? False print "Start's successors:", problem.getSuccessors(problem.getStartState()) >>> Start's successors: [((4, 4), 'North', 1), ((4, 2), 'South', 1), ((5, 3), 'East', 1), ((3, 3), 'West', 1)] """ def fromXYtoXY(coord1, coord2): ''' tuple(int,int), tuple(int,int) -> str Takes near coord1 coord2 tuples, returns string way, or error sample for tinyMaze: >>>fromXYtoXY((5,5),(4,5)) >>>'West' >>>fromXYtoXY((1,3),(2,3)) >>>'East' ''' if coord1[0]==coord2[0]: if coord1[1]-coord2[1]==1: return 'South' else: return 'North' elif coord1[1]==coord2[1]: if coord1[0]-coord2[0]==1: return 'West' else: return 'East' else: return ('Path not found from %s to %s' % (coord1, coord2)) Fringe = util.Stack() currState=problem.getStartState() Fringe.push([currState]) while True: currState=Fringe.pop() if problem.isGoalState(currState[-1]): listWays=[] fromState=currState[0] #      for state in currState[1:]: # ex: ['South', 'West'] listWays.append(fromXYtoXY(fromState,state)) fromState=state return listWays break for State, Way, Price in problem.getSuccessors(currState[-1]): if not State in currState: nextPath=currState[:] nextPath.append(State) Fringe.push(nextPath)
      
      









私の意見では、Breadth First Searchの実装は少しきれいになりました。



コード
 def breadthFirstSearch(problem): """ Search the shallowest nodes in the search tree first. """ fringe=util.Queue() visitedNodes=[] fringe.push([problem.getStartState(),[]]) #    +   while not fringe.isEmpty(): #     currNode = fringe.pop() #  if currNode[0] not in visitedNodes: #    visitedNodes.append(currNode[0]) # for State, Way, Price in problem.getSuccessors(currNode[0]): path=currNode[1][:] #     path.append(Way) if problem.isGoalState(State): return path else: fringe.push([State, path])
      
      









その場合、ユニフォームコスト検索とA *検索(ヒューリスティック関数として食品へのユークリッド距離を使用)は、すでに比較的簡単に実装できました。



コード
 def uniformCostSearch(problem): "Search the node of least total cost first. " fringe=util.PriorityQueue() visitedNodes=[] fringe.push([problem.getStartState(),[],0],0) while not fringe.isEmpty(): currNode = fringe.pop() if problem.isGoalState(currNode[0]): return currNode[1] if currNode[0] not in visitedNodes: #    visitedNodes.append(currNode[0]) # for State, Way, Price in problem.getSuccessors(currNode[0]): path=currNode[1][:] #     totalCost=currNode[2]+Price path.append(Way) fringe.push([State, path, totalCost],totalCost) def aStarSearch(problem, heuristic=nullHeuristic): "Search the node that has the lowest combined cost and heuristic first." "*** YOUR CODE HERE ***" fringe=util.PriorityQueue() visitedNodes=[] fringe.push([problem.getStartState(),[],0],0) while not fringe.isEmpty(): currNode = fringe.pop() if problem.isGoalState(currNode[0]): print 'Success!!', currNode[1] return currNode[1] if currNode[0] not in visitedNodes: #    visitedNodes.append(currNode[0]) # for State, Way, Price in problem.getSuccessors(currNode[0]): #print 'succ', State, Way, Price path=currNode[1][:] #     totalCost=currNode[2]+Price path.append(Way) fringe.push([State, path, totalCost],totalCost+heuristic(State,problem))
      
      









プロジェクト1の2番目の部分では、子クラスのメソッドを調整することにより、searchAgents.pyモジュールの検索問題を修正するように生徒に求めました。 以前にパックマンと食事が1つずつあった場合、4つのコーナーにパックマンと食事が1つずつあるので、最適な道を歩く必要があります。 また、検索ツリーのブランチを展開するコストを削減するために設計されたA * Searchのヒューリスティック関数を作成します(評価システムは次のとおりです:一貫性のないヒューリスティックは信用を得られません。 。1200ノード未満を拡張する場合は1ポイント。)。



プロジェクト1は、迷路の多くのポイントを最適に食べるという問題の解決策で終わりました。



画像



その結果、これらの問題を解決するためにほぼ3営業日を費やしました。 頭を壊すことは興味深く、将来的には役に立つことを願っています。



私は講義の一つで先生の冗談の言葉で終わりたいです:



NPハード 申し訳ありませんが、これはAIクラスです。 すべてが難しいです。

レビューが誰かを少し助けたと思います。 コース(または単に問題を解決する)すべての初心者にPythonに精通することをお勧めします。私自身はプロジェクト2を楽しみにしています。



更新しました。 パート2



All Articles