【問題描述】
馬的遍歷問題。在8
×8方格的棋盤上,從任意指定方格出發,為馬尋找一條走遍棋盤每一格並且只經過一次的一條路徑。
傳統演算法:
首先這是乙個搜尋問題,運用深度優先搜尋進行求解。演算法如下: 1、
輸入初始位置座標
x,y; 2、
步驟c: 如果
c> 64
輸出乙個解,返回上一步驟
c--
(x,y) ← c 計算
(x,y)
的八個方位的子結點,選出那此可行的子結點
迴圈遍歷所有可行子結點,步驟
c++重複2
顯然(2)是乙個遞迴呼叫的過程,大致如下:
void dfs(int x,int y,int count)
for(i=0;i <8;++i)
} 這樣做是完全可行的,它輸入的是全部解,但是馬遍歷當8
×8時解是非常之多的,用天文數字形容也不為過,這樣一來求解的過程就非常慢,並且出乙個解也非常慢。
怎麼才能快速地得到部分解呢?
所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。
貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。
貪心演算法的基本思路如下: 1.
建立數學模型來描述問題。 2.
把求解的問題分成若干個子問題。 3.
對每一子問題求解,得到子問題的區域性最優解。 4.
把子問題的解區域性最優解合成原來解問題的乙個解。
實現該演算法的過程:
從問題的某一初始解出發;
while
能朝給定總目標前進一步do
求出可行解的乙個解元素;
由所有解元素組合成問題的乙個可行解。
下面是乙個可以試用貪心演算法解的題目,貪心解的確不錯,可惜不是最優解。
其實馬踏棋盤的問題很早就有人提出,且早在
1823
年,j.c.warnsdorff
就提出了乙個有名的演算法。在每個結點對其子結點進行選取時,優先選擇『出口
』最小的進行搜尋,『出口
』的意思是在這些子結點中它們的可行子結點的個數,也就是『孫子
』結點越少的越優先跳,為什麼要這樣選取,這是一種區域性調整最優的做法,如果優先選擇出口多的子結點,那出口少的子結點就會越來越多,很可能出現『死
』結點(顧名思義就是沒有出口又沒有跳過的結點),這樣對下面的搜尋純粹是徒勞,這樣會浪費很多無用的時間,反過來如果每次都優先選擇出口少的結點跳,那出口少的結點就會越來越少,這樣跳成功的機會就更大一些。這種演算法稱為為貪心演算法,也叫貪婪演算法或啟發示演算法,它對整個求解過程的區域性做最優調整,它只適用於求較優解或者部分解,而不能求最優解。這樣的調整方法叫貪心策略,至於什麼問題需要什麼樣的貪心策略是不確定的,具體問題具體分析。實驗可以證明馬遍歷問題在運用到了上面的貪心策略之後求解速率有非常明顯的提高,如果只要求出乙個解甚至不用回溯就可以完成,因為在這個演算法提出的時候世界上還沒有計算機,這種方法完全可以用手工求出解來,其效率可想而知。
個人**(僅供參考):
#if !defined(afx_horse_h__7543db1e_0fd1_438c_a261_5b8791e184f3__included_)
#define afx_horse_h__7543db1e_0fd1_438c_a261_5b8791e184f3__included_
#if _msc_ver > 1000
#pragma once
#endif // _msc_ver > 1000
class horse
;#endif // !defined(afx_horse_h__7543db1e_0fd1_438c_a261_5b8791e184f3__included_)
// horse.cpp: implementation of the horse class.
////
#include
#include
#include
#include "horse.h"
using namespace std;
//// construction/destruction
//horse::horse()
}void horse::calcu()
,,,,,,,,};
printf("
請輸入起始座標:
x,y\n");
scanf("%d,%d",&m,&n);
if(m>=1&&m<=8&&n>=1&&n<=8)
} }
m=i;n=j; } }
else
printf("
輸入錯誤!
");n=0;
struct information
array[64];
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
information temp[64];
for(i=0;i<63;i++)
}for(i=0;i<64;i++)
for(i=1;i<=8;i++)
}void horse::initarray()
,,,,,
,,,};
int i,j,k,x,y;
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
dushu[i][j]=0;
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
for(k=1;k<=8;k++)
}#include"horse.h"
#include
#include
using namespace std;
int main()
貪心演算法例項
貪心演算法 又稱貪婪演算法 是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當...
貪心演算法例項
有一批貨櫃要裝上一艘載重量為c的輪船。其中貨櫃i的重量為w。最優裝題要求確定在裝載體積不受限制的情況下,將盡可能多的貨櫃裝上輪船。該問題可形式化描述為 其中,變數xi 0表示不裝入貨櫃i,xi 1表示裝入貨櫃i。演算法描述 最優裝載問題可用貪心演算法求解,採用重量最輕者先裝的貪心選擇策略,可產生最優...
經典貪心演算法 貪心演算法概述
貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...