宝箱(5)

上をPerlで実装すると次のよう。


my @E;
my @items = ( 273, 161, 266, 98, 140, 84 );

$E[511] = 0;
for my $s(map { $_->[0] }
sort { $b->[1] <=> $a->[1] }
map { [ $_, GetNumOfItems($_) ] }
0..510) { #逆順にE(s)を計算
my $nTransit = 0;
my $sum_E;
for my $item(@items) {
my $next_s = $s | $item;
if($next_s != $s) { #移行可能
#最適な箱を選ぶ
my $min_E = 1e8;
for my $i(0..2) {
$next_s = $s | ($item & 7 << 3 * $i);
if($next_s != $s) { #移行可能
if($E[$next_s] < $min_E) {
$min_E = $E[$next_s];
}
}
}
$sum_E += $min_E;
$nTransit++;
}
}
$E[$s] = 6 / $nTransit + $sum_E / $nTransit;
print "E(", Dec2Bin($s), ") = ", $E[$s], "\n";
}

(以下略)


実行してみると、

E(000 000 000) = 12.1540833333333

か。
単純なアルゴリズムより0.07回だけ短くなるのね。


この項、続く。