|
Algorithm 1 The R-MOTiFS Algorithm |
| Load dataset and preprocess |
| Initialize SCALAR, BUDGET //Scaling factor & Number of MCTS simulations (hyper parameters)
|
|
function R-MOTiFS (featuresList) |
| create rootNode
|
| maxReward, bestFeatureSubset ← UCTSEARCH (rootNode) |
| if
maxReward is greater than optimalReward
then
|
| optimalReward ← maxReward
|
| optimalFeatureSubset ← bestFeatureSubset
|
| R-MOTiFS (bestFeatureSubset) |
| else |
| return (optimalReward, optimalFeatureSubset) |
|
function UCTSEARCH (rootNode) |
| Initialize maxReward, bestFeatureSubset
|
| while within computational budget do
|
| frontNode ← TREEPOLICY (rootNode) |
| reward, featureSubset ← DEFAULTPOLICY (frontNode.state) |
| BACKUP (frontNode, reward) |
| if
reward is greater than maxReward
then
|
| maxReward ← reward
|
| bestFeatureSubset ← featureSubset
|
| return (maxReward, bestFeatureSubset) |
|
function TREEPOLICY (node) |
| while
node is non-terminal do
|
| if
node not fully expanded then
|
| return EXPAND (node) |
| else |
| node ← BESTCHILD (node, SCALAR) |
| return
node
|
|
function EXPAND (node) |
| choose a
untried actions from A(node.state) |
| add a newChild with f(node.state, a) |
| return
newChild
|
|
function BESTCHILD (,
) |
|
|
|
function DEFAULTPOLICY (state) |
| while
state is non-terminal do
|
| choose a
A(state) uniformly at random |
| state ← f(state, a) |
|
traversestate.path
|
| if
ai is equal to fi+1
then
|
| featureSubset ← INCLUDE (fi+1) |
| reward ← REWARD (featureSubset) |
| return (reward, featureSubset) |
|
function BACKUP (node, reward) |
| while
node is not null do
|
| node.visits ← node.visits + 1 |
| if
reward > node.reward
then
|
| node.reward ← reward
|
| node ← node.parent
|
| return
|