チェックインアルゴリズムトピック:Ques20201024

質問1

説明

あなたの目標は、ロボットを迷路から抜け出すことです。ロボットは北向きで、開始位置は迷路の真ん中にあります。ロボットを東、南、西、北に向けることができます。ロボットを一定の距離だけ前方に歩くようにすると、壁にぶつかる前に停止します。

a。質問を形式化してください、州のスペースはどれくらいの大きさですか?

形式化は次のとおりです。

状態:状態はロボットの位置と向きによって決まります。次の位置の方向が4つしかない場合、状態の数は4になります。次回も4つの方向から選択できます。方向を選んで前進する動作は連続しています。

最初の知人のステータス:ロボットは北を向いています。

トランスファーモデル:壁にぶつかる場合を除いて、どの方向を向いても前方に歩くことができます。

ターゲットテスト:現在の位置が迷路の外にあるかどうかをテストします。

パス消費量:総散逸値は、ロボットが移動する距離です。

移動中のロボットの位置や向きに制限はなく、ロボットの動きは離散的ではないため、状態は指数関数的に増加する可能性があり、状態空間は無限大です。

b。迷路の中を歩き、2つ以上の道路の交差点で曲がり、この質問を再形式化します。現在の州のスペースはどのくらいですか?

状態:状態はロボットの位置によって決まります。位置が交差点の場合、次の状態になります。状態は交差点の位置と番号を記録する必要があります。

最初の知人の状態:ロボットは迷路の真ん中で北を向いています。

転送モデル:壁にぶつかる場合を除いて、次の交差点に移動します。

ターゲットテスト:現在の位置が迷路の外にあるかどうかをテストします。

パス消費量:総散逸値は移動距離です。

ロボットが動いているとき、状態空間は交差点の数の影響を受けます(他の時間は向きを変えないでください)。交差点が1の場合、可能な状態は4、2の場合、可能な状態は8、交差点がnの場合、状態はスペースは4nです。

c。迷路の任意の場所から開始して、方向転換できるまで4つの方向のいずれかに移動できます。これを行うだけで、問題を再定式化できます。ロボットの方向を記録するだけで済みますか? ?

状態:状態はロボットの位置と向きによって決まります。位置が交差点にある場合、次の位置を選択するための4つの方向があり、次の状態に切り替えることもできます。状態は交差点の位置を記録する必要があります。そしてその数。

最初の知人の状態:ロボットは迷路の真ん中で北を向いています。

トランスファーモデル:壁にぶつかる場合を除いて、どの方向を向いても前方に歩くことができます。

ターゲットテスト:現在の位置が迷路の外にあるかどうかをテストします。

パス消費量:総散逸値は移動距離です。

方向情報に関係なく交差点に新しい状態があるため、方向情報を記録する必要はなく、交差点の位置のみを記録する必要があります。

d。問題の最初の説明では、現実の世界を抽象化し、ロボットの動作を制限し、詳細を削除し、3つの簡略化をリストしました。

簡略化1:ロボットの移動速度

簡略化2:ロボットはどのように駆動力として機能しますか

簡略化3:ロボットセンサータイプ、カメラまたは赤外線レンジング

質問2

宣教師と野蛮人の問題3人の宣教師と3人の野蛮人が川の片岸にいます。1人か2人を運ぶことができるボートがあります。みんなが川の向こう側に渡るようにして、どこにも宣教師以上の野生の人がいないことを要求してください。この質問は、分析の観点から質問の形式化を議論する最初の論文トピックであるため、AIで有名です。

a。問題を確実に解決するために必要な特性のみを記述して、問題を詳細に形式化してください。完全な状態空間図を描きます。

問題解決リファレンス:https//www.jianshu.com/p/0af3a6bb1e43

いくつかの前提:左岸から右岸への往復があり、その間で宣教師と野生の男性が航海することができ、状態は変換プロセス中に循環できません。つまり、それを破棄すると前のステップの状態に戻ります。質問は次のように形式化されます。

ステータス:トリプル(m、c、b)を使用して、川岸のステータスを表します。ここで、mとcは、特定の岸の司祭と野蛮人の数を表し、bは、船が左岸から他の岸にあるか、戻ってくるかを示すために使用されます( b = 1は船がこの海岸にあることを意味し、b = 0は船がないことを意味します)。制約は次のとおりです。海峡の両側に搭載

≤2。これは、搭乗している宣教師と野生の男性の数です。

知人の初期状態トライアド初期状態は(3,3,1)です。つまり、左岸の野蛮人と宣教師の両方が3です。

転送モデル:ボートは左岸から右岸へ、bは0-> 1から、次に1-> 0から運転します。制限条件が満たされない限り、次の状態になります。

ターゲットテスト:最終状態(0,0,0)に到達するかどうか。

パス消費量:たどったパスの長さ。

状態空間図:

b。適切な検索アルゴリズムを適用して、問題の最適な解決策を見つけます。この問題の重複ステータスを確認することをお勧めしますか?

 深度優先検索アルゴリズムを使用して問題を解決します。コードは次のとおりです。

#include<iostream>
#include<cstdio>
#include<map>
#include<string>
#include<set>
#include<vector>
using namespace std;
using namespace std;
int N;
set<string>ans;
void print(vector<int>way) {
    int i = 0;
    string h;
    for (i = 1; i < way.size(); i++) {
       
        if (way[i] < 100) {
            h += "0";
        }
        h += to_string(way[i]);
        h += " ";
    }
    ans.insert(h);
}
void dfs(int pre, int ni, int nj, int b, set<int>s, vector<int>way) {

    int now = ni * 100 + nj * 10 + b;// 
    s.insert(pre);
    if (s.count(now) || (N - ni) < 0 || (N - nj) < 0 || ni < 0 || nj < 0 || (ni < nj && ni != 0) || ((N - ni) < (N - nj) && (N - ni) != 0)) {
        // 限制条件,若传教士和野人数都小于0,或者剩下的传教士比野人少都直接return
        return;
    }
    if (pre == 0) {
        // 如果上一轮就截止了,pre == 0 代表已到终点状态
        print(way);
        return;
    }
    way.push_back(pre);
    if (b == 1) { // 需前往对岸
      
        // 传教士+野人=1
        dfs(now, ni - 1, nj, 0, s, way);
        dfs(now, ni, nj - 1, 0, s, way);
        // 传教士+野人=2
        dfs(now, ni - 2, nj, 0, s, way);
        dfs(now, ni, nj - 2, 0, s, way);
        dfs(now, ni - 1, nj - 1, 0, s, way);
    }
    else {
     
         // 传教士+野人=1
        dfs(now, ni + 1, nj, 1, s, way);
        dfs(now, ni, nj + 1, 1, s, way);
        // 传教士+野人=2
        dfs(now, ni + 2, nj, 1, s, way);
        dfs(now, ni, nj + 2, 1, s, way);
        dfs(now, ni + 1, nj + 1, 1, s, way);
    }
}
//Ques20201024
int main() {
    int b = 1;
    // 初始化b的值
    int m, c;
    int pre = -1;
    set<int>s;
    chooseN = 3;
    N = c = m = 3;
    vector<int>way;
    dfs(pre, m, c, b, s, way);
    for (auto it = ans.begin(); it != ans.end(); it++) {
        cout << *it << endl;
    }
}

実行結果

上の図のスペースに示すように、ソリューションによって取得される最適なパスは合計4つあります。

c。この問題の状態空間は非常に単純ですが、人々がそれを解決するのを難しくしているのは何だと思いますか?

解決の過程で、2人が移送された後、同じ2人が移送される(または別のフォームを使用してもループする、つまり機能しない)ため、この重複を取り除くことは困難です。どこで解決するか。最良の方法は、メモリ付きの状態を使用することです。以前にこの状態に遭遇したことがある場合は、直接戻って前の状態に戻ってください。 

おすすめ

転載: blog.csdn.net/Toky_min/article/details/109259297