ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュの掃除機AIプログラム

  • mixiチェック
  • このエントリーをはてなブックマークに追加
http://members.jcom.home.ne.jp/pokemon_glider/ai2.jpg
問題)上図の8つのどの状態から始めても、このプログラムが完了するようにJavaでコーディングしなさい。

以下が実装例のヒントと実行結果のサンプルです
http://members.jcom.home.ne.jp/pokemon_glider/ai6.ppt

以前解いていただいた
http://mixi.jp/view_bbs.pl?id=11525717&comm_id=1017129
この問題を応用する問題です。

お願いします。

コメント(6)

私の環境ではpptファイルを開けず、読めません。
jpgやgifなどに変換してもらえれば
できるかと思います。
すみませんでした
ページ数が多くなってしまいますがお願いします。

http://members.jcom.home.ne.jp/pokemon_glider/0.jpg
http://members.jcom.home.ne.jp/pokemon_glider/1.jpg
http://members.jcom.home.ne.jp/pokemon_glider/2.jpg
http://members.jcom.home.ne.jp/pokemon_glider/3.jpg
http://members.jcom.home.ne.jp/pokemon_glider/4.jpg
http://members.jcom.home.ne.jp/pokemon_glider/5.jpg
http://members.jcom.home.ne.jp/pokemon_glider/6.jpg
http://members.jcom.home.ne.jp/pokemon_glider/7.jpg
http://members.jcom.home.ne.jp/pokemon_glider/8.jpg
http://members.jcom.home.ne.jp/pokemon_glider/9.jpg
http://members.jcom.home.ne.jp/pokemon_glider/10.jpg
http://members.jcom.home.ne.jp/pokemon_glider/11.jpg
http://members.jcom.home.ne.jp/pokemon_glider/12.jpg
http://members.jcom.home.ne.jp/pokemon_glider/13.jpg
http://members.jcom.home.ne.jp/pokemon_glider/14.jpg
http://members.jcom.home.ne.jp/pokemon_glider/15.jpg
http://members.jcom.home.ne.jp/pokemon_glider/16.jpg
import java.util.Hashtable;

public class State {
public static final String MOVE_LEFT = "MOVE LEFT";
public static final String MOVE_RIGHT = "MOVE RIGHT";
public static final String SUCK = "SUCK";

//State ID
private int id;
//左の部屋に埃はあるか
private boolean dirtInLeftRoom;
//右の部屋に埃はあるか
private boolean dirtInRightRoom;
//vacuumがどちらの部屋にいるか。
//true : 左の部屋
//false : 右の部屋
private boolean vacuum;

//現状態から移行可能な三つの次状態
private Hashtable nextStates;

//解表示のためのポインタ
private State pointer;

//この状態に移行するために行われたアクション
//解表示のために必要
//(previousOperatorに値をセットするタイミングはpointerをセットするときと同じ!)
private String previousOperator;

/**
* コンストラクタ
* @param id この状態のID
* @param dirtInLeftRoom 左の部屋に埃があるかないか
* @param dirtInRightRoom 右の部屋に埃があるかないか
* @param vacuum Vacuumが右左どちらのへやにあるか
*/
public State(int id, boolean dirtInLeftRoom, boolean dirtInRightRoom, boolean vacuum) {

this.id = id;
this.dirtInLeftRoom = dirtInLeftRoom;
this.dirtInRightRoom = dirtInRightRoom;
this.vacuum = vacuum;

nextStates = new Hashtable();
}

/**
* 現状対から移行可能な全3次状態をセットするメソッド
* @param left Vacuumが左に移動した場合の次状態
* @param right Vacuumが右に移動した場合の次状態
* @param suck Vacuumが現在の部屋で吸取りを行った場合の次状態
*/
public void setNextState(State left, State right, State suck) {
//オペレータをキーとし、次状態インスタンスを値として
//Hashtableへ登録する
nextStates.put(MOVE_LEFT, left);
nextStates.put(MOVE_RIGHT, right);
nextStates.put(SUCK, suck);
}

public void setPreviousOperatorAndPointer(String previousOperator, State pointer) {
this.previousOperator = previousOperator;
this.pointer = pointer;
}

public String getPreviousOperator() {
return previousOperator;
}

public State getPointer() {
return pointer;
}

public Hashtable getNextStates() {
return nextStates;
}

public String toVerboseString() {
return "(State" + id + ") : " +
"The left room has " + (dirtInLeftRoom ? "" : "no ") + "dirt, " +
"the right room has " + (dirtInRightRoom ? "" : "no ") + "dirt " +
"and the vacuum is in the " + (vacuum ? "left " : "right ") + "room.";
}

public String toString() {
return "State" + id;
}
}
import java.util.Vector;
import java.util.Hashtable;
public class VacuumProblem {

private State state[];
private State goal, goal2;
private State start;


public VacuumProblem(int startId) {
makeStateSpace();
start = state[startId];
}

private void makeStateSpace() {
state = new State[8];

state[0] = new State(0, true, true, true);
state[1] = new State(1, true, true, false);
state[2] = new State(2, true, false, true);
state[3] = new State(3, true, false, false);
state[4] = new State(4, false, true, true);
state[5] = new State(5, false, true, false);
state[6] = new State(6, false, false, true);
state[7] = new State(7, false, false, false);

goal = state[6];
goal2 = state[7];

state[0].setNextState(state[0], state[1], state[4]);
state[1].setNextState(state[0], state[1], state[3]);
state[2].setNextState(state[2], state[3], state[6]);
state[3].setNextState(state[2], state[3], state[3]);
state[4].setNextState(state[4], state[5], state[4]);
state[5].setNextState(state[4], state[5], state[7]);
state[6].setNextState(state[6], state[7], state[6]);
state[7].setNextState(state[6], state[7], state[7]);
}

public void printSolution(State theState) {
if (theState == start) {
System.out.println(theState.toVerboseString());
} else {
System.out.println(theState.toVerboseString());
System.out.println("↑");
System.out.println("[" + theState.getPreviousOperator() + "]");
System.out.println("↑");
printSolution(theState.getPointer());
}
}



public void breadthFirst() {
String[] operator = {State.MOVE_LEFT, State.MOVE_RIGHT, State.SUCK,};
State theGoal = null; //ゴールは二つあるが、実際に見つかった方のゴールが代入される

Vector open = new Vector();
open.addElement(start);
Vector closed = new Vector();
boolean success = false;
int step = 0;
for (;;) {
System.out.println("STEP:" + (step++));
System.out.println("OPEN:" + open.toString());
System.out.println("closed:" + closed.toString());
if (open.size() == 0) {// openは空か?
success = false;
break;
} else {
State stt = (State) open.elementAt(0);
open.removeElementAt(0);
if (stt == goal || stt == goal2) {
success = true;
theGoal = stt;
break;
} else {
Hashtable children = stt.getNextStates();
closed.addElement(stt);
for (int i = 0; i < operator.length; i++) {
State m = (State) children.get(operator[i]);
if (!open.contains(m) && !closed.contains(m)) {
m.setPreviousOperatorAndPointer(operator[i], stt);
if (m == goal || m == goal2) {
open.insertElementAt(m, 0);
} else {
open.addElement(m); // add at the ack
}
}
}
}
}
}
if (success) {
System.out.println("*** Solution ***");
printSolution(theGoal);
}
}

public static void main(String args[]){
if(args.length != 1){
System.out.println("USAGE:");
System.out.println("java VacumProblem [Number]");
System.out.println("[Number] = 0,1,2,3,4,5,6,7");
} else {
int startId = Integer.parseInt(args[0]);
System.out.println("\nBreadth First Search");
VacuumProblem vacuumProblem = new VacuumProblem(startId);
vacuumProblem.breadthFirst();
}
}
}
実行方法は
java VacuumProblem [Number]
です。ここで[Number]は0以上7以下の整数です。

表示方法はサンプルと同一のものにしましたが、
ぱっと見てわかりやすいものに変更しても面白いでしょう。
たとえば
|掃|―|
|―|埃|
みたいな感じで。
ありがとうございます。大変助かりました。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング