L2: Fundamentals of AI Programming in Java Javaアプレット ArrayList HashMap
AI 応用の例 探索問題
Java アプレット VS アプリケーション ava アプレットとは html に貼り付けられる java で作成した小規模のプログラムのことで サーバー側からクライアントマシンに送られ ブラウザ上に読み込まれて実行される ブラウザと HTML の機能と表現力の制約にしばられずに インタラクティブな動作や より高い表現を用いることができる
AppletTest.java (Applet の起動 ) //Applet を import しないと Applet を使えない import java.applet.applet; //Applet にするには Applet を継承する public class AppletTest extends Applet { パッケージは各自適当につけること } // Appletを起動した時に初めに実行されるメソッド public void init() { // Appletの大きさの設定 setsize(300, 500); } main メソッドが不要なことに注意 実行例
AddTest.java( コンポーネントの追加 ) これはプログラムの一部です 完全版はプロジェクトサイトにあります // ボタンの作成 Button b1 = new Button(" ボタン "); Button b2 = new Button(); // ラベルの作成 Label l1 = new Label(" ラベル "); Label l2 = new Label(); public void init() { setsize(100, 200); // 作成しても add() で Applet 上に追加しないと表示されない add(b1); add(b2); add(l1); add(l2); } 実行例
ActionTest.java( アクションの追加 ) // ボタンが押された時にイベントを発生させたい場合は // ActionListenerに登録する b1.addactionlistener(this); add(b1); add(b2); add(l1); add(l2); } // ボタンが押された時に実行されるメソッド public void actionperformed(actionevent arg0) { JOptionPane.showMessageDialog(null, " ボタンが押されました "); }
PaintTest.java( 描画 ) public void actionperformed(actionevent arg0) { // 押されたら数を増やす i++; // 再描画 repaint(); } // 描画するメソッド public void paint(graphics g) { // 文字列の表示 g.drawstring(" ボタンを押した回数 " + i, 60, 50); // 直線の表示 g.drawline(50, 180, 70, 180); // 長方形の表示 g.drawrect(10, 70, 30, 30); }
ArrayList とは何か? ArrayList とは可変長配列クラスである 普通の配列と違い いくらでも要素を追加できる Int [] test = new int [5]; と書くと 5 つまでしか入れられないが ArrayList には制限がない キャパシティー という概念がある 可変長のため最終的にいくつの要素が追加されるかわからないので 動的にキャパシティー ( 要素を追加するためのメモリー上のスペース ) を確保する が この講義では無視 どんな型のオブジェクトでも追加することができる String, int,double, 自分で作った型 などどれでも追加可能
ArrayList の宣言 ArrayList の宣言には 3 つの種類がある ArrayList() キャパシティーが 10 の空の ArrayList を作る ArrayList(int capacity) キャパシティーが capacity の空の ArrayList を作る (capacity の大きさを自分で決められる ) ArrayList(Collection c) 初期値が c である ArrayList を作る (c は他の ArrayList 等 )
ArrayList で使えるメソッド public boolean add(object o) 指定したオブジェクトoを追加する 例 :al.add( 要素 1 ); public boolean remove(object o) 指定したオブジェクトを削除する public Object get(int index) index 番目の要素を返す
ArrayList で使えるメソッド public boolean contains(object o) 指定したオブジェクトoがリストにあるか判断する 例 :if(!al.contains( 要素 1 )) System.out.println( 要素 1はありません ); public boolean isempty() リストが空か判断する ( 要素数が 0 かどうか ) public int size() リストにある要素の数を返す
ArrayList で使えるメソッド public void clear() リストの要素を全て削除する public int indexof(object o) 指定した要素の位置を返す public void ensurecapacity(int min) キャパシティーを min 以上に設定する この他にもたくさんのメソッドがあります 詳しくは sun の HP を参照して下さい http://java.sun.com/javase/ja/6/docs/ja/api/java/util/arraylist.html
ジェネリック ArrayList には どんな型のオブジェクトでも要素として追加できる! 一見便利に見えるが 取り出す時に面倒なことがある import java.util.arraylist; public class ArrayListTest { public static void main(string[] args) { Int 型の値を保存してい ArrayList al = new ArrayList(); てもGetメソッドはObject al.add(0); 型を結果を返すので al.add(1); 足し算できない al.add(2); System.out.println(al.get(0)+al.get(1)); } } 実行するとエラーになります
ジェネリック 以下のようにすると格納できる型が Integer(int) に制限されるかわりにデータの取り出しが容易になる import java.util.arraylist; public class ArrayListTest { public static void main(string[] args) { ArrayList<Integer> al = new ArrayList<Integer>(); al.add(0); al.add(1); al.add(2); System.out.println(al.get(0) + al.get(1)); } } このような手法をジェネリックと呼ぶ
練習 ArrayTest.java のコメントを見ながらコードを書き加え 正しく実行できるようにしてみましょう 実行例
HashMap とは HashMap とはキーと値の組の集まりであるデータ構造 わかりやすくいうと可変長配列の index がなんでもいい版 イメージ キー値 学籍番号 10k0000 11k9999 09k0000 名前法政 法政 小金井 1 つの学籍番号に 1 つの名前が対応していて 学籍番号がわかれば学籍の名前がわかる
HashMap の宣言 宣言には 4 つの種類がある HashMap() 初期容量 (16) とデフォルトの負荷係数 (0.75) で空の HashMap を作成する HashMap(int initialcapacity) 指定された初期容量とデフォルトの負荷係数 (0.75) で空の HashMap を作成する HashMap(int initialcapacity, float loadfactor) 指定された初期容量と負荷係数で空の HashMap を作成する HashMap(Map<? extends K,? extends V> m) 指定された Map と同じマッピングで新規 HashMap を作成する
HashMap で使えるメソッド Public Object put(object key, Object value) 指定したキーと値を HashMap に追加する 例 :hm.put( 11k0000, 法政 ); Public Object get(object key) 指定したキーに対応する値を取得する Public Object remove(object key) 指定したキーと対応する値を削除する Public void clear() 要素を全て削除する
HashMap で使えるメソッド Public boolean isempty() 要素が空かどうか判断する Public boolean containskey(object Key) 指定したキーがあるかどうか判断する Public boolean containsvalue(object Value) 指定した値があるかどうか判断する この他にもたくさんのメソッドがあります 詳しくは sun の HP を参照して下さい http://java.sun.com/javase/ja/6/docs/ja/api/java/util/hashmap.html
ジェネリックについて ArrayList と同様に HashMap にもジェネリックが使えます HashMap<String,String>=new HashMap<String,String>(); キーと値 それぞれに設定する 警告のマークを左クリックすると のような項目が出るので総称型引数の推測を押せば適したジェネリックを設定してくれる
練習 HashMapTest.java のコメントを見ながらコードを書き加え 正しく実行できるようにしてみましょう
探索プログラム Applet,ArrayList,HashMap についてなんとなく理解できたら探索プログラムを作ってみましょう
Node の作成と表示 Node に必要なものを考えてみましょう ( 街の ) 名前ボタン X 座標 Y 座標経路情報隣接する街情報隣接する街に引く線 Node
Node.java クラスの実装例 import java.awt.button; import java.util.arraylist; import java.util.hashmap; // 都市クラス public class Node extends Button { // 街の名前 String name; // 座標 private int x, y; // 幅と高さ private int w = 80, h = 20; // 隣接都市 ArrayList<Node> children; // 経路 Node pointer; // 隣接都市への線 ( 隣接都市 / 隣接都市につなぐ線 ) HashMap<Node, Line> hm;
Node の表示, 隣接する Node ShowNode.java を書き加えていくつかの Node を Applet 上に表示し Node をクリックすると都市名をダイアログで表示するようにしてみましょう Line.java 隣接する Node に引く線
探索とは 探索とは人工知能の分野における基本的な要素技術であり 今ではカーナビやゲームの AI など 幅広い分野で応用されている おおまかに言うと ある入力に対しいくつもの解を評価して結果を返すこと この講義では 一般的な幅優先探索と深さ優先探索について学ぶ
宿題 (1) Read through lecture note (AI-2-L2.pptx); 今日の授業内容を復習しなさい (2) Run all example Java program source codes (L2-toStudent.zip); 例題を実行してみてください (3) Think about how to make a search algorithm to search for a solution from one city to another. ある街から別の街へ向かうルートを探索するプログラムの作成方法を考えてみてください