2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1 ... 21, 22, 23, 24, 25, 26, 27  След.
 
 Re: Лиса, Утка и озеро.
Сообщение08.02.2018, 17:58 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
grizzly в сообщении #1291206 писал(а):
rockclimber в сообщении #1291194 писал(а):
Это слишком хорошо, чтобы быть правдой.
Согласен. В студию!
После 12-й страницы я читал топик только урывками. Возможно, это уже обсуждали - вот wrest уже догадался, о чем я:
wrest в сообщении #1291207 писал(а):
Таких точек, как мы знаем, может быть больше одной если Утка на диагонали квадрата, при заметном расстоянии между ними по берегу, и эти точки Утка может менять малыми колебаниями плывя вдоль диагонали и пересекая диагональ чуть-чуть туда-сюда.
Правда я не согласен с тем, что
wrest в сообщении #1291207 писал(а):
да и вообще кажется тут Лисе хватит $k=2$.
Бесконечно малое колебание утки около диагонали приводит к тому, что разница между двумя альтернативными путями для лисы скачет на величину порядка стороны квадрата. Но за пределами квадрата безопасности, действительно, лисе стоит оценивать не расстояние до ближайших к утке точек, а угловое расстояние - его утка точно не сможет сокращать или менять рывками.

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение08.02.2018, 18:08 


05/09/16
11468
rockclimber в сообщении #1291213 писал(а):
вот wrest уже догадался, о чем я:

Не то чтобы догадался -- вы уже выдвигали такой подход и я уже отвечал вам на него: post1288885.html#p1288885

-- 08.02.2018, 18:10 --

rockclimber в сообщении #1291213 писал(а):
Бесконечно малое колебание утки около диагонали приводит к тому, что разница между двумя альтернативными путями для лисы скачет на величину порядка стороны квадрата.

Ну так и вот именно: Лисе надо пробежать две стороны, а Утке проплыть одну, $k=2$ :mrgreen: Ну плюс еще наш знаменитый арккосинус если Утка в тригонометрии сильна.
Берите бесконечное озеро -- 1-й квадрант координатной плоскости. Утка где-то на прямой $y=x$, Лиса в начале координат. И посчитайте $k$ исходя из того что Лиса бежит к той проекции Утки на координатную ось которая короче (то есть бежит или к точке $(x;0)$ если $x<y$ или к точке $(0;y)$ если наоборот. Или к началу координат если $x=y$, здесь $(x;y)$ -- текущие координаты Утки)

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение08.02.2018, 19:02 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
wrest в сообщении #1291216 писал(а):
rockclimber в сообщении #1291213 писал(а):
вот wrest уже догадался, о чем я:

Не то чтобы догадался -- вы уже выдвигали такой подход и я уже отвечал вам на него: post1288885.html#p1288885
Я выдвигал предположение о стратегии лисы, но тогда мне не приходило в голову, что утка может лису с этой стратегией обмануть.
wrest в сообщении #1291216 писал(а):
Ну так и вот именно: Лисе надо пробежать две стороны, а Утке проплыть одну, $k=2$
Я должен уточнить: если лиса действует по "простой" стратегии (всегда бежит к ближайшей точке), то утка побеждает всегда, и тут неважно, чему равно $k$. Если лиса в какой-то момент начинает ориентироваться на угловое расстояние, то на этот случай мое возражение не растпространяется. Скорее всего, $k$ будет все-таки больше двух, но не исключено, что всего чуть-чуть.

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение08.02.2018, 19:10 


05/09/16
11468
rockclimber в сообщении #1291230 писал(а):
Я должен уточнить: если лиса действует по "простой" стратегии (всегда бежит к ближайшей точке), то утка побеждает всегда, и тут неважно, чему равно $k$.
Ну я вот не представляю как это у вас так получается. Однако
grizzly в сообщении #1289739 писал(а):
В любом случае стратегию нужно проверить, поскольку интуиция нас всех в этой теме уже подводила
Так что - изложите ваши соображения поподробней, пож-ста.
Сразу скажу вам, что бесконечно малые тут не помогут. Утке надо когда-то принять решение плыть к берегу под арккосинус, а примет она его за километр от берега или за миллиметр, ничего не значит если сторон у квадрата только две.
Итак: Лиса в вершине квадрата, Утка на диагонали. Квадрат бесконечный (квадрант :) ).

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение08.02.2018, 19:16 


27/08/16
9426
rockclimber в сообщении #1291230 писал(а):
Я должен уточнить: если лиса действует по "простой" стратегии (всегда бежит к ближайшей точке), то утка побеждает всегда, и тут неважно, чему равно $k$.
Скорее всего, вы наткнулись на решение, при котором утка вечно плавает внутри озера, никогда не высаживаясь на берег.

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение08.02.2018, 20:34 


08/02/18

24
grizzly в сообщении #1291160 писал(а):
Dachnik в сообщении #1291156 писал(а):
В чем смысл задачки?
Вот сейчас кто-то выделит пару дней времени, наберётся терпения и будет Вам методично повторять все предыдущие 22 страницы. А Вы будете спорить и не соглашаться, пока Вас не убедят. Правильно?

Нет, лучше Вы сами почитайте и заодно посмотрите в Википедии, как считать длину полуокружности.

Виноват! Ошибся.
Лиса должна пробежать половину длины окружности 3,14*50 = 157 метр.
За время 157/4 = 39,25
Утка за 37,5 сек.

-- 08.02.2018, 21:34 --

grizzly в сообщении #1291160 писал(а):
Dachnik в сообщении #1291156 писал(а):
В чем смысл задачки?
Вот сейчас кто-то выделит пару дней времени, наберётся терпения и будет Вам методично повторять все предыдущие 22 страницы. А Вы будете спорить и не соглашаться, пока Вас не убедят. Правильно?

Нет, лучше Вы сами почитайте и заодно посмотрите в Википедии, как считать длину полуокружности.

Виноват! Ошибся.
Лиса должна пробежать половину длины окружности 3,14*50 = 157 метр.
За время 157/4 = 39,25
Утка за 37,5 сек.

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение08.02.2018, 21:43 
Заслуженный участник


20/08/14
11067
Россия, Москва
Ну что же товарищи и не очень нам товарищи (которые "чукча не читатель"). Я неожиданно обнаружил в JS canvas, на котором рисовать не так уж сложно, а значит открыт путь для интерактивных поделок. Например симуляции утки в треугольном озере, можете поуправлять лисой: https://codepen.io/anon/pen/bLBMrE
Пояснения. Нажатие на кнопку k=6 вызывает диалог смены значения k, при любом выходе из него экран перерисовывается (как и при нажатии на любую кнопку), а при смене значения (или подтверждении используемого) игра перезапускается. Нажатие на кнопку скорости переключает скорости лисы. Undo отменяет ровно столько шагов, сколько написано на кнопке скорости. Величина шага автоматически уменьшается при сближении утки и лисы - для повышения точности траектории. Проверки на достижение уткой берега нет (ну лень, лень!), так что аккуратнее, хотя вроде ничего и не портится. Все шаги (на скорости 20х - 20 шагов на каждое нажатие кнопок) сохраняются в массив для возможной отмены, так что пожалейте память компа и не делайте миллионы шагов. ;-) Для удобства можно выбрать вид с панелями сбоку и растянуть окно игры пошире.
Стратегия утки очень простая: если она успевает по перпендикуляру до берега (появляется сиреневая прямая) - плывёт к берегу, иначе - по диаметру от лисы. Последним лиса может пользоваться чтобы загнать утку почти куда угодно.
Hint: при k=5,8 утка всегда достигает берега, я не смог придумать стратегию лисе не пустить утку на берег, но уже для k=5,9 решение для лисы есть. Попробуйте и Вы!

Теперь мучает вопрос как закодировать оптимальную стратегию утки чтобы она всегда выигрывала и при k=7,3 ...

Ну а для квадратного озера программа заметно проще (не надо возиться с наклонные прямыми и перпендикулярами к ним), может сделаю отдельно.

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение08.02.2018, 23:05 


05/09/16
11468
Dmitriy40
Браво :appl:

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение08.02.2018, 23:25 
Заслуженный участник


20/08/14
11067
Россия, Москва
Сделал и для квадратного, убил всё лишнее и получилось из предыдущей достаточно просто: https://codepen.io/anon/pen/yvgzmG
При k=4,7 утка на берег не выходит.

Всё же слишком тривиальная стратегия утки, надо её допиливать.

Выложу наверное здесь код, а то там кажется любой может случайно его изменить:
код: [ скачать ] [ спрятать ]
Используется синтаксис Javascript
<html><head><meta charset="CP1251"><!-- Ozero3 -->
<center><canvas id="canvas">Ваш браузер не поддерживает canvas</canvas></center>
<script>
var k, xu, yu, l;
var xl, yl, ds = 1, rep, s3 = Math.sqrt(3), x0, y0, size, winx, winy;
var hu = [{x: xu, y: yu, l: l, wx: winx, wy: winy}];
var g = canvas.getContext("2d");
Init(6); // Относительная скорость лисы

function Init(t) {
  k = t; xu = 0; yu = 0; l = 0; winx = 0; winy = 0; rep = 20;
  hu = [{x: xu, y: yu, l: l, wx: winx, wy: winy}];
  document.getElementById("stK").value = "k = " + t;
  document.getElementById("stSpeed").value = "Скорость = " + rep + "x";
  LisaCoords(); ReDraw();
}
function lineto(x, y) { g.lineTo(x0+x*size, y0-y*size); }
function moveto(x, y) { g.moveTo(x0+x*size, y0-y*size); }
function line(x, y, xx, yy) { moveto(x, y); lineto(xx, yy); }
function circle(x, y, r, w, c) {
  g.beginPath(); g.strokeStyle = c; g.lineWidth = w;
  g.arc(x0+x*size, y0-y*size, r, 0, 0.001, true);
  g.stroke();
}
function ReDraw() {
  size = Math.min(innerWidth / 4, innerHeight / 3 - 50);
  canvas.width = size * 4; canvas.height = size * 3.2;
  x0 = Math.round(size * 2), y0 = Math.round(size * 2.1);
  g.beginPath(); g.strokeStyle = "black"; g.lineWidth = 1;
  g.clearRect(0, 0, canvas.width, canvas.height)
  g.moveTo(0, y0+0.5); g.lineTo(innerWidth, y0+0.5);
  g.moveTo(x0+0.5, 0); g.lineTo(x0+0.5, y0+size);
  line(-s3, -1, s3/2, 0.5); line(s3, -1, -s3/2, 0.5);
  line(xl, yl, xl-(xl-xu)*99, yl-(yl-yu)*99);
  g.stroke();
  g.beginPath(); g.strokeStyle = "red"; g.lineWidth = 3;
  line(0, 2, -s3, -1); lineto(+s3, -1); lineto(0, 2);
  g.stroke();
  circle(xl, yl, 5, 8, "red");
  g.beginPath(); g.strokeStyle = "blue"; g.lineWidth = 3;
  line(0, -2/k, -s3/k, 1/k); lineto(+s3/k, 1/k); lineto(0, -2/k);
  g.stroke();
  g.beginPath(); g.strokeStyle = "green"; g.lineWidth = 5; g.lineCap = "round";
  moveto(xu, yu); hu.forEach(function(u, i) { lineto(u.x, u.y); });
  g.stroke();
  if ((winx != 0) || (winy != 0)) {
    g.beginPath(); g.strokeStyle = "purple"; g.lineWidth = 3;
    line(xu, yu, winx, winy);
    g.stroke();
  }
  circle(xu, yu, 5, 7, "green");
}
function MoveUtka() {
  var tor = (2 - xu * s3 + 3 * yu) / 4; // до правой стороны
  var sur = (tor - yu) * 2, slr = 3*s3 - (2 - tor) * 2/s3; // пути утки и лисы
  var tol = (2 + xu * s3 + 3 * yu) / 4; // до левой стороны
  var sul = (tol - yu) * 2, sll = (2 - tol) * 2/s3 - 3*s3; // пути утки и лисы
  if (1.01 + yu < Math.min(Math.abs(l - xu), Math.abs(l + 6*s3 - xu), Math.abs(l - 6*s3 - xu)) / k) { // А не пойти ли утке по прямой к нижней стороне?
    yu -= ds / k; winy = -1; winx = xu;
  } else if (sur + 0.01 < Math.min(Math.abs(l - slr), Math.abs(l + 6*s3 - slr), Math.abs(l - 6*s3 - slr)) / k) { // А не пойти ли утке по прямой к правой стороне?
    xu += ds / k * s3 / 2; yu += ds / k / 2; winy = tor; winx = (2 - winy) / s3;
  } else if (sul + 0.01 < Math.min(Math.abs(l - sll), Math.abs(l + 6*s3 - sll), Math.abs(l - 6*s3 - sll)) / k) { // А не пойти ли утке по прямой к левой стороне?
    xu -= ds / k * s3 / 2; yu += ds / k / 2; winy = tol; winx = (winy - 2) / s3;
  } else { // Ну тогда пойдём по диаметру
    var dx = xu - xl, dy = yu - yl;
    var s = ds / k / Math.sqrt(dx*dx + dy*dy);
    xu += dx * s; yu += dy * s;
    winx = 0; winy = 0; // Пока утка к берегу не попадает
  }
  AddStep();
}
function MoveLisa(dl) {
  ds = Math.min(Math.sqrt((xu-xl)*(xu-xl) + (yu-yl)*(yu-yl)) / 30, 0.03); // Уменьшение шага при сближении лисы и утки
  l += dl * ds; // Шаг лисы
  LisaCoords();
}
function LisaCoords() { // Преобразование линейной координаты лисы в двухмерные
  xl = l; yl = -1;
  if (l > +3*s3) l -= 6*s3;
  if (l < -3*s3) l += 6*s3;
  if (l > +s3) {
    xl = (3*s3 - l) / 2; yl = 2 - (3*s3 - l) * s3/2;
  }
  if (l < -s3) {
    xl = - (3*s3 + l) / 2; yl = 2 - (3*s3 + l) * s3/2;
  }
}
function AddStep() {
  hu.unshift({x: xu, y: yu, l: l, wx: winx, wy: winy})
}
function UndoStep() {
  for (var i = 0; i < rep && hu.length > 1; i++) {
    hu.shift();
    xu = hu[0].x; yu = hu[0].y; l = hu[0].l; winx = hu[0].wx; winy = hu[0].wy;
    MoveLisa(0);
  }
  ReDraw();
}
function Left() {
  for (var i = 0; i < rep; i++) { MoveLisa(-1); MoveUtka(); }
  ReDraw();
}
function Wait() {
  for (var i = 0; i < rep; i++) { MoveLisa(0); MoveUtka(); }
  ReDraw();
}
function Right() {
  for (var i = 0; i < rep; i++) { MoveLisa(+1); MoveUtka(); }
  ReDraw();
}
function NewK() {
  var t = prompt("Введите новое значение k в диапазоне от 2 до 10:", k);
  if (t >= 2 && t <= 10) Init(t); else ReDraw();
}
function ChangeSpeed() {
  if (rep > 1) rep = 1; else rep = 20;
  document.getElementById("stSpeed").value = "Скорость = " + rep + "x";
  ReDraw();
}
</script>
</head><body onload="Init(6)">
<center>
<input type=button value="   По часовой   " id=left onclick="Left()">
<input type=button value="   | Стоять |   " id=wait onclick="Wait()">
<input type=button value=" Против часовой " id=right onclick="Right()">
<p>
<input type=button value=" k=? " id=stK onclick="NewK()">
<input type=button id="Undo" onclick="UndoStep()" value="ААА! Спасите! Срочно отменить шаг!">
<input type=button id="stSpeed" onclick="ChangeSpeed()" value=" Скорость ? ">
<center>
<body></html>

код: [ скачать ] [ спрятать ]
Используется синтаксис Javascript
<html><head><meta charset="CP1251"><!-- Ozero4 -->
<center><canvas id="canvas">Ваш браузер не поддерживает canvas</canvas></center>
<script>
var k, xu, yu, l;
var xl, yl, ds = 1, rep, x0, y0, size, winx, winy;
var hu = [{x: xu, y: yu, l: l, wx: winx, wy: winy}];
var g = canvas.getContext("2d");
Init(5); // Относительная скорость лисы

function Init(t) {
  k = t; xu = 0; yu = 0; l = 0; winx = 0; winy = 0; rep = 20;
  hu = [{x: xu, y: yu, l: l, wx: winx, wy: winy}];
  document.getElementById("stK").value = "k = " + t;
  document.getElementById("stSpeed").value = "Скорость = " + rep + "x";
  LisaCoords(); ReDraw();
}
function lineto(x, y) { g.lineTo(x0+x*size, y0-y*size); }
function moveto(x, y) { g.moveTo(x0+x*size, y0-y*size); }
function line(x, y, xx, yy) { moveto(x, y); lineto(xx, yy); }
function circle(x, y, r, w, c) {
  g.beginPath(); g.strokeStyle = c; g.lineWidth = w;
  g.arc(x0+x*size, y0-y*size, r, 0, 0.001, true);
  g.stroke();  
}
function ReDraw() {
  size = Math.min(innerWidth / 2.1, innerHeight / 2.1 - 50);
  canvas.width = size * 2.1; canvas.height = size * 2.1;
  x0 = Math.round(size * 1.05), y0 = Math.round(size * 1.05);
  g.beginPath(); g.strokeStyle = "black"; g.lineWidth = 1;
  g.clearRect(0, 0, canvas.width, canvas.height)
  g.moveTo(0, y0+0.5); g.lineTo(innerWidth, y0+0.5);
  g.moveTo(x0+0.5, 0); g.lineTo(x0+0.5, innerHeight);
  line(-1, -1, 1, 1); line(1, -1, -1, 1);
  line(xl, yl, xl-(xl-xu)*99, yl-(yl-yu)*99);
  g.stroke();
  g.beginPath(); g.strokeStyle = "red"; g.lineWidth = 3;
  line(-1, -1, -1, 1); lineto(1, 1); lineto(1, -1); lineto(-1, -1);
  g.stroke();
  circle(xl, yl, 5, 8, "red");
  g.beginPath(); g.strokeStyle = "blue"; g.lineWidth = 3;
  line(-1/k, -1/k, -1/k, 1/k); lineto(1/k, 1/k); lineto(1/k, -1/k); lineto(-1/k, -1/k);
  g.stroke();
  g.beginPath(); g.strokeStyle = "green"; g.lineWidth = 5; g.lineCap = "round";
  moveto(xu, yu); hu.forEach(function(u, i) { lineto(u.x, u.y); });
  g.stroke();
  if ((winx != 0) || (winy != 0)) {
    g.beginPath(); g.strokeStyle = "purple"; g.lineWidth = 3;
    line(xu, yu, winx, winy);
    g.stroke();
  }
  circle(xu, yu, 5, 7, "green");
}
function MoveUtka() {
  if (1.001 + yu < Math.min(Math.abs(l - xu), Math.abs(l + 8 - xu)) / k) { // А не пойти ли утке по прямой к нижней стороне?
    yu -= ds / k; winy = -1; winx = xu;
  } else if (1.001 - xu < Math.min(Math.abs(l - 2 - yu), Math.abs(l + 6 - yu)) / k) { // А не пойти ли утке по прямой к правой стороне?
    xu += ds / k; winy = yu; winx = +1;
  } else if (1.001 + xu < Math.min(Math.abs(l + 2 - yu), Math.abs(l - 6 - yu)) / k) { // А не пойти ли утке по прямой к левой стороне?
    xu -= ds / k; winy = yu; winx = -1;
  } else if (1.001 - yu < Math.min(Math.abs(l - 4 - xu), Math.abs(l + 4 - xu)) / k) { // А не пойти ли утке по прямой к верхней стороне?
    yu += ds / k; winy = 1; winx = xu;
  } else { // Ну тогда пойдём по диаметру
    var dx = xu - xl, dy = yu - yl;
    var s = ds / k / Math.sqrt(dx*dx + dy*dy);
    xu += dx * s; yu += dy * s;
    winx = 0; winy = 0; // Пока утка к берегу не попадает
  }
  AddStep();
}
function MoveLisa(dl) {
  ds = Math.min(Math.sqrt((xu-xl)*(xu-xl) + (yu-yl)*(yu-yl)) / 50, 0.015); // Уменьшение шага при сближении лисы и утки
  l += dl * ds; // Шаг лисы
  LisaCoords();
}
function LisaCoords() { // Преобразование линейной координаты лисы в двухмерные
  xl = l; yl = -1;
  if (l > +4) l -= 8;
  if (l < -4) l += 8;
  if (l > +1) { xl = +1; yl = l - 2; }
  if (l > +3) { xl = 4 - l; yl = +1; }
  if (l < -1) { xl = -1; yl = -l - 2; }
  if (l < -3) { xl = - l - 4; yl = +1; }
}
function AddStep() {
  hu.unshift({x: xu, y: yu, l: l, wx: winx, wy: winy})
}
function UndoStep() {
  for (var i = 0; i < rep && hu.length > 1; i++) {
    hu.shift();
    xu = hu[0].x; yu = hu[0].y; l = hu[0].l; winx = hu[0].wx; winy = hu[0].wy;
    MoveLisa(0);
  }
  ReDraw();
}
function Left() {
  for (var i = 0; i < rep; i++) { MoveLisa(-1); MoveUtka(); }
  ReDraw();
}
function Wait() {
  for (var i = 0; i < rep; i++) { MoveLisa(0); MoveUtka(); }
  ReDraw();
}
function Right() {
  for (var i = 0; i < rep; i++) { MoveLisa(+1); MoveUtka(); }
  ReDraw();
}
function NewK() {
  var t = prompt("Введите новое значение k в диапазоне от 2 до 10:", k);
  if (t >= 2 && t <= 10) Init(t); else ReDraw();
}
function ChangeSpeed() {
  if (rep > 1) rep = 1; else rep = 20;
  document.getElementById("stSpeed").value = "Скорость = " + rep + "x";
  ReDraw();
}
</script>
</head><body onload="Init(5)">
<center>
<input type=button value="   По часовой   " id=left onclick="Left()">
<input type=button value="   | Стоять |   " id=wait onclick="Wait()">
<input type=button value=" Против часовой " id=right onclick="Right()">
<p>
<input type=button value=" k=? " id=stK onclick="NewK()">
<input type=button id="Undo" onclick="UndoStep()" value="ААА! Спасите! Срочно отменить шаг!">
<input type=button id="stSpeed" onclick="ChangeSpeed()" value=" Скорость ? ">
<center>
<body></html>

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение08.02.2018, 23:37 


05/09/16
11468
Dmitriy40
Да, чего-то Утка пугливая, пора ей узнать про арккосинус.

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение08.02.2018, 23:49 
Заслуженный участник


20/08/14
11067
Россия, Москва
Да не в арккосинусе дело, предыдущая программа вообще с горизонтальной уткой была (в квадрате) и утка выигрывала даже при k=5,7. Зато здесь картинки красивее! :D

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение09.02.2018, 10:03 
Заслуженный участник
Аватара пользователя


01/08/06
3049
Уфа
Офигительно! :twisted: :appl:

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение09.02.2018, 10:58 
Аватара пользователя


11/12/16
13195
уездный город Н
Dmitriy40

:appl:

Dmitriy40 в сообщении #1291265 писал(а):
, иначе - по диаметру от лисы.


У Вас - по "хорде". Может быть утку действительно пустить по "диаметру"? То есть в точку периметра, которая (вместе с точкой лисы) делит периметр пополам.

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение09.02.2018, 11:03 


05/09/16
11468
Dmitriy40
Да, метод "по диаметру" конечно не то, что спасет Утку.

Я думаю, стратегия Утки примерно такая:
1. Какова максимальная мгновенная угловая скорость Утки и Лисы? Если у Утки больше, то она внутри фигуры безопасности. Тогда делать шаг такой, чтобы увеличение угла Утки было равно максимальному увеличению угла Лисой (наверное это в ваших терминах будет: "по диаметру"), а остальной запас скорости потратить на движение в сторону берега, вдоль текущего радиуса.
2. Если максимальная мгновенная угловая скорость Утки меньше или равна такой у Лисы -- значит фигура безопасности пройдена и для Утки начинается новая жизнь, полная опасностей. Теперь Утка точно знает поймает её Лиса или нет если не будет филонить, и об этом можно просигнализировать (ну типа выкинуть белый или черный флаг). Двигаться надо так. Если направление по арккосинусу попадает в границы ближней к Утке стороны, то двигаться туда. Если не попадает, то двигаться по арккосинусу к следующей по близости стороне (тут уже должно попасть, кмк.) Проверять догонит ли Лиса Утку тут надо на каждом шагу, т.к. Лиса может остановиться или побежать в другую сторону, так что паника может быть преждевременной (черный флаг поражения может смениться белым флагом победы. но не наоборот, конечно).

 Профиль  
                  
 
 Re: Лиса, Утка и озеро.
Сообщение09.02.2018, 13:34 
Заслуженный участник


20/08/14
11067
Россия, Москва
EUgeneUS в сообщении #1291332 писал(а):
У Вас - по "хорде".
Хм, и правда ... Делал вроде строго по направлению "от лисы" (которое отрисовывается лучом), а что он не диаметр не подумал ... Ну для квадрата поправить легко (пожалуй даже добавлю переключение по кнопочке) , а для треугольника опять вспоминать геометрию ... Как-то лень, всё равно ведь алгоритм для утки далеко не оптимальный.

wrest в сообщении #1291334 писал(а):
Я думаю, стратегия Утки примерно такая:
1. Какова максимальная мгновенная угловая скорость Утки и Лисы? Если у Утки больше, то она внутри фигуры безопасности. Тогда делать шаг такой, чтобы увеличение угла Утки было равно максимальному увеличению угла Лисой (наверное это в ваших терминах будет: "по диаметру"), а остальной запас скорости потратить на движение в сторону берега, вдоль текущего радиуса.
Именно так работает программа выхода из центра, что приводил много картинок. Только ради оптимальности утка делает не два шага (сначала к новому диаметру, а потом вдоль него от лисы), а один сразу в конечную точку - для чего и использовался поиск деления пополам (уже потом понял что это лишнее, решение находится аналитически, но думать было уже лень).
И да, внутри фигуры безопасности это самый правильный метод.
Вопрос что делать на границе фигуры, я хочу заставить утку не покидать границу безопасности кроме как из угла или середины стороны (это облегчает аналитический анализ), но если лиса будет стоять, то это неправильно и уходить надо именно что по диаметру пока та продолжает стоять. Предыстория при этом не нужна, просто пока находимся на диаметре - делать шаг по нему же, если не на нём - лиса сдвинулась и надо идти горизонтально/вертикально к какой-то стороне, плюя на диаметр! это гарантирует выигрыш утке в квадрате при k=5,7.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 404 ]  На страницу Пред.  1 ... 21, 22, 23, 24, 25, 26, 27  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group