在 R 中将二进制解码为十进制



它来自这篇文章,第202页:

https://journal.r-project.org/archive/2017/RJ-2017-008/RJ-2017-008.pdf,它在遗传算法包中

library(GA)
decode <- function(string, bitOrders)
{
string <- split(string,  rep.int(seq.int(bitOrders), times = bitOrders))
orders <- sapply(string, function(x) { binary2decimal(gray2binary(x)) })
return(unname(orders))
}

我不明白为什么第一行给出(3,1,1)而第二行给出(2,1,1),不应该反过来吗?

decode(c(0,1,0, 0,1, 0,0,1), bitOrders =   c(3,2,3))
[1] 3 1 1

decode(c(0,1,1, 0,1, 0,0,1), bitOrders =   c(3,2,3))
[1] 2 1 1

此函数不会将二进制转换为十进制,而是将灰色编码的二进制转换为十进制。

请注意,decode() 函数假设输入二进制字符串使用格雷编码表示,这可确保连续值具有相同的汉明距离(汉明,1950)。

如果我们看一下代码,向量是分裂的,然后通过gray2binary(),然后binary2decimal().我以前没有听说过它,但它是二进制编码的不同版本,其中将数字增加 1 只涉及更改单个数字。那么,什么是灰色编码?来自 ?gray2binary 帮助:

灰色编码允许获得不受众所周知的汉明悬崖问题影响的二进制字符串。使用格雷编码时,任何两个连续值之间的位差数为一,而在二进制字符串中,这并不总是正确的。

# Consider a five-bit encoding of values 15 and 16  using the standard 
# binary coding
decimal2binary(15, 5)
[1] 0 1 1 1 1
decimal2binary(16, 5)
[1] 1 0 0 0 0
# Moving from 15 to 16 (or vice versa) all five bits need to be changed,
# but using Gray encoding the two binary strings differ by one bit.
binary2gray(decimal2binary(15, 5))
[1] 0 1 0 0 0
binary2gray(decimal2binary(16, 5))
[1] 1 1 0 0 0

我们可以使用一个简单的循环来查看二进制编码与灰色编码中的 1:10 外观

# Grey encoding
sapply(1:10, function(x) paste(binary2gray(decimal2binary(x)), collapse = ''))
[1] "1"    "11"   "10"   "110"  "111"  "101"  "100"  "1100" "1101" "1111"
# Binary
sapply(1:10, function(x) paste(decimal2binary(x), collapse = ''))
[1] "1"    "10"   "11"   "100"  "101"  "110"  "111"  "1000" "1001" "1010"