Files
freeCodeCamp/curriculum/challenges/japanese/10-coding-interview-prep/project-euler/problem-352-blood-tests.md
2022-01-23 00:08:20 +09:00

4.2 KiB
Raw Permalink Blame History

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
5900f4cd1000cf542c50ffdf 問題 352: 血液検査 5 302012 problem-352-blood-tests

--description--

25 頭の羊の群れがいます。これらの一頭ずつに、珍しいウイルスの検査をする必要があります。このウイルスは、羊全体の 2% に感染することが知られています。

血液サンプルを検査するための正確な超高感度 PCR 検査があり、これを使えば陽性 / 陰性の結果が明確に得られますが、多大な時間と費用がかかります。

コストが高いので、担当の獣医は 25 頭を別々に検査するのではなく次の手順を使用することを提案しています。

羊を 5 頭ずつ 5 つのグループに分けます。 グループごとに 5 つのサンプルを混合し、1 回のみ検査します。 次に、以下を行います。

  • 結果が陰性の場合、そのグループのすべての羊がウイルスに感染していないとみなされます。
  • 結果が陽性の場合、検査をさらに 5 回 (それぞれの羊に 1 回ずつ) を実施して、感染した個体を特定します。

特定の個体への感染率はわずか 0.02 なので、各グループでの (プールしておいたサンプルを使った) 最初の検査は次のようになります。

  • 陰性 (これ以上の検査は不要) の確率: {0.98}^5 = 0.9039207968
  • 陽性 (5 回の追加検査が必要) の確率: 1 - 0.9039207968 = 0.0960792032

したがって、グループごとの検査の期待回数は 1 + 0.0960792032 × 5 = 1.480396016 です。

その結果、 5 つの全グループに対する検査回数は平均 1.480396016 × 5 = \mathbf{7.40198008} 回となり、70% 以上の大幅な節約となります!

上の計画は非常に効率的に見えますが、さらに大幅に改善することができます (検査の感度が十分に高く、異なるサンプルを混合することによる悪影響が生じないと常に仮定すれば)。 次に例を示します。

  • まず、25 個のサンプルすべてを混合したものを検査します。 この検査の約 60.35% のケースでは、結果が陰性となり追加検査は必要ありません。 追加検査が必要となるのは、残りの 39.65% のケースのみです。
  • 5 頭のグループのうちの少なとも 1 頭の感染が判明しており、最初の 4 頭の個別検査の結果が陰性であれば、5 頭目の検査は必要はありません (間違いなく感染しているからです)。
  • グループの数や各グループ内の頭数を変えて試すことができます。段階ごとにそれらの数を調整して、期待検査総数を最小限に抑えます。

非常に幅広い可能性を単純化するため、最も費用対効果の高い検査計画を立てる際の制約を設けます。それは、最初に混合サンプルを使う際は必ず、そのサンプルの元となった羊を完全にスクリーニング (すなわち、サンプルの元となったすべての羊についてウイルス感染の有無を判定) してから、他の羊を検査することです。

今回の例では、最も費用対効果の高い検査計画 (これを最適戦略と呼ぶことにします) での平均検査回数はわずか 4.155452 回です!

任意の個体に p の確率で感染するウイルスに関して、最適戦略を使用して s 頭の羊の群れをスクリーニングするのに必要な平均検査回数を T(s, p) とします。 したがって、四捨五入して小数第 6 位まで求めると T(25, 0.02) = 4.155452, T(25, 0.10) = 12.702124 となります。

p = 0.01, 0.02, 0.03, \ldots 0.50 のとき、\sum T(10\\,000, p) を求めなさい。 回答は、四捨五入して小数第 6 位まで示すこと。

--hints--

bloodTests()378563.260589 を返す必要があります。

assert.strictEqual(bloodTests(), 378563.260589);

--seed--

--seed-contents--

function bloodTests() {

  return true;
}

bloodTests();

--solutions--

// solution required