亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 編制迷宮程序(用a算法來實現).txt

?? 通過編制迷宮程序來熟練掌握A*算法。充分理解A*算法和啟發函數的關系
?? TXT
字號:
 人工智能作業



一、    程序目的:
通過編制迷宮程序來熟練掌握A*算法。充分理解A*算法和啟發函數的關系。

二、A*算法梗概:
1.    OPEN:=(S),F(S):=G(S)+H(S);
2.    LOOP : IF OPEN-() THEN EXIT (FALL);
3.    N:=FIRST (OPEN);
4.    IF GOAL(N) THEN EXIT (SUCCESS);
5.    REMOVE (N,OPEN), ADD (N,CLOSED);
6.    EXPAND (N){Mi}, 計算F(N,Mi)=G(N,Mi)+H(Mj); G(N,M)是通過n到Mi的好散值的估計。ADD (Mj,OPEN),標記Mj到n的指針。IF  F(N,Mk)〈F(Mk) THEN  F(Mk):=F(N,Mk),標記Mk到n的指針;比較F(N,Mk)和F(Mk),F(Mk)是擴展前計算的耗散值。IF F(N,Ml)〈F(Ml) THEN F(Ml):=F(N,Ml),標記Ml到n的指針ADD (Ml,OPEN); 把Ml重新放回OPEN中,不必考慮修改到其中結點的指針。
7.    OPEN 中的結點按F值從大到小排序;
8.    GO LOOP;
調用函數說明:
1、
void AddClosed(struct Gather  *des)
des為struct Gather *類型的結點;
該函數的功能是將des結點加到CLOSED集合中,無返回值。
2、
void PartInit_Point(void)
無行參,無返回值。
該函數的功能是初始化Point P[]中的部分成員。
3、
void AddOpen(struct Point des)
行參為struct Point 類型,可以直接將P[i]作行參。
該函數的功能是將點des加到OPEN集合中。
4、
bool Goal(struct Gather *n)
行參為struct Gather *類型, 返回值為bool型。
該函數的功能是判斷n是不是目標結點。是返回TRUE, 否返回FALSE;
5、
bool IsOpenEmpty(void)
返回值為bool型。OPEN集合為空,返回TRUE, 否則返回FALSE;
6、
void Remove(struct Gather *des)
des為struct Gather *類型的結點;
該函數的功能是將des從OPEN集合中刪除。
7、
struct Gather *First(void)
返回struct Gather *類型的結點;
該函數的功能是取OPEN集合中存儲的第一個有效結點。創建OPEN集合時,頭結點未存有效結點。
8、
int InOPENorCLOSED(struct Point R)
返回值為int型,行參為struct Point類型。用法InOPENorCLOSED(P[i])
該函數的功能是判斷點R在OPEN集合,或者CLOSED集合,或者都不在
在OPEN中,返回0
在CLOSED中,返回1
俱不在,返回2
9、
void Expand(struct Gather *curr)
無返回值,行參為struct Point類型
該函數的功能是擴展當前結點curr。
10、
void DrawMap(void)
畫個草圖。

三、源程序:
// C++編寫, Visual Studio 6.0調試成功
#include <iostream>
using namespace std;
const int PointNum = 16; //迷宮點的總數
const int SideNum  = 18; //迷宮邊的總數

struct Point
{
    int    x;        //橫坐標
    int    y;        //縱坐標
    int    F;        //評價函數值
    int    H;        //當前點到目標點的橫截距與縱截距之和
    int    D;        //深度
    int    index;    //點的編號
    int    pre;        //保存路徑,作標志指針之用
};

struct Index
{
    int    from;        //邊的起點
    int    to;            //邊的終點   注:由于是無向圖,from,to既是起點又是終點。
};

struct Gather
{
    struct Point     pnode;
    struct Gather    *next;
};

//存儲點的信息 共PointNum個點
struct Point P[PointNum] = {
    {1,1,0,0,0,0, -1}, {1,2,0,0,0,1 ,-2}, {1,3,0,0,0,2 ,-2}, {1,4,0,0,0,3 ,-2},
    {2,1,0,0,0,4 ,-2}, {2,2,0,0,0,5 ,-2}, {2,3,0,0,0,6 ,-2}, {2,4,0,0,0,7 ,-2}, 
    {3,1,0,0,0,8 ,-2}, {3,2,0,0,0,9 ,-2}, {3,3,0,0,0,10,-2}, {3,4,0,0,0,11,-2}, 
    {4,1,0,0,0,12,-2}, {4,2,0,0,0,13,-2}, {4,3,0,0,0,14,-2}, {4,4,0,0,0,15,-2}
};

//存儲邊的信息 共SideNum個邊
struct Index In[SideNum] = {
    {0, 1 }, {1, 2 }, {2, 6 }, {3, 7 }, {4 , 5 }, {4 , 8}, {5 , 6}, {5 ,9 },
    {6, 7 }, {7, 11}, {8, 9 }, {8, 12}, {9 , 10}, {10,11}, {10,14}, {12,13},
    {13,14}, {14,15}
};

//OPEN, CLOSED集合中頭結點不存數據,且設OPEN, CLOSED為指針類型的常量
//確保OPEN, CLOSED兩全局指針不被意外修改。
struct    Gather *const OPEN   = new struct Gather;
struct    Gather *const CLOSED = new struct Gather;

//將結點加到CLOSED集合中
void    AddClosed(struct Gather *des)
{    
    des->next = CLOSED->next;
    CLOSED->next = des;
}

//部分初始化    
void    PartInit_Point(void)
{
    for (int i=0; i<PointNum; i++){
        P[i].H = (4 - P[i].x) + (4 - P[i].y);
    }
    P[0].D = 0;
    P[0].F = P[0].H + P[0].D;
    OPEN->next = NULL;
    CLOSED->next = NULL;
}

//將點加到OPEN集合中,插入,確保OPEN集合中的點是按照F值由小到大排序的
void    AddOpen(struct Point des)
{
    struct Gather    *q = OPEN, 
                *r = NULL, 
                *temp = new struct Gather;
    temp->pnode = des;

    while ((q->next != NULL) && (q->next->pnode.F < des.F)){
        q = q->next;
    }
    r = q->next;        
    temp->next = r;
    q->next = temp;    
}

/////////////////////////////////////////////////////////////////////////
//判斷是否到達終點, 到達則返回 True
bool    Goal(struct Gather *n) 
{
    if (n->pnode.index == 15) //該迷宮(課本)的目標結點編號是15[自定義]
        return true;
    else
        return false;
}


//判斷Open集合是不是為空, 空則返回 True
bool    IsOpenEmpty(void)
{
    if (OPEN->next == NULL) 
        return true;
    else
        return false;
}

//將des結點從OPEN集合中刪除
void    Remove(struct Gather *des)
{
    struct  Gather *p = OPEN, *q = NULL;
    while ((p->next!=NULL) && (p->next->pnode.index!=des->pnode.index)){
        p = p->next;
    }
    if (p->next == NULL) 
        cout << "Error occurs when delete node from Open!" << endl;
    else
    {
        q = p->next;
        p->next = q->next;
    }
}

//取OPEN集合中存的第一個結點 [ 注意:OPEN頭結點未存數據 ]
struct Gather  *First(void)
{
    return    OPEN->next;
}

//判斷點R在OPEN,CLOSED集合中,還是都不在
int    InOPENorCLOSED(struct Point R)
{
    for (struct Gather *p = OPEN; p->next!=NULL; p = p->next){
            if (p->next->pnode.index == R.index) return 0;//在OPEN中                    
        }
    for (p = CLOSED; p->next!=NULL ;p = p->next){
            if (p->next->pnode.index == R.index) return 1;//在CLOSED中                    
        }
    return  2; //都不在
}

//擴展結點遇到的三種情況處理
void  Process(struct Point *A, struct Gather *curr)
{
    (*A).D++;
    (*A).F = (*A).D + (*A).H;
    if (InOPENorCLOSED(*A) == 2)  //如果A不在OPEN,CLOSED集合中
    { 
        AddOpen(*A);  //將A加到OPEN集合中                    
        (*A).pre = curr->pnode.index;  //標志指針(游標)                                  
    }
    if (InOPENorCLOSED(*A) == 0)  //如果A在OPEN集合中
    {
        struct    Gather *r = OPEN;
        while ((r->next != NULL) && (r->next->pnode.index != (*A).index))
        {
            r = r->next;
        }
        if ((*A).F < r->next->pnode.F)
        {
            r->next->pnode.F = (*A).F;  //修改OPEN集合中結點A的F值
            (*A).pre = curr->pnode.index;  //標志指針(游標)    
        }
    }
    if (InOPENorCLOSED(*A) == 1)  //如果A在CLOSED集合中
    {
        struct    Gather *r = CLOSED;
        while ((r->next != NULL) && (r->next->pnode.index != (*A).index))
        {
            r = r->next;
        }
        if ((*A).F < r->next->pnode.F)
        {
            (*A).pre = curr->pnode.index;  //標志指針(游標)    
            AddOpen(*A);  //將A重新放到OPEN集合中
        }
    }            
}

//擴展當前結點curr
void    Expand(struct Gather *curr)
{
    for (int i=0; i<SideNum; i++)
    {
        if (In[i].from == curr->pnode.index)
        {
            int    t = In[i].to;            
            Process(&P[t], curr);            
        }
        //由于是無向圖,可以由點from擴展到點to; 同樣可以由點to擴展到點from
        if (In[i].to == curr->pnode.index)
        {
            int    t = In[i].from;
            Process(&P[t], curr);        
        }
    }//end for
}

//畫課本上的迷宮圖
void    DrawMap(void)
{
    cout    << "The labyrinth is : " << endl << endl;
    cout    << "     _______________@" << endl
            << "          |    |    |" << endl
            << "     _____|    |____|" << endl
            << "     |    |    |    |" << endl
            << "     |    |____|    |" << endl
            << "     |    |    |    |" << endl
            << "    .|    |____|____|" << endl
            << endl;
}

void main()
{
    DrawMap();
    PartInit_Point();    
    struct Gather  *n = new struct Gather;    
    AddOpen(P[0]);    
LOOP:
    if (IsOpenEmpty()){
        cout << "Fail for Open is Null!" << endl;
        exit(0);
    }
    n = First();    
    if (Goal(n)){
        cout << "Succeed! The shortest route is: " <<endl<<endl;        
        int  i = n->pnode.index;
        do  {
            cout << "(" << P[i].x << "," << P[i].y << ")" << "   ";
            i = P[i].pre;
        }while (P[i].pre != -1);
        cout << "(" << P[i].x << ", " << P[i].y << ")" << endl;
        exit(1);
    }    
    Remove(n);
    AddClosed(n);
    Expand(n);
    goto    LOOP;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品99一区二区| 三级不卡在线观看| 日本一区免费视频| www久久精品| 久久综合九色综合久久久精品综合| 欧美日韩国产一级片| 555夜色666亚洲国产免| 欧美久久久久久久久中文字幕| 欧美日韩亚洲综合一区| 欧美日韩一区视频| 欧美三级日韩三级| 欧美日韩aaaaa| 91精品国产91久久久久久一区二区| 欧美日韩国产一级片| 欧美一区欧美二区| 精品奇米国产一区二区三区| 精品av综合导航| 国产欧美视频一区二区| 中文字幕免费不卡在线| 亚洲人成精品久久久久| 午夜欧美在线一二页| 亚洲v日本v欧美v久久精品| 亚洲成av人片一区二区三区| 亚洲123区在线观看| 美女高潮久久久| 国产精品一区免费在线观看| 成人久久视频在线观看| 欧美性猛交一区二区三区精品| 欧美精品久久一区| 欧美tk—视频vk| 国产日韩精品久久久| 亚洲欧美一区二区在线观看| 亚洲一区二区三区四区在线免费观看| 亚洲成人资源在线| 国产专区欧美精品| 99国产精品视频免费观看| 欧美三级资源在线| 2021久久国产精品不只是精品 | 青青国产91久久久久久| 久久草av在线| 成人免费视频播放| 欧美亚洲国产bt| 日韩欧美黄色影院| 国产精品国产自产拍高清av王其| 尤物视频一区二区| 久久成人免费日本黄色| 不卡视频一二三四| 欧美日韩国产免费| 国产日韩欧美精品电影三级在线| 亚洲韩国精品一区| 国产一区二区三区不卡在线观看| 91在线视频网址| 日韩欧美国产系列| 亚洲色图视频网站| 美国十次了思思久久精品导航| 99综合电影在线视频| 欧美一区二区三区视频| 国产精品成人免费| 久久精品二区亚洲w码| 在线视频你懂得一区| 欧美一区二区精品久久911| 国产精品久久久久国产精品日日| 日韩成人一级大片| 91网站黄www| 久久久五月婷婷| 午夜精品久久久久影视| 东方欧美亚洲色图在线| 欧洲精品一区二区| 欧美国产精品一区二区| 日韩成人一区二区三区在线观看| 99久久国产免费看| 久久久久久久久久久久久夜| 日韩黄色免费电影| 91在线视频在线| 久久女同精品一区二区| 午夜不卡av在线| 色哟哟欧美精品| 国产精品日日摸夜夜摸av| 久久精品国产免费| 欧美精品欧美精品系列| 亚洲精品成人天堂一二三| 国产宾馆实践打屁股91| 欧美www视频| 青青草一区二区三区| 欧美日韩色一区| 亚洲免费av高清| 成人永久看片免费视频天堂| 欧美不卡一二三| 奇米精品一区二区三区四区| 欧美综合天天夜夜久久| 中文字幕一区免费在线观看| 国产成人午夜高潮毛片| 欧美精品一区二区三区蜜桃视频| 午夜精品久久久久久久久| 欧洲生活片亚洲生活在线观看| 成人欧美一区二区三区| av在线播放不卡| 国产精品美女www爽爽爽| 国产乱码精品一区二区三区五月婷| 宅男噜噜噜66一区二区66| 亚洲高清不卡在线观看| 欧美日韩中字一区| 亚洲一二三区在线观看| 欧美伊人久久久久久久久影院| 亚洲精品水蜜桃| 欧日韩精品视频| 亚洲18影院在线观看| 欧美精三区欧美精三区| 无吗不卡中文字幕| 欧美一区二区三区在线视频| 日本欧美大码aⅴ在线播放| 日韩精品在线网站| 国内精品第一页| 国产欧美日韩不卡免费| 丁香一区二区三区| 亚洲日本va午夜在线电影| 91麻豆免费看| 亚洲一区二区三区四区在线观看| 欧美日韩视频一区二区| 秋霞av亚洲一区二区三| 久久久久久麻豆| www.成人在线| 亚洲免费观看高清完整版在线| 欧美性大战久久久久久久| 五月综合激情日本mⅴ| 日韩午夜av一区| 激情综合五月天| www国产亚洲精品久久麻豆| 成人深夜福利app| 亚洲欧美日韩综合aⅴ视频| 欧美日韩极品在线观看一区| 久久成人免费网| 国产精品久久二区二区| 91国产视频在线观看| 人人超碰91尤物精品国产| 久久精品一区四区| 色狠狠综合天天综合综合| 天天av天天翘天天综合网色鬼国产| 日韩欧美在线不卡| 成人精品视频一区二区三区 | 丝袜亚洲另类丝袜在线| 日韩精品一区二区三区蜜臀| 丰满亚洲少妇av| 亚洲国产精品麻豆| 精品播放一区二区| 色婷婷综合久久| 久久成人免费日本黄色| 成人欧美一区二区三区小说| 欧美久久久一区| 成人短视频下载| 亚洲国产精品久久久久秋霞影院| 精品国产人成亚洲区| 91亚洲国产成人精品一区二三| 日韩在线一二三区| 国产精品久久夜| 欧美一级一区二区| 91日韩一区二区三区| 久久99日本精品| 一区二区高清在线| 国产日韩精品一区二区浪潮av| 欧美三级日韩三级国产三级| 高清在线成人网| 日本在线观看不卡视频| 成人欧美一区二区三区在线播放| 日韩精品中文字幕一区| 在线欧美日韩精品| 国产精品夜夜嗨| 日本aⅴ精品一区二区三区| 亚洲色欲色欲www| 精品国产乱码久久久久久影片| 欧美性极品少妇| 成人h精品动漫一区二区三区| 天堂在线亚洲视频| 国产精品乱码妇女bbbb| 日韩免费看的电影| 欧美撒尿777hd撒尿| 色综合久久66| 懂色av噜噜一区二区三区av| 捆绑调教一区二区三区| 亚洲第一福利视频在线| 中文字幕在线不卡国产视频| 欧美成人伊人久久综合网| 色噜噜狠狠色综合中国| 成人黄色片在线观看| 精品一区二区三区在线播放视频| 丝袜亚洲另类欧美| 曰韩精品一区二区| 国产精品久久久久精k8| 国产日韩成人精品| 精品久久久网站| 欧美一级免费观看| 精品视频1区2区| 欧美午夜电影网| 日本久久电影网| 99v久久综合狠狠综合久久| 成人午夜伦理影院| 国产麻豆9l精品三级站| 精品一区二区三区在线播放| 蜜桃视频免费观看一区| 日日摸夜夜添夜夜添亚洲女人|