-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
417 lines (366 loc) · 21 KB
/
index.html
File metadata and controls
417 lines (366 loc) · 21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>知能プログラミング演習IIグループ作成 レポート</title>
<style type="text/css">
<!--
body {
padding: 10px;
}
div.algorithm {
border: 1px dashed #bbb;
margin-top: 5px;
margin-bottom: 5px;
}
div.algorithm ol {
list-style-type: none;
}
div.algorithm div.legend {
background: #fcfcfc;
margin-top: 5px;
margin-bottom: 5px;
}
div.algorithm div.legend ul:last-child {
margin-bottom: 0;
}
div.algorithm ol { padding-left: 5px; }
div.algorithm li.i1 { padding-left: 30px; }
div.algorithm li.i2 { padding-left: 60px; }
div.algorithm li.i3 { padding-left: 90px; }
div.algorithm li.i4 { padding-left:120px; }
div.algorithm li.i5 { padding-left:150px; }
div.algorithm li.i6 { padding-left:180px; }
div.algorithm li.pad_top { padding-top: 5px; }
div.algorithm li.bold { font-weight: bold; }
div.algorithm .comment { color: #787979; }
-->
</style>
</head>
<!-- このグループ作成資料は,同じファイルを全員のGrepX(Grep5やGrep6等)ディレクトリにコピーして置くこと -->
<body>
<center><h1>知能プログラミング演習II グループ作成レポート</h1></center>
<h3>[名前・学籍番号]</h3>
<!-- グループ全員の名前, 学籍番号を書き,個人作成書類へのリンクを張る -->
<ul>
<li><a href="../../../../cjh15067/workspace/kprep/rep5/index.html">佐藤清隆 24115067</a>: フレームのGUIレイアウト担当</li>
<li><a href="../../../../cjh15088/workspace/kprep/rep5/index.html">寺部和紀 24115088</a>: フレームのデモン担当</li>
<li><a href="../../../../cjh15109/workspace/kprep/rep5/index.html">早川駿 2411109</a>: フレームのデモン担当</li>
<li><a href="../../../../cjh15110/workspace/kprep/rep5/index.html">林幸汰 2411110</a>: フレームのGUI担当、質問応答システム担当</li>
<li><a href="../../../../cjh15113/workspace/kprep/rep5/index.html">林政行 2411113</a>: セマンティック担当</li>
</ul>
<h3>[役割分担]</h3>
<!-- 役割分担を書く.-->
<ul>
<li>佐藤清隆 : フレームのGUIレイアウト担当</li>
<li>寺部和紀 : フレームのデモン担当</li>
<li>早川 駿 : フレームのデモン担当</li>
<li>林 幸汰 : フレームのGUI、質問応答システム担当</li>
<li>林 政行 : セマンティック全般、フレームのGUIの基礎作成担当</li>
</ul>
<h3>[ソースファイル]</h3>
<ul>
<li><a href="../../Rep5/src/content/Observable.java">Observable.java</a></li>
<li><a href="../../Rep5/src/content/Observer.java">Observ.java</a></li>
<li><a href="../../Rep5/src/Frame/AIClassFrame.java">AIClassFrame.java</a></li>
<li><a href="../../Rep5/src/Frame/AIDemonProc.java">AIDemonProc.java</a></li>
<li><a href="../../Rep5/src/Frame/AIDemonProcs.java">AIDemonProcs.java</a></li>
<li><a href="../../Rep5/src/Frame/AIFrame.java">AIFrame.java</a></li>
<li><a href="../../Rep5/src/Frame/AIFrameSystem.java">AIFrameSystem.java</a></li>
<li><a href="../../Rep5/src/Frame/AIInstanceFrame.java">AIInstanceFrame.java</a></li>
<li><a href="../../Rep5/src/Frame/AISlot.java">AISlot.java</a></li>
<li><a href="../../Rep5/src/Frame/AIWhenConstructedProc.java">AIWhenConstructedProc.java</a></li>
<li><a href="../../Rep5/src/Frame/FrameQASystem2.java">FrameQASystem2.java</a></li>
<li><a href="../../Rep5/src/Frame/OurFrameSystem.java">OurFrameSystem.java</a></li>
<li><a href="../../Rep5/src/semanticnet/Link.java">Link.java</a></li>
<li><a href="../../Rep5/src/semanticnet/Node.java">Node.java</a></li>
<li><a href="../../Rep5/src/semanticnet/OurSemanticNet.java">OurSemanticNet.java</a></li>
<li><a href="../../Rep5/src/semanticnet/SemanticNet.java">SemanticNet.java</a></li>
<li><a href="../../Rep5/src/ui/components/input/MapDragListener.java">MapDragListener.java</a></li>
<li><a href="../../Rep5/src/ui/components/input/MapZoomListener.java">MapZoomListener.java</a></li>
<li><a href="../../Rep5/src/ui/components/AIFrameLayout0.java">AIFrameLayout0.java</a></li>
<li><a href="../../Rep5/src/ui/components/AIFramePanel0.java">AIFramePanel0.java</a></li>
<li><a href="../../Rep5/src/ui/components/MapComponent.java">MapComponent.java</a></li>
<li><a href="../../Rep5/src/ui/components/MapLayout.java">MapLayout.java</a></li>
<li><a href="../../Rep5/src/ui/components/MapPanel.java">MapPanel.java</a></li>
<li><a href="../../Rep5/src/ui/components/SemanticNetLayout.java">SemanticNetLayout.java</a></li>
<li><a href="../../Rep5/src/ui/components/SemanticNetPanel.java">SemanticNetPanel.java</a></li>
<li><a href="../../Rep5/src/ui/components/UIFrame.java">UIFrame.java</a></li>
<li><a href="../../Rep5/src/ui/components/UILeanker.java">UILeanker.java</a></li>
<li><a href="../../Rep5/src/ui/components/UINode.java">UINode.java</a></li>
<li><a href="../../Rep5/src/ui/components/UISlot.java">UISlot.java</a></li>
<li><a href="../../Rep5/src/ui/AIFrameGUI0.java">AIFrameGUI0.java</a></li>
<li><a href="../../Rep5/src/ui/PoorGUI.java">PoorGUI.java</a></li>
<li><a href="../../Rep5/src/ui/SemanticUI.java">SemanticUI.java</a></li>
<li><a href="../../Rep5/src/util/ArrayUtils.java">ArrayUtils.java</a></li>
<li><a href="../../Rep5/src/util/SemanticNetUtils.java">SemanticNetUtils.java</a></li>
<li><a href="../../Rep5/dbpedia_classes.txt">dbpedia_classes.txt</a></li>
<li><a href="../../Rep5/kt_classes.txt">kt_classes.txt</a></li>
<li><a href="../../Rep5/kt_instances.txt">kt_instances.txt</a></li>
<li><a href="../../Rep5/nagoya_instances.txt">nagoya_instances.txt</a></li>
<li><a href="../../Rep5/Semantic067.txt">Semantic067.txt</a></li>
<li><a href="../../Rep5/Semantic088.txt">Semantic088.txt</a></li>
<li><a href="../../Rep5/Semantic109.txt">Semantic109.txt</a></li>
<li><a href="../../Rep5/Semantic110.txt">Semantic110.txt</a></li>
<li><a href="../../Rep5/Semantic113.txt">Semantic113.txt</a></li>
<li><a href="../../Rep5/SemanticSample.txt">SemanticSample.txt</a></li>
<!-- 実装・変更したソースファイルへのリンク.修正する. -->
<!-- ※ リンクは絶対パスに変更せず,上記のような相対パスのままで! -->
</ul>
<hr>
<h3>[課題]</h3>
<!-- 課題を書く.-->
<pre>
[必須課題5-1] セマンティックネットのプログラムを参考に,自分達(グループメンバー)についてのセマンティックネットを構築せよ(教科書p.101 練習問題1)。
[必須課題5-2] フレームのプログラムを参考に,自分達の家族や親戚,知人等について関連する知識をフレームで表現せよ。
また,この家族・親戚フレームを用いた質問応答システムを作成せよ(教科書p.101 練習問題2)。
[必須課題5-3] セマンティックネットやフレームの関係を図として示すためのユーザインターフェース(GUI) を設計し実装せよ(教科書p.101 練習問題3)。
[発展課題5-4] DBpedia Japaneseは,Wikipedia日本語版から生成された知識表現から成る巨大なデータベースである.
上記5-2で作成した質問応答システムを,DBpedia中の知識を使って質問に答えられるよう,拡張せよ.
</pre>
<h3>[独自仕様の説明]</h3>
<!--
もし自分で独自に決めた仕様があれば,その説明を書く.
-->
各自の個人レポートに記入
<h3>[プログラムの構造]</h3>
<!-- どのような設計をしたか.-->
<div style="padding: 0 20px;">
<pre>
AIFrameGUI0
|
|-initialize
|
|-setupMapPanel
|
|-setupCommodPanel
|
|-printHumanName
|
|-valueChanged
|
|-actionPerformed
|
|-main
AIFrameLayout0
|
|-removeLayoutComponent
|
|-preferredLayoutSize
|
|-layoutContainer
|
|-addLayoutComponent
|
|-layoutUIFrame
|
|-clear
AIFramePanel0
|
|-showFramesFor
|
|-addFrame
|
|-clear
|
|-searchUP
|
|-searchDown
|
|-highlightRelatedFrames
|
|-doPaintComponent
|
|-drawline
</pre>
</div>
<h3>[実装の説明]</h3>
<!--
どう実装したか,ソースコードを詳細に説明する.
特に重要な箇所はレポートにペーストして説明する.
-->
<h4 style="font-size: large; color: #236; border-left: 8px #026 double; padding-left: 10px;">SemanticNet 関連</h4>
<h4>[SemanticUI (SemanticNet GUI)]</h4>
<p>SemanticNet の GUI は、データセットを表示する部分とグラフを表示する部分から構成されるが、前者は既存のコンポーネント <code>JTable</code> を使い、後者は <code>JComponent</code> を派生させた、地図のような操作が可能なグラフを表示するコンポーネント <code>MapPanel</code> を作り、それを使って実現した。</p>
<p>この <code>MapPanel</code> は、地図のようにスクロールさせ、子コンポーネントを表示することができる、JPanel を継承したコンテナであり、その機能を提供するために、表示している中心の座標とズーム量を保持している。</p>
<pre>
public class MapPanel extends JPanel implements DesignMode {
double zoom = 1.0f;
Point2D.Double center = new Point2D.Double(0, 0);
Rectangle viewportBounds = new Rectangle(0, 0, 0, 0);
...
}
</pre>
<p>子コンポーネントとして <code>MapComponent</code> を持つことを前提としている。この <code>MapComponent</code> は、ワールド座標系における絶対座標、大きさの情報を持ち、<code>MapPanel</code> 内に描画する際に、 <code>MapPanel</code> からの相対座標を計算し、その位置にズームを考慮した適切な大きさで描画されるようにしている。</p>
<pre>
public class MapComponent extends JComponent {
// マップビュー
MapPanel panel;
// ワールド座標系での中心の位置
Point2D.Double center;
// 幅
double width;
// 高さ
double height;
...
@Override
public int getX() {
if (panel != null) {
return (int) panel.toRelativeX(center.x - width/2.0);
}
return super.getX();
}
@Override
public int getY() {
if (panel != null) {
return (int) panel.toRelativeY(center.y - height/2.0);
}
return super.getY();
}
@Override
public int getWidth() {
if (panel != null) {
return (int) panel.toRelativeSize(width);
}
return (int) width;
}
@Override
public int getHeight() {
if (panel != null) {
return (int) panel.toRelativeSize(height);
}
return (int) height;
}
...
}
</pre>
<p>このような新しいコンポーネント<code>MapPanel</code>, <code>MapComponent</code> を作り、それを継承して SemanticNet のグラフを表示するためのコンポーネント <code>SemanticNetPanel</code> を作っている。このコンポーネントは SemanticNet のノードを表す <code>UINode</code> コンポーネントを子コンポーネントとして持ち、(Swingの機能により)それらを表示し、かつ SemanticNet のリンクを描画するような機能を持っている。</p>
<p>今回 SemanticNet のグラフを表示するにあたり、最も重要な部分と考えられる、ノードをきれいに配置する部分は、独自に実装した <code>SemanticNetLayout</code> というレイアウトマネージャが行っている。このレイアウトマネージャは、<b>Force-directed graph drawing</b> アルゴリズムに似たアルゴリズムでノードの配置を行っている。次に用いているアルゴリズムを示す。</p>
<div class="container algorithm">
<div class="legend">
<ul>
<li>nodes = [node1, node2, ..., nodeN]: ノードのリスト</li>
<li>Fi: i 番目のノードに働く力</li>
<li>Vi: i 番目のノードの速度</li>
<li>Pi: i 番目のノードの位置</li>
</ul>
</div>
<div>
function <b>updateUINodes()</b> : 全ノードの位置を更新する
<ol>
<li class="i1">e <- 0 // 運動エネルギーの合計を 0 で初期化</li>
<li class="i1">for i=0:N {</li>
<li class="i2">node1 <- nodes[i];</li>
<li class="i2">Fi = [0, 0]; // ノード node1 に働く力を 0 で初期化</li>
<li class="i2"> </li>
<li class="i2 comment pad_top bold">// 他のノードとの反発力を計算</li>
<li class="i2">for (UINode node2 : (node1 以外のすべての UINode)) {</li>
<li class="i3">Fi <- Fi + (定数) / (距離(node1, node2) ^ 2); // クーロン力を計算</li>
<li class="i2">}</li>
<li class="i2"> </li>
<li class="i2 comment pad_top bold">// 繋がっているノードとの引力を計算</li>
<li class="i2">for (UINode node2 : node1 と繋がっているノード)</li>
<li class="i3">Fi <- Fi + (バネ定数) * (距離 (node1, node2) - バネの自然長) // フックの法則による力を計算<li>
<li class="i2">}</li>
<li class="i2 comment pad_top bold">// 原点 (0,0) に戻す力を加える</li>
<li class="i2">Fi <- Fi - (定数) * (node1 の位置)</li>
<li class="i2"> </li>
<li class="i2 comment pad_top bold">// 速度, 位置の計算</li>
<li class="i2">Vi <- (Vi + (微小時間) * Fi / (node1 のリンク数)) * (減衰定数); // node1 の速度 V を求める</li>
<li class="i2">Pi <- Pi + (微小時間) * Vi; // node1 の次フレームの位置 P を求める</li>
<li class="i2"> </li>
<li class="i2 comment pad_top bold">// 運動エネルギー e を更新する</li>
<li class="i2">e <- e + |Vi|</li>
<li class="i1">}</li>
<li class="i2"> </li>
<li class="i1 comment pad_top bold">// 各ノードの位置を更新する</li>
<li class="i1">for (UINode node : すべての UINode) {</li>
<li class="i2">node.setCenter(Pi);</li>
<li class="i1">}</li>
</ol>
</div>
</div>
<p>このような Force-directed graph drawing アルゴリズムに似たアルゴリズムを使い、ノードを綺麗に配置するようにした。</p>
<h4 style="font-size: large; color: #236; border-left: 8px #026 double; padding-left: 10px;">AIFrame 関連</h4>
<h4>[AIFramePanel,AIFrameLayout]</h4>
<p>
AIFramePanel0 てフレーム間の線を引いたりフレームの関係を調べる。
AIFrameLayout0ではフレームの配置を決定している。
</p>
<h4>[AIDemonProcs]</h4>
<p>質疑応答システムについてデモンを使うことにした。
デモンを使うことによって矛盾が生じにくくなる。
また、少ないスロット(今回の場合は親のスロットのみ)で家族構成を検索することができる。
そのため、記入する量が減らすことができる。</p>
<p>ここでデモンの実装の仕方について書く。</p>
<p>まず条件を満たすものを入れるリストrelistを用意する。
次の文で自分の親が登録されているかチェックする。</p>
<pre>
//自分の親が登録されているかチェック
if (!(inFrame.readSlotValue(inFrameSystem, "親", false) == null)){
</pre>
<p>
フレームから親の名前を取ってきてリストolistに入れる。
親の数(普通は2)だけループさせ、olistからひとりずつ親の名前を取り出し、その名前を元にフレームを取ってくる。
上と同じようにして親(祖父母)が登録されているかチェックし、名前をリストに入れ、祖父母の数だけループさせる。
祖父母の逆リンクから子供の名前(祖父母を親だと見て接続している名前)を取ってきてリストklistに入れる。klistには親の兄弟(自分の親も含む)の名前が入ることになる。
</p>
<pre>
// 親の逆リンクから子供の名前(自分を親だと見て接続している名前)をとってくる
// klistは兄弟の名前のリスト
ArrayList klist = gparentframe.getLeankersSlotNames("親");
</pre>
<p>
klistに入っている名前からフレームを取ってきて、それが自分の親でなく、かつ、性別スロットの値が「男」の場合はおじなのでrelistに格納する。(前のループで登録されていない場合のみ)
最後にrelistを返すが、relistのサイズが0だった場合は対象が登録されていないということなのでメッセージを入れてから返す。
</p>
<pre>
if(relist.size()==0)
relist.add("登録されていないため分からない");
return AIFrame.makeEnum(new ArrayList(relist));
</pre>
<FONT color="#708090"><h4>[必須課題5-2&発展課題5-4]</h4></FONT>
<ul>
<FONT color="#4169E1"><h4>[AIFrame]</h4></FONT>
<li>leankersというHashMapを追加し、自分に対しリンクを持っているフレームを記憶できるようにした。(逆方向のリンク)
<li>mSlotsにあるスロットの数を返すメソッドを追加、またmSlotsの指定された位置のスロット名を返すメソッドを追加し外部からスロットの中身を確認しやすくした。
<li>指定されたスロットの中身をArrayListとして返すメソッドを追加した。
<FONT color="#4169E1"><h4>[AIDemonProcs]</h4></FONT>
<li>今回の課題5-2に合わせた仕様として家族親戚の情報のスロットを各個人のスロットにいれるのでは無く、上位の人間の概念クラスのデモン手続きとして登録した。<br>具体的には各個人のフレームにはその人の親、誕生日、性別をかならず登録する(逆に言えば人のインスタンスのフレームには親の情報しか家族関係の情報を入れない)。<br>たとえば兄がいる人はその人に兄スロットがあるのでは無く、人間クラスにある兄を求めるデモンを使うことで親の情報などを元に兄を求めることができる。<br>
これにより弟からは兄として登録されているのに、弟の方では兄が登録されていないという矛盾が起きない<br>
また個人のインスタンスの登録の時必要な情報が少ないのでデータ記入の際に楽ができる。
<FONT color="#4169E1"><h4>[FrameQASystem2]</h4></FONT>
<li>「名古屋市の隣接自治体の隣接自治体の花は?」といった質問に対応できるような質問応答システムにした。<br>
「の」と「は?」を使うと名称の一部と区別できないのでそれぞれスペースと?で対応し「名古屋市 隣接自治体 隣接自治体 花?」といった質問を受け付けるようにした。<br>
<li>「(フレーム名)?」でそのフレームのスロット名そのスロット内の値全てと逆リンクを張っているフレームを全て表示するようにした。
</ul>
<FONT color="#708090"><h4>[必須課題5-3]</h4></FONT>
今回必須課題5-2で作ったデモン手続きを生かした家族、親戚の関係を表すフレームシステムはデモンありきなのに対し、応用課題5-4はデモンではなくそれぞれのインスタンスのスロットありきなので、それぞれに合わせた二つのGUIを設計した。<br>
<ul>
<FONT color="#4169E1"><h4>[AIFrameGUI0]</h4></FONT>
必須課題5-2の家族親戚フレームを図で理解できることに特化させて設計したGUI、登録されている人の名前を入力し検索すると、簡易的なその人の家系図が表示される。<br>
その状態で姉、従兄弟などの親戚関係をリストから選択すると対応する人物の表示の色が変わりそのひとの親戚や家族が視覚的にわかりやすく調べることができる。<br>
当然色の変更には必須課題5-2で作成したデモンを活用している。<br>
家系図に表示する人は検索にかけられた人から上の世代、下の世代それぞれ二回までの移動で見つかる人<br>
<FONT color="#4169E1"><h4>[PoorGUI]</h4></FONT>
応用課題5-4での名古屋のデータをツリー構造で表示するGUI、はじめに登録されているフレームを表示し、フレームのスロットのなかでフレームとして登録されているものをトリプルクリックすると、そのフレームがされに展開されくわしいフレームの関係を見ることとができる。<br>
完全にJTreeそのものな表示なのでおもしろみがないかもしれない。
</ul>
<h3>[実行例]</h3>
<!-- 実行例を示す.PNGやGIF等の絵を張っても良い.-->
各自の個人レポート記入
<h3>[グループでの考察]</h3>
<!--
グループ作成書類に書くように指定された考察事項があれば書く.
もし指定された考察事項がなければ,個人作成課題に考察を書けばよい.
-->
<p>今回は指定がなかったためなし</p>
<hr>
<h3>[参考文献]</h3>
<!-- 参考文献を書く.助けてもらった人がいれば,それも書く-->
<ul class="circle">
<li>教科書</li>
<li>Graph drawing - Wikipedia (http://en.wikipedia.org/wiki/Graph_drawing) (2014年12月1日)</li>
<li>Force-directed graph drawing - Wikipedia (http://en.wikipedia.org/wiki/Force-directed_graph_drawing) (2014年12月1日)</li>
</ul>
</body>
</html>