целевой перебор вариантов
От: nvoynov Украина http://nvoynov.blogspot.com
Дата: 28.04.09 12:59
Оценка:
Здравствуйте, RSDN.Алгоритмы!

Есть такая задачка бартерная

* Поиск многоуровневых сделок (участвует более двух участников). Например,
— Васе нужен Сахар и у него есть Конфеты;
— у Пети есть сахар, но ему нужно Масло;
— у Маши есть Масло и ей нужны Конфеты.

* Логически получается такая схема:
— Вася (Конфеты) -> Брокер
— Брокер (Конфеты) <-> Маша (Масло)
— Брокер (Масло) <-> Петя (Сахар)
— Брокер (Сахар) -> Вася

Подскажите пожалуйста, есть ли какие стандартные алгоритмы для решения подобных задач?
С уважением, Николай
Re: целевой перебор вариантов
От: Кодт Россия  
Дата: 28.04.09 14:03
Оценка: +1
Здравствуйте, nvoynov, Вы писали:

N>Подскажите пожалуйста, есть ли какие стандартные алгоритмы для решения подобных задач?


Имеем двудольный орграф: слева агенты, справа товар.
Ребро от агента к товару значит, что товар в наличии (поставляется агентом).
Ребро от товара к агенту — что он хочет его приобрести.

Задача номер один: разбить орграф на циклы.

Задача номер два — совсем тривиальная — ввести брокера и представить обход цикла как работу через брокера.
... << RSDN@Home 1.2.0 alpha 4 rev. 1181>>
Перекуём баги на фичи!
Re[2]: целевой перебор вариантов
От: nvoynov Украина http://nvoynov.blogspot.com
Дата: 28.04.09 15:43
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Имеем двудольный орграф: слева агенты, справа товар.

К>Ребро от агента к товару значит, что товар в наличии (поставляется агентом).
К>Ребро от товара к агенту — что он хочет его приобрести.

Может путаю терминологию (очень давно "числил методы") двудольный наверное не получается — у агента есть один товар, а нужен ему другой, т.е. ребра могут быть двунаправленными.

К>Задача номер один: разбить орграф на циклы.

К>Задача номер два — совсем тривиальная — ввести брокера и представить обход цикла как работу через брокера.

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

в любом случае это граф, наверное товаров (что на что можно поменять) и в нем нужно искать циклы, а потом выбирать наименьшие ...

спасибо
С уважением, Николай
Re[3]: целевой перебор вариантов
От: Кодт Россия  
Дата: 28.04.09 16:32
Оценка:
Здравствуйте, nvoynov, Вы писали:

N>Может путаю терминологию (очень давно "числил методы") двудольный наверное не получается — у агента есть один товар, а нужен ему другой, т.е. ребра могут быть двунаправленными.


Так как раз двудольный и ориентированный.
Двудольность заключается в том, что все вершины принадлежат к двум подмножествам — агенты и товары, и рёбра есть только между агентами и товарами, но не внутри агентов или внутри товаров.
А ориентированность — в том, что одни рёбра означают предложение, другие спрос; и естественно задать тип отношения направлением ребра.

К>>Задача номер один: разбить орграф на циклы.

К>>Задача номер два — совсем тривиальная — ввести брокера и представить обход цикла как работу через брокера.

N>и по идее это большая система предложений, соответственно ребра могут быть а могут не быть как в прямом так и обратном направлении ...


N>в любом случае это граф, наверное товаров (что на что можно поменять) и в нем нужно искать циклы, а потом выбирать наименьшие ...


Я сформулировал наиболее общий случай. Скажем, один агент выставляет множество предложений и множество же заявок.
Это может означать, что
— нужно удовлетворить все заявки (т.е. мы разбиваем граф на циклы, разбивая множество рёбер-заявок)
— нужно удовлетворить ровно одну заявку (т.е. мы разбиваем множество вершин-агентов)
— нужно удовлетворить хотя бы одну заявку агента, чтобы он "имел навар с яиц" (т.е. мы не разбиваем, а покрываем множество вершин-агентов)

А возможно, что условия задачи провозглашают, что у агента ровно одна заявка и ровно одно предложение.
В таком случае заявка-агент-предложение является ребром.
И тогда у нас получается просто орграф из вершин-товаров и рёбер-агентов.
И мы разбиваем его на циклы, разбивая (или покрывая) множество рёбер.

Покрытие рёбер значит, что несколько циклов могут проходить через одно ребро — т.е. агент неоднократно наваривается на бартере. (Как в первом случае — двудольного графа, так и во втором).

Тут для уточнения нужно или вводить кратность рёбер, или вес — и требовать, чтобы ток денежного эквивалента по контуру был одинаков во всех рёбрах, а сумма токов через ребро равнялась весу этого ребра.
Здравствуйте, ТОЭ и законы Кирхгофа!

Кстати, а может, действительно можно припахать электротехнику?

Очевидно, что задача имеет решение только тогда, когда сумма токов каждого товара равна нулю (сумма предложений равна сумме заявок).
Иначе бартер не состоится.

Ну а раз такая пьянка, то мне начинает казаться, что решения всегда есть, и задача уточняется до поиска кратчайших циклов, а не до поиска любых циклов.

Резисторы?
Точно! Каждое ребро представляет резистор и источник тока.
... << RSDN@Home 1.2.0 alpha 4 rev. 1181>>
Перекуём баги на фичи!
Re[4]: целевой перебор вариантов
От: nvoynov Украина http://nvoynov.blogspot.com
Дата: 29.04.09 10:30
Оценка:
Здравствуйте, Кодт, Вы писали:

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

К>Это может означать, что
К>- нужно удовлетворить все заявки (т.е. мы разбиваем граф на циклы, разбивая множество рёбер-заявок)
К>- нужно удовлетворить ровно одну заявку (т.е. мы разбиваем множество вершин-агентов)
К>- нужно удовлетворить хотя бы одну заявку агента, чтобы он "имел навар с яиц" (т.е. мы не разбиваем, а покрываем множество вершин-агентов)

К>А возможно, что условия задачи провозглашают, что у агента ровно одна заявка и ровно одно предложение.

К>В таком случае заявка-агент-предложение является ребром.
К>И тогда у нас получается просто орграф из вершин-товаров и рёбер-агентов.
К>И мы разбиваем его на циклы, разбивая (или покрывая) множество рёбер.

Сразу пост не переварил и буду еще сегодня курить ...

Условия задачи вообще тоже в процессе разработки, озвучены заказчиком просто как "Бартер". Но пока выглядит так. Клиент размещает заявку в которой указывает что у него есть, на что он готов это поменять и на каких условиях (возможно как-то дальше будет преобразовываться в вес ребра). Если есть прямые предложения обмена шило-на-мыло, то пользователь может совершить операцию самостоятельно. Если прямых нету то включается брокер, который пытается совершить этот сложный обмен.

Пока не думал над множеством предложений от одного человека и рассматривал простой случай, который приведен в первом посте. Тогда для первого случая я построил граф товаров что-на-что меняется и получил цикл конфеты->сахар->масло.

В общем задача видится так
— клиент размещает предложения 1..* и потребности 1..*
— клиент обращается к агенту для того, чтобы агент помог совершить ему обмен (конечно только то что получится, т.е. есть в базе товар и сложные пути его обмена — циклы)
— агент при помощи системы ищет все возможные варианты и выбирает наиболее оптимальные, вернее системе помогает ему подобрать оптимальные варианты (различные условия доставки товара могут влиять на вес ребер обмена)

Пока покурив немного литературу нашел
— Иванов, Дискретная математика. Алгоритмы и программы.
На стр. 151 "Кратчайшие пути на графе" решается очень похожая задача, но пока не разобрался с другими путями кроме кратчайшего.

Покурю еще раз двудольный орграф и продолжение поста ...

Тут возникла мысль, видно что Вы разбираетесь в вопросе, я бы с удовольствием попробовал выбить у начальства средств и передать эту конкретную часть задачи (поиск возможных вариантов) Вам.
С уважением, Николай
Re[5]: целевой перебор вариантов
От: Кодт Россия  
Дата: 29.04.09 11:30
Оценка:
Здравствуйте, nvoynov, Вы писали:

N>Условия задачи вообще тоже в процессе разработки, озвучены заказчиком просто как "Бартер". Но пока выглядит так. Клиент размещает заявку в которой указывает что у него есть, на что он готов это поменять и на каких условиях (возможно как-то дальше будет преобразовываться в вес ребра). Если есть прямые предложения обмена шило-на-мыло, то пользователь может совершить операцию самостоятельно. Если прямых нету то включается брокер, который пытается совершить этот сложный обмен.


N>Пока не думал над множеством предложений от одного человека и рассматривал простой случай, который приведен в первом посте. Тогда для первого случая я построил граф товаров что-на-что меняется и получил цикл конфеты->сахар->масло.


N>В общем задача видится так

N>- клиент размещает предложения 1..* и потребности 1..*
N>- клиент обращается к агенту для того, чтобы агент помог совершить ему обмен (конечно только то что получится, т.е. есть в базе товар и сложные пути его обмена — циклы)
N>- агент при помощи системы ищет все возможные варианты и выбирает наиболее оптимальные, вернее системе помогает ему подобрать оптимальные варианты (различные условия доставки товара могут влиять на вес ребер обмена)


Тут нужно курить не в сторону теории графов, а в сторону практического смысла.
Пусть заказчик скажет, что он думает про такие ситуации:
1. Если удовлетворить клиента в данный момент в принципе невозможно, он остаётся на рынке и ждёт? или сваливает?
2. Если ждут несколько, и вдруг пришёл кто-то с товаром, который может замкнуть несколько разных цепочек (прямой обмен — частный случай) — какому варианту отдавать предпочтение?
— минимизировать длину цепочки (предпочитать прямой обмен)
— удовлетворить наиболее долго ждущих
А что, если одна цепочка состоит из ждущего год и ждущего день, а вторая — из ждущего 9 месяцев и ждущего 3 месяца? И длина одинаковая, и суммарное ожидание одинаковое... Что делать?

Брокеру, кстати, выгодно иметь дело с наиболее длинными цепочками: комиссионные больше

А чтобы курить практический смысл, нужно немножко отвлечься от абстрактной постановки вопроса и озвучить реальную.
На товарной бирже ситуация одна, в агентстве недвижимости другая, в игрушке-стратегии-квесте третья...

Зачем вообще потребовалось автоматизировать разруливание цепочек? Правда ли, что такой большой поток заявок, что обычные люди не справляются? Или просто понты мечут, захотели внедрить передовые технологии в купипродайную лавку?



N>Тут возникла мысль, видно что Вы разбираетесь в вопросе, я бы с удовольствием попробовал выбить у начальства средств и передать эту конкретную часть задачи (поиск возможных вариантов) Вам.


Пожалуй, откажусь!
Мои познания в теории графов невелики и отрывочны, больше из любопытства.
... << RSDN@Home 1.2.0 alpha 4 rev. 1181>>
Перекуём баги на фичи!
Re[6]: целевой перебор вариантов
От: nvoynov Украина http://nvoynov.blogspot.com
Дата: 29.04.09 11:57
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Тут нужно курить не в сторону теории графов, а в сторону практического смысла.

К>Пусть заказчик скажет, что он думает про такие ситуации:
К>1. Если удовлетворить клиента в данный момент в принципе невозможно, он остаётся на рынке и ждёт? или сваливает?

Клиент просто попросил брокера выполнить обмен, у заявки должен быть "срок годности". Если возможности в этом конкретном месте нету, нет возможных цепочек, то их просто нету. Если появятся до окончания срока годности то работа может быть продолжена. По идее у брокера лежат заявки и система по какому-то расписанию пересчитывает варианты

К>2. Если ждут несколько, и вдруг пришёл кто-то с товаром, который может замкнуть несколько разных цепочек (прямой обмен — частный случай) — какому варианту отдавать предпочтение?

К>- минимизировать длину цепочки (предпочитать прямой обмен)
К>- удовлетворить наиболее долго ждущих
К>А что, если одна цепочка состоит из ждущего год и ждущего день, а вторая — из ждущего 9 месяцев и ждущего 3 месяца? И длина одинаковая, и суммарное ожидание одинаковое... Что делать?

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

К>А чтобы курить практический смысл, нужно немножко отвлечься от абстрактной постановки вопроса и озвучить реальную.

К>На товарной бирже ситуация одна, в агентстве недвижимости другая, в игрушке-стратегии-квесте третья...

К>Зачем вообще потребовалось автоматизировать разруливание цепочек? Правда ли, что такой большой поток заявок, что обычные люди не справляются? Или просто понты мечут, захотели внедрить передовые технологии в купипродайную лавку?


Да нету никакого потока заявок, и пока играемся с абстрактными примерами. Но вообще вроде красиво выходит .. клиент подал заявок/предложений и тут же получил возможные сейчас варианты, либо их сразу получил брокер и предложил услуги.
С уважением, Николай
Re[7]: целевой перебор вариантов
От: Кодт Россия  
Дата: 29.04.09 13:31
Оценка:
Здравствуйте, nvoynov, Вы писали:

<>

Ну в таком простом случае, действительно — поиск кратчайшего цикла либо поиск всех циклов через данную вершину двудольного орграфа.
(Или с участием данного ребра в графе товаров, если клиент представлен ребром "отдам А строго за Б").

Тупейшие волновые алгоритмы спасут отца русской демократии.

Правда, ты можешь поймать комбинаторный взрыв количества циклов, если граф имеет, например, такой вид
      +- Б1 -+     +- Г1 -+
      |      |     |      |
+- A ->- Б2 ->- В ->- Г2 ->- Д - ... -+
|     |      |     |      |           |
|     +- Б3 -+     +- Г3 -+           |
|                                     |
+------------------------------- ... -+

А-Б1-В-Г1-Д-...-А
А-Б2-В-Г1-Д-...-А
А-Б3-В-Г1-Д-...-А
А-Б1-В-Г2-Д-...-А
А-Б2-В-Г2-Д-...-А
А-Б3-В-Г2-Д-...-А
А-Б1-В-Г3-Д-...-А
А-Б2-В-Г3-Д-...-А
А-Б3-В-Г3-Д-...-А
...
Удовлетворит ли заказчика эта простыня, или наоборот, ввергнет в печаль?
... << RSDN@Home 1.2.0 alpha 4 rev. 1181>>
Перекуём баги на фичи!
Re: целевой перебор вариантов
От: Буравчик Россия  
Дата: 29.04.09 14:25
Оценка:
Здравствуйте, nvoynov, Вы писали:

N>* Поиск многоуровневых сделок (участвует более двух участников). Например,

N>- Васе нужен Сахар и у него есть Конфеты;
N>- у Пети есть сахар, но ему нужно Масло;
N>- у Маши есть Масло и ей нужны Конфеты.

N>Подскажите пожалуйста, есть ли какие стандартные алгоритмы для решения подобных задач?


Есть — динамическое программирование.

Будем считать, что у Васи что-то есть если он имеет это изначально или может получить в результате обмена. На каждом шаге пытаемся обменять имеющееся на что-нибидь новое. Затем добавим это новое в список имеющегося (и запомним с кем мы менялись). Будем повторять шаги пока список имеющегося перестанет увеличиваться. В конце концов получится список всего, что можно получить с помощью обмена. А запомненная информация об участниках бартера позволит восстановить цепочку обмена.

Например:
Кто   Есть     Надо
Вася  Конфеты  Сахар
Маша  Масло    Конфеты
Миша  Масло    Конфеты
Петя  Сахар    Масло
Вова  Соль     Масло
Гоша  Соль     Конфеты
Света Сахар    Орехи


1. Вася имеет [Конфеты]. Ищем кому нужны конфеты. Значит можно получить [Масло (Маша), Масло (Миша), Соль (Гоша)]
2. Вася "имеет" [Конфеты, Масло (Маша), Масло (Миша), Соль (Гоша)]. Ищем кому нужно масло и соль. Нашли [Сахар (Петя), Соль (Вова)]
3. Вася "имеет" [Конфеты, Масло (Маша), Сахар (Петя, Маша), Сахар (Петя, Миша), Соль (Гоша), Соль (Вова, Маша), Соль (Вова, Миша)]. Кому надо сахар и соль? Нет таких.

Отбираем Сахар: (Петя, Маша), (Петя, Миша)

P.S. Алгоритм нужен для "бартерного" сайта?
... << RSDN@Home 1.2.0 alpha 4 rev. 1136>>
Best regards, Буравчик
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.