fundamentals of ai programming in javajava アプレット vs アプリケーション...
TRANSCRIPT
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()
ArrayList(int capacity)
ArrayList(Collection c)
→キャパシティーが10の空のArrayListを作る
→キャパシティーがcapacityの空のArrayListを作る (capacityの大きさを自分で決められる)
→初期値が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) { ArrayList al = new ArrayList(); al.add(0); al.add(1); al.add(2); System.out.println(al.get(0)+al.get(1)); } }
※実行するとエラーになります
Int型の値を保存していてもGetメソッドはObject型を結果を返すので 足し算できない
ジェネリック 以下のようにすると格納できる型が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に必要なものを考えてみましょう
Node
(街の)名前 ボタン X座標 Y座標 経路情報 隣接する街情報 隣接する街に引く線
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. ある街から別の街へ向かうルートを探索する プログラムの作成方法を考えてみてください。