雖然這是一個作業系統的用來避免死結的演算法,其實完全可以把它當做一道ACM題來做。尋找安全序列上面我使用了回溯演算法,條例還算清晰,發上來和大家共用同時備忘。
#include<iostream>
using namespace std;
#include<fstream>
#include<cstdlib>
int available[3] = {3,3,2}; //available矩陣
int allocation[5][3] = {0}; //allocation矩陣
int maxN[5][3] = {0}; //max矩陣
int need[5][3] = {0}; //need矩陣
int p[5] = {0};
int request[5] = {0}; //request序列
bool record[5] = {0}; //record用於記錄找過的進程
bool judge( int ); //判斷目前狀態是否死結的函數
這裡只列出判斷函數judge(int v)的定義,main函數就不寫了,該咋寫咋寫吧。
bool judge( int v ) //判斷是否會產生死結的函數,用回溯演算法
{
if( v >= 5 ) //參數v表示當前正在找第v個合格進程,
return true; //能找完,表明存在安全序列 ,返回真
for( int k = 0;k < 5;k++ )
{
if( !record[k] && need[k][0] <= available[0] && need[k][1] <= available[1] && need[k][2] <= available[2] )
{
cout<<"Select Process "<<k<<endl;//找到一個符合當前條件的進程
record[k] = true; //假定是真確的,往下執行
for( int j = 0;j < 3;j++ )
available[j] += allocation[k][j];
cout<<"avilable:";
for( int l = 0;l < 3;l++ )
cout<<available[l]<<" ";
cout<<endl;
if( judge( v+1 ) ) //判斷執行這一步後結果是否為真
{
p[v] = k; //是的話,記錄路徑
return true;
}
else
{
cout<<"This selection is wrong, back.\n";
record[k] = false; //若不是,還原作業,往下尋找
for( int i = 0;i < 3;i++ )
available[i] -= allocation[k][i];
}
}
}
return false; //沒有合格進程,則返回假沒有安全序列
}