Трехсторонняя дуэль
А теперь автор представляет на суд читателя свою любимую задачу – задачу о трехсторонней дуэли. Вот ее условия.
Сэм, Билл и Джон договорились сразиться на дуэли втроем по следующим правилам:
- жеребьевка определяет, кто стреляет первым, вторым и третьим;
- дуэлянты располагаются на одинаковых расстояниях друг от друга (по углам равностороннего треугольника);
- обмениваются выстрелами по очереди, определенной жребием, пока двое не будут убиты;
- очередной стреляющий может стрелять в любого из живых.
Известно, что Сэм – снайпер и никогда не промахивается с данной дистанции, Билл поражает мишень в 80% случаев, а Джон – в 50%. Какова наилучшая стратегия для каждого из участников и каковы вероятности их выживания, если они следуют оптимальным стратегиям?
В этой дуэли у Сэма и Билла могут быть две тактики поведения. Нулевая – это когда стреляющий ничего не знает о меткости соперников и целит в первого подвернувшегося. Первая – когда дуэлянту известно о том, кто как стреляет, и он метит в соперника с наивысшими стрелковыми качествами в надежде остаться tête-à-tête с наихудшим стрелком.
Джон может следовать и второй тактике. Чтобы получить наивысшие шансы выйти победителем из дуэли, он должен намеренно стрелять в воздух, пока двое его соперников живы. Ведь очередной стреляющий будет бить не в него, а в более меткого противника. После того как Сэм или Билл будет убит, Джон должен показать все, на что он способен. В такой ситуации его шансы выжить составляют 50%, если он остался наедине с Сэмом, и еще больше ¾ если с Биллом.
Участник дуэли, прежде чем выстрелить, должен, во-первых, определить самого меткого соперника, в которого нужно стрелять, руководствуясь первой тактикой поведения. Для этого предназначена функция Самый_меткий (см. пункт 2 на рис. 6.36), возвращающая номер противника с наивысшими стрелковыми качествами. В ней перебором всех участников дуэли (цикл for) учитываются, естественно, только живые противники (СтатусПротивник
= “жив”) и не сам стреляющий (Противник ¹ Стрелок).