Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ищу алгоритм пересчета уравнений 
V
    Опции темы
Ch0bits
Дата 20.4.2012, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Доброго времени суток!

Пишу свой доморощенный аналог Excel таблицы. Каждая ячейка в таблице может содержать формулу, в составе которой могут быть другие ячейки (её зависимости). Получается система уравнений, зависимости между переменными в ней представлены в виде ориентированного ациклического графа (у меня хранится в матрице смежности). При изменении пользователем значения в ячейке по графу должна быть найдена последовательность пересчета зависимых значений.
Собственно на этой задачей и маюсь. Сначала думал начать поиск от изменяемой вершины, но не смог придумать что делать с зависимостями. Сейчас склоняюсь, что надо начинать поиск от каждой не пройденной вершины, запоминать путь до измененной ячейки и класть его в очередь с приоритетами, где приоритет это расстояние. Последовательность пересчета будет получена из очереди.

Посоветуйте, есть ли более оптимальный алгоритм, ведь наверняка уже все давно придумано?

UPDATE: Схема c ошибкой. Смотрите ниже!
user posted image

Это сообщение отредактировал(а) Ch0bits - 20.4.2012, 21:15
PM WWW   Вверх
Lipetsk
Дата 20.4.2012, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: 2
Всего: 5



у вас граф не соответствует формулам!!!

если по формулам, то при изменении C нужно делать одно из
Y->X->Z->X
Z->X->Y->X
Y->Z->X
Z->Y->X

и скорее всего проще не думать о том, какой именно из пересчётов выполнять, и тогда достаточно помнить для каждой ячейки, кто от нее зависит и обойтись без графов
PM   Вверх
Pavia
Дата 20.4.2012, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



1) Пусть у нас есть изменившийся ячейка или ячейки. Иначе прекращаем алгоритм.
2) Надо найти все ячейки которые имеют связи с нашими изменившимися ячейками. 
3) Затем удалить дубликата.
4) Посчитать изменения в этих ячейках.
5) переходим к пункту 1.

Для быстрого поиска просто хранить в графе обратные дуги, т.е не ориентированный граф.

Приоритеты не нужны если не боитесь лишних вычислений.
А вот если хотите снизить вычислительные затраты то можно с приоритетами.
Тогда в два прохода.  Первый рассчитываем приоритеты второй вычисляем.

Первый проход. Вместо вычисления увеличиваем приоритет на 1.
Затем второй проход вычисляем только те изменившиеся у которых приоритет равен 0. Затем для этих по обратным связям уменьшаем на 1 приоритет.
PM MAIL   Вверх
Mirkes
Дата 20.4.2012, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 4
Всего: 17



Если аналог Excel, то есть еще один эффект, о котром следует подумать заранее - функции типа случайное число, которые не имеют аргументов, но в Excel фактически зависят от ВСЕХ ячеек. То есть при любом изменении в любой ячейке производится пересчет случайных величин.


--------------------
Mirkes
PM MAIL   Вверх
Ch0bits
Дата 20.4.2012, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Цитата(Lipetsk @  20.4.2012,  20:06 Найти цитируемый пост)
у вас граф не соответствует формулам!!!

Премного изменяюсь. Нарисовал новую схему, более показательную.

user posted image

Mirkes, у меня нет рандома, но есть IF - вот засада! Ничего, прорвемся!  smile 

Pavia, эээ... ща подумаю.

Это сообщение отредактировал(а) Ch0bits - 20.4.2012, 21:21
PM WWW   Вверх
disputant
Дата 21.4.2012, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: 2
Всего: 3



Цитата(Ch0bits @ 20.4.2012,  19:11)
Посоветуйте, есть ли более оптимальный алгоритм, ведь наверняка уже все давно придумано?

Вы не смотрели в сторону топологической сортировки?
PM MAIL   Вверх
Ch0bits
Дата 21.4.2012, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Цитата(disputant @  21.4.2012,  10:43 Найти цитируемый пост)
Вы не смотрели в сторону топологической сортировки? 

Смотрел, тоже интересная идея, но решений топологической сортировки может быть несколько, а значит будут лишние пересчеты. С другой стороны, преимуществом будет то, можно единожды отсортировать граф для листа, пока неизменны формулы. И не пересчитывать зависимости каждый раз.

До сих пор думаю вот. В понедельник несколько реализаций испробую на реальных данных и выберу менее затратную.
PM WWW   Вверх
disputant
Дата 22.4.2012, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: 2
Всего: 3



Ну, тогда развернуть стрелочки и хранить граф зависимостей? Тогда просто идти по графу зависимостей от измененной ячейки поиском в ширину и пересчитывать все, на пути попадающееся?
PM MAIL   Вверх
Ch0bits
Дата 22.4.2012, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Всему виной моя неграмотность. Графы не пригодились ни разу за 7 лет после института smile Спокойно почитал книжку на выходных. 
disputant получи +1, ты абсолютно прав, сегодня реализовал топологическую сортировку, все отлично.

Большое спасибо всем.

Это сообщение отредактировал(а) Ch0bits - 22.4.2012, 13:21
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.