算基因
先來個問題
旅行者問題
有一個人,要從\(1\)出發去 \( n \) 個國家旅遊,對於從國家 \(i\)到\(j\),旅行所需要的成本為 \(C_{ij}\) ,求可以最小化成本的旅行順序
怎麼做?
# CHAPTER 2
\(n\)點排列,複雜度 \(O(n!)\)
顯然不行
那 DP ?
# PRESENTING CODE
對於在城市\(x\),\(TSP[S][x] = min( TSP[S-x][i]+dis(x,i))\)
令\(S\)為已造訪過的城市(用位元表示)
int TSP(int statis, int x){
if(dp[statis][x] != -1)return dp[statis][x];
int mask = 1 << x;
dp[status][x] = 1e9;
for ( int i = 0; i < n; ++i )
if ( i != x && ( status & ( 1 << i ) ) ) // i 在status裏面
dp[ status ][ x ] = min( dp[ status ][ x ],
TSP( status - mask, i ) + graph[ i ][ x ] );
return dp[ status ][ x ];
}
# CHAPTER 2
這樣好嗎?
基本上很麻煩又慢,複雜度仍是指數
事實上,這是一個 NP Hard Question
空間複雜度:\(O(2^n \times n)\)
比賽中可以用,但現實中沒啥作用
時間複雜度:\(O(2^n)\)我不會算
精確解不可能解得出來,所以我們需要一些特別的方法
把解比擬成染色體
什麼意思?
假設今天有十個解
4, 1, 5, 3, 2, 7, 8, 6, 0, 9
4, 2, 6, 7, 8, 9, 3, 5, 1, 0
1, 3, 5, 4, 2, 7, 9, 6, 8, 0
基因
染色體
族群
# PRESENTING CODE
# PRESENTING CODE
增加遺傳變異性
# PRESENTING CODE
然後?
適者生存
一直重複,就會有近似最佳解
DEAP
我不會
工作排程問題
時刻表排點
其他用途
我講得好爛