2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13 ... 16  След.
 
 Re: Новый конкурс Зиммерманна
Сообщение11.01.2011, 08:20 
Аватара пользователя


21/02/10
1594
Екатеринбург
Чего то торкнуло. Самой трудоемкой процедурой в основе любого алгоритма по заданной теме является процедура инверсии.
Полагаю все эту процедуру реализовали примерно так:
Код:
  while j>i do begin
    b:=a[i];a[i]:=a[j];a[j]:=b;inc(i);dec(j)
  end;


А можно ли придумать такую структуру данных для хранения перестановки, чтобы операция инверсии выполнялась значительно быстрее?!

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение11.01.2011, 10:59 


04/11/10

141
Pavlovsky в сообщении #397966 писал(а):
А можно ли придумать такую структуру данных для хранения перестановки, чтобы операция инверсии выполнялась значительно быстрее?!

Можно, но решение вопроса лежит в другой плоскости.

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение11.01.2011, 18:44 
Заблокирован
Аватара пользователя


22/03/08

7154
Саратов
Pavlovsky в сообщении #397966 писал(а):
Чего то торкнуло. Самой трудоемкой процедурой в основе любого алгоритма по заданной теме является процедура инверсии.
Полагаю все эту процедуру реализовали примерно так:
Код:
  while j>i do begin
    b:=a[i];a[i]:=a[j];a[j]:=b;inc(i);dec(j)
  end;


Насколько понимаю, в приведённой реализации каждый элемент отдельно переобозначается через некоторую переменную b.
Это в самом деле долго.
У меня не так. Я сразу записываю все элементы, подлежащие инверсии во вспомогательный массив $c(i)$, а затем просто переписываю этот массив в обратном порядке и получаю готовую инверсию $a(i)$.
В моих программах эта процедура не является самой трудоёмкой. Например, я генерировала по 100000 комбинаций (при наращивании последовательностей со случайной генерацией), эти комбинации проверяются на количество перекладываний за несколько секунд, генерация выполняется дольше.

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение13.01.2011, 11:30 


04/11/10

141
dvorkin_sacha в сообщении #395186 писал(а):
Nataly-Mak в сообщении #394403 писал(а):
dvorkin_sacha в сообщении #394301 писал(а):
Для $n = 19$ у меня максимальное число перекладываний > $220$.

Не поняла. Для какой последовательности у вас для $n=19$ число шагов $>220$? Для такой, которая оканчивается тождественной перестановкой? Тогда у вас результат больше, чем указан в OEIS (ибо там всего 207 шагов).

Если же вы имеете в виду последовательность типа B (не приводящую к тождественной перестановке), тогда понятно. Уже давно многие на конкурсе нашли результат для такой последовательности 221 шаг. Но не факт, что это максимум.

Для $n=19$ имеются 2 решения с 207 шагами. Но это результат тривиальный. А вот для $n=23$ полученное мною решение, практически совпадающее с тем максимальным, которое Вы приводили, заслуживает внимания: дело в том, что для последовательности, к которой оно приводит, результат является максимальным, т.е. его невозможно уже улучшить. Думаю, что ценители нетривиальных результатов смогут это должным образом оценить (число перекладываний почти 400!).

И еще несколько уточнений: я писал про число шагов более $>220$, т.к. Вы указывли цифирь 220, и не более того. Что касается решения с числом перекладываний $221$, то оно получается элементарно: сначала каким-либо методом (например, одним из методов наращивания последовательностей, у которых уже давно борода отросла), находите решение с достаточно высоким числом перекладываний (их классифицировать можно по получаемым в результате перекладываний корням, т.к. их будет значительно меньше, чем предварительных решений) и далее, отступая подальше от листа дерева, применяете "деревянный" алгоритм. Т.к. я не принимаю участие в конкурсе, то привожу мои конкретные цифры. Предварительное решение со $179$ перекладываниями (одно уточнение: в случае применения методов наращивания не надо никаких наращиваний делать!):
Код:
13  2  3  4 14 15  7 17 18  9  6 16 12 10  5 19  1  8 11

А вот уточненные решения с $221$ перекладываниями (аж пять штук, полученные мною за доли секуды):
Код:
12 15 11 1 10 17 19 2 5 8 9 4 18 13 16 7 3 14 6
12 15 11 1 10 17 19 2 5 8 9 4 18 13 16 7 3 14 6
9 4 19 17 10 1 11 15 12 8 5 2 18 13 16 7 3 14 6
12 1 18 11 3 14 2 6 8 16 5 4 15 10 13 17 19 7 9
12 1 18 11 2 3 14 6 8 16 5 4 15 10 13 17 19 7 9

Конечно, техника работы, как в случае спуска, так и подъема по дереву решения, должна быть достаточно высока.

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение13.01.2011, 16:12 


24/11/10
48
Цитата:
применяете "деревянный" алгоритм

Вы имеете ввиду поочередную инверсию по элементам, которые находятся на "своих" местах (т.е. напр. карта с номером 5 - на пятом месте)?

-- Чт янв 13, 2011 16:28:51 --

Pavlovsky в сообщении #397966 писал(а):
Чего то торкнуло. Самой трудоемкой процедурой в основе любого алгоритма по заданной теме является процедура инверсии.
Полагаю все эту процедуру реализовали примерно так:
Код:
  while j>i do begin
    b:=a[i];a[i]:=a[j];a[j]:=b;inc(i);dec(j)
  end;


А можно ли придумать такую структуру данных для хранения перестановки, чтобы операция инверсии выполнялась значительно быстрее?!

Linked list - для инверсии лишь меняются местами "голова" и "хвост" - в форуме
Зиммерманна есть ссылка на описание этой процедуры.

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение13.01.2011, 23:13 


04/11/10

141
Vitaly12 в сообщении #399347 писал(а):
Цитата:
применяете "деревянный" алгоритм

Вы имеете ввиду поочередную инверсию по элементам, которые находятся на "своих" местах (т.е. напр. карта с номером 5 - на пятом месте)?

Примерно так, но если Вы ознакомитесь с моим сообщением по поводу n = 23, то с трудом в это поверите, а если точней, то совсем не поверите. Так что есть над чем порассуждать. И еще посмотрите на начальное приближение, полученное, в моем предыдущем сообщении: очевидно, что пришлось работать с 16! (факториал от 16). В это тоже очень трудно поверить, но это так (о чем и говорит результат). Но уж такова моя судьба сродни судьбе барона Мюнхаузена.

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение13.01.2011, 23:41 
Заблокирован
Аватара пользователя


22/03/08

7154
Саратов
dvorkin_sacha в сообщении #399195 писал(а):
А вот уточненные решения с $221$ перекладываниями (аж пять штук, полученные мною за доли секуды):
Код:
12 15 11 1 10 17 19 2 5 8 9 4 18 13 16 7 3 14 6
12 15 11 1 10 17 19 2 5 8 9 4 18 13 16 7 3 14 6
. . . . . . . .


Не вижу, чем отличаются эти две последовательности одна от другой :-)
По-моему, они совершенно одинаковые. Или я что-то не понимаю?

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение13.01.2011, 23:48 


24/11/10
48
[quote=И еще посмотрите на начальное приближение, полученное, в моем предыдущем сообщении: очевидно, что пришлось работать с 16! (факториал от 16). [/quote]

16! = 20922789888000
Что Вы имели ввиду? Вы ведь не хотите сказать, что перебрали ВСЕ возможные случаи случаи?!

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение13.01.2011, 23:59 


04/11/10

141
Nataly-Mak в сообщении #399591 писал(а):
dvorkin_sacha в сообщении #399195 писал(а):
А вот уточненные решения с $221$ перекладываниями (аж пять штук, полученные мною за доли секуды):
Код:
12 15 11 1 10 17 19 2 5 8 9 4 18 13 16 7 3 14 6
12 15 11 1 10 17 19 2 5 8 9 4 18 13 16 7 3 14 6
. . . . . . . .


Не вижу, чем отличаются эти две последовательности одна от другой :-)
По-моему, они совершенно одинаковые. Или я что-то не понимаю?

Все правильно понимаете: в конце расчета первый максимальный результат дублируется, вот я его по рассеянности и присоседил - ведь расчет производился давно и многое подзабылось.

-- Пт янв 14, 2011 00:11:03 --

Vitaly12 в сообщении #399594 писал(а):
Что Вы имели ввиду? Вы ведь не хотите сказать, что перебрали ВСЕ возможные случаи?!

Я имею в виду то, что мой алгоритм учитывает все случаи, в которых последовательность можно считать кандидатом для дальнейшего рассмотрения. Но, вообще говоря, результат (в смысле его максимальности) для n = 23 выглядит еще более фантастическим.

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение14.01.2011, 00:43 


24/11/10
48
[quote=Но, вообще говоря, результат (в смысле его максимальности) для n = 23 выглядит еще более фантастическим.[/quote]
Безусловно, но не совсем понятно, как Вы определяете приближенность результата к максимальному.

[quote=мой алгоритм учитывает все случаи, в которых последовательность можно считать кандидатом для дальнейшего рассмотрения.[/quote]
Вы имеете ввиду, что ваш алгоритм отсекает целые ветви, не проходя их поначалу? Если да, то по какому критерию?

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение14.01.2011, 01:08 


04/11/10

141
Vitaly12

Я просто доказываю, что результат для сгенерируемой мною последовательности максимален (т.е. если в результате n перекладываний мы получаем впереди единицу, то для этой самой последовательности впереди с единицей не существует первоначальной последовательности, из которой она получена, с большим числом перекладываний). Об остальном умолчу.

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение14.01.2011, 07:52 
Аватара пользователя


21/02/10
1594
Екатеринбург
Vitaly12 в сообщении #399347 писал(а):
Linked list - для инверсии лишь меняются местами "голова" и "хвост" - в форуме
Зиммерманна есть ссылка на описание этой процедуры.


А можете дать прямо ссылку. Я думал над связанными списками, но ничего хорошего не придумал. Поменять голову и хвост этого мало.

А так же если не трудно, расскажите где находится форум Зиммермана. Вы имеете ввиду дискуссионные группы?! В прошлый раз попытался в них зарегистрироваться, но у меня не получилось.

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение14.01.2011, 13:18 


24/11/10
48
Pavlovsky в сообщении #399690 писал(а):
Vitaly12 в сообщении #399347 писал(а):
Linked list - для инверсии лишь меняются местами "голова" и "хвост" - в форуме
Зиммерманна есть ссылка на описание этой процедуры.


А можете дать прямо ссылку. Я думал над связанными списками, но ничего хорошего не придумал. Поменять голову и хвост этого мало.

А так же если не трудно, расскажите где находится форум Зиммермана. Вы имеете ввиду дискуссионные группы?! В прошлый раз попытался в них зарегистрироваться, но у меня не получилось.

Нужно зарегистрироваться, а потом поискать в сообщениях ближе к началу текущего конкурса.
tech.groups.yahoo.com/group/AlZimmermannsProgrammingContests

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение14.01.2011, 14:45 
Аватара пользователя


21/02/10
1594
Екатеринбург
Со второй попытки сумел зарегитьс в группе.
Нашел такую ссылку. http://tomas.rokicki.com/pancake/ по ссылке такой текст:

Цитата:
The normal representation is to use an array where a[i] contains the size of the pancake at position i. With the add trick, the pancake stack is instead represented as a doubly-linked list using an array b[], where b[i] contains the *sum* of the preceding and succeeding pancakes. In addition, you need to remember the first pancake somewhere.

Why is this a cool representation? Consider a flip. In the normal representation, for a flip of m pancakes, you need to modify all the elements of a[i] for 0<=i<m; no matter how you do this, it's going to be slow. But in the new representation, if you know which pancake is at position m (call this p), at position m-1 (call this prev), and at the beginning (first), all you need to do to "flip" it is:

b[first] += p ;
b[prev] -= p ;
b[p] += first - prev ;
because what's happening is the pancake at "first" is gaining a neighbor (p), the pancake at prev is losing a neighbor (p), and the pancake at p is having a neighbor changed from prev to first. The key is that the information associated with pancakes on the interior of the flip does not change during the flip; the neighbors of those pancakes (and thus their sum) remains the same. To walk the entire stack from front to back, we do something like:

prev = first ;
p = b[prev] ;
do {
next = b[p] - prev ;
prev = p ;
p = next ;
// this is a possible flip here
} until (p == N) ;


Я так понимаю это и есть алгоритм инверсии, но вот врубиться в алгоритм пока не могу.

 Профиль  
                  
 
 Re: Новый конкурс Зиммерманна
Сообщение14.01.2011, 14:54 


24/11/10
48
[quote=Я так понимаю это и есть алгоритм инверсии, но вот врубиться в алгоритм пока не могу.[/quote]
Это и есть алгоритм и он работает, правда общий выигрыш во времени не в разы :cry:

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 229 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13 ... 16  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

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


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

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