資源簡介
人工智能實驗,重寫AO*算法解決數字重排問題
代碼片段和文件信息
#include
#include
using?namespace?std;
struct?NODE{
public:
int?q;????????????????????//該結點耗散值,可被更新h(n)=nh(1)=0
int?value;????????????????//該結點的值,或者稱為序號
void?set(int?k){
q=k;
value=k;
if?(value==1)?q=0;
}
};
bool?in(stack?temp_stackNODE?node){???????????//查找一個結點類型的node是否在指定的堆棧里
stack?put_back;
bool?T=false;
while(!temp_stack.empty()){
NODE?temp=temp_stack.top();
if?(temp.value==node.value){
T=true;
break;
}
temp_stack.pop();
put_back.push(temp);
}
while(!put_back.empty()){
NODE?temp=put_back.top();
put_back.pop();
temp_stack.push(temp);
}
return?T;
}
NODE?next(stack?temp_stack){????????????????????????//返回堆棧中第二個元素
NODE?null;
null.set(1);
if(temp_stack.size()==1)?return?null;
NODE?firstlast;
first=temp_stack.top();
temp_stack.pop();
last=temp_stack.top();
temp_stack.push(first);
return?last;
}
int?main(){
NODE?node[7];
stack?solved;???????????//起始為空,存放已解決可解終結點
stack?expand;???????????//起始為空,存放已被擴展的結點
stack?s[7][2];??????????//為每種變化規則賦值一個堆棧保存
for(int?i=6;i>0;i--){
node[i].set(i);
}
solved.push(node[1]);?????????????????????????????????//node[1]作為終結點直接添加入已解結點堆棧中
expand.push(node[6]);?????????????????????????????????//node[6]作為已擴展點直接添加入已擴展結點堆棧中
s[6][0].push(node[2]);?s[6][0].push(node[4]);?????????//為每一種分解情況如6=4+2設置一個堆棧
s[6][1].push(node[3]);?//s[6][1].push(node[3]);
s[4][0].push(node[1]);?s[4][0].push(node[3]);
s[4][1].push(node[2]);?//s[4][1].push(node[2]);
s[3][0].push(node[1]);?s[3][0].push(node[2]);
s[2][0].push(node[1]);?//s[2][0].push(node[1]);
int?sub=6;????????????????????//從6(根結點)開始
bool?T=false;
while(1){
if?(in(solvednode[6])){??????????????????????????//該問題已被解決,輸出最終耗散值
//succeed;
cout< //重寫的新輸出,很長,如下
stack?output;
output.push(node[6]);
while(!output.empty()){
NODE?temp=output.top();
output.pop();
if?(temp.value!=1){
cout< int?k=0;
sub=temp.value;
- 上一篇:移動機器人基本運動控制的源代碼
- 下一篇:使用QT編寫 網絡電話
評論
共有 條評論