個人的な正誤表 5章

最適化のお話

p.97

リストが
[4,4,4,2,2,6,6,5,5,6,6,0]
となっていますが正しくは以下の通り
[1,4,3,2,7,3,6,3,2,4,5,3]
次ページの実行コードからも下が正しいのが分かる。
ちなみに、英語版は両方共下の方のリストになっている。
なぜ日本語版であえて間違えているのだろうか・・・。謎です。

p.98

細かい間違いですが、printschedule()関数を呼ぶところは本のとおりに
>>import optimization
>>s=[1,4,3,2,7,3,6,3,2,4,5,3]
>>optimization.printschedule(s)
としたのなら
Seymour BOS 8:04-10:11 $ 95 12:08-14:05 $142
Franny DAL 10:30-14:57 $290 9:49-13:51 $229
Zooey CAK 17:08-19:08 $262 10:32-13:16 $139
Walt MIA 15:34-18:11 $326 11:08-14:38 $262
Buddy ORD 9:42-11:32 $169 12:08-14:47 $231
Les OMA 13:37-15:08 $250 11:07-13:24 $171
と出力されます。そりゃそうですよね。

p.97〜p.99

printschedule関数のout変数とret変数が英語版に比べ正しく記述されている。

また、schedulecost関数のoutbound変数とreturnf変数も英語版から直っている

p.100 実行部分

reload(opptimization)はreload(optimization)ですね。

あとリストがs=[1,4,3,2,7,3,6,3,2,4,5,3]になっているので
>optimization.schedulecost(s)
>4635
と出力されるのが正しいです。

p.100 最後の段落

5.3の最後の文章で組み合わせ総数が10^12と正しく記述されている。英語版では9^16となっている。

5.4 p.100〜p.101

5.3では12のフライトに選択肢が10ずつといっているのに、下では9フライトずつあるから(0,8)を人数の二倍で、と書いてあるが、
10なので(0,9)を調べる必要があるとおもうのですが、どうでしょう。
ですので実行部分は、
domain=[(0,9)]*(len(optimization.people)*2)
としたほうがいいでしょう。

p.103

for文の+と-の符号が英語版から正しく直されている。

p.105〜106

annelingoptimize関数のvecはfloatで初期化すると、今までのsolと出力値の表記がintとfloatでゆれてくるのでintにしたほうがいいと思う。実際ランダムなリストを作っているのですから。実際に実行部分でsの値を見てみれば分かります。

あと、
dir=random.randint(-step,step)
の部分は、-1か0か1をとるわけですが、0だと変更が行われないので
dir=step*(-1)**int(round(random.random()))
のようにしたほうがいいよと英語版errataには書いてありました。好みの問題ですかね。インデックスの方向が変わらないというのもアリというなら本の通りでもいいのかも。

また、英語版では変であった
p=pow(math.e,-abs(eb-ea)/T)

if (eb

p.109 実行部分

今まで一貫してコードを追加した後のreload()関数がないですね。じゃないとgeneticoptimizeがよべません。

5.8以降

Kayak APIを使った最適化のお話がありますが、自分は飛ばしました。気が向いたらやることにします。とりあえず、一旦飛ばします。

p.118のコードが

英語版からちゃんと直ってますね。

5.12のエクササイズ

外積が使えるってあるけど、内積ではないのだろうか?