我正在尝试在我的主要方法中构建一个选择器:
fun main() {
val gen = TestGenerator()
val testSet = listOf(
TestSpec("Test-1", SCENARIO, when (ALGORITHM) {
AlgorithmType.MAXPLUS -> MaxPlusSpec(MIN_REWARD, MAX_REWARD, MAX_ITER, THRESHOLD, COMPUTATION_TYPE)
AlgorithmType.MCTS -> MCTSSpec(MIN_REWARD, MAX_REWARD, MAX_ITER, C_VALUE, COMPUTATION_TYPE)
})
)
gen.runLinearTestSet(testSet)
}
因此,当通过集中式或分散式计算选择 maxplus 或 mcts 时,我们希望根据它传递正确的参数。
我尝试这样解决:
@Serializable
data class MaxPlusSpec(
val minReward: Float,
val maxReward: Float,
val maxIterationNumber: Int,
val convergenceThreshold: Float,
computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MAXPLUS, computationType)
@Serializable
data class MCTSSpec(
val minReward: Float,
val maxReward: Float,
val maxIterationNumber: Int,
val cValue: Float,
computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MCTS, computationType)
这会引发错误:
'computationType'隐藏超类型'AlgorithmSpec'的成员并且需要'override'修饰符
可序列化类在类本身或其超类型中具有重复的属性“computationType”序列名称
所以我尝试像这样实现它:
@Serializable
data class MaxPlusSpec(
val minReward: Float,
val maxReward: Float,
val maxIterationNumber: Int,
val convergenceThreshold: Float,
computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MAXPLUS, computationType)
@Serializable
data class MCTSSpec(
val minReward: Float,
val maxReward: Float,
val maxIterationNumber: Int,
val cValue: Float,
computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MCTS, computationType)
这当然不起作用,因为我们无法在数据类中没有 var/val 关键字的情况下分配计算类型。
我不知道如何进行这项工作。任何帮助将不胜感激。
编辑:
目前采用此解决方法,这不是最佳方案,但目前确实有效:
@Serializable
abstract class AlgorithmSpec(
val algorithmType: AlgorithmType
) {
abstract val computationType: ComputationType
}
@Serializable
data class MaxPlusSpec(
val minReward: Float,
val maxReward: Float,
val maxIterationNumber: Int,
val convergenceThreshold: Float,
override val computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MAXPLUS)
@Serializable
data class MCTSSpec(
val minReward: Float,
val maxReward: Float,
val maxIterationNumber: Int,
val cValue: Float,
override val computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MCTS)
解决如下:
@Serializable
sealed class AlgorithmSpec(
val algorithmType: AlgorithmType
) {
abstract val computationType: ComputationType
}
@Serializable
data class MaxPlusSpec(
val minReward: Float,
val maxReward: Float,
val maxIterationNumber: Int,
val convergenceThreshold: Float,
override val computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MAXPLUS)
@Serializable
data class MCTSSpec(
val minReward: Float,
val maxReward: Float,
val maxIterationNumber: Int,
val cValue: Float,
override val computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MCTS)