Алгоритм расчета наиболее энергоэффективной сети ad-hoc

У меня есть (теоретическая) сеть с N узлами, каждая со своим фиксированным местоположением. Каждый node отправляет одно сообщение за такт, которое должно доходить до корня либо напрямую, либо через другие узлы.

Стоимость передачи сообщения от node A до node B - это расстояние между ними в квадрате.

Задача состоит в том, как связать эти узлы в формате дерева, чтобы создать наиболее энергоэффективную сеть.

например. Вот два возможных способа связывания этих узлов, причем левый более энергоэффективен.

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

Изменить: Еще один аспект сети, о котором я забыл упомянуть, заключается в том, что каждый node имеет питание от аккумулятора. Поэтому, если у нас слишком много сообщений, которые маршрутизируются через один и тот же node, тогда батарея node истощается, что приведет к сбою сети. Энергоэффективность сети измеряется тем, сколько сообщений может быть успешно передано от каждого node до корня до того, как какой-либо из node исчерпает батарею.

Редактировать # 2: Прошу прощения за исключение в исходном тексте вопроса. Столько же, что и раньше, некоторые из ваших более ранних ответов не совсем то, что я ищу, но я не был знаком с алгоритмами MST, поэтому спасибо, что рассказали мне о них.

В надежде сделать вещи яснее, позвольте мне добавить это:

Все узлы отправляют по одному сообщению за каждый цикл, включая внутренние узлы. Внутренние узлы также отвечают за передачу любых сообщений, которые они получают. Это добавляет напряжения на их батарею, если они отправляют дополнительное сообщение самостоятельно. Цель состоит в том, чтобы максимально увеличить количество циклов до того, как разрядится батарея node.

Ответ 1

Без учета минимизации батарей, вы ищете кратчайшее связующее дерево, которое похоже на Минимальное связующее дерево, за исключением другой функции "затраты". (Вы можете просто запустить Dijkstra Algorithm для вычисления кратчайшего связующего дерева, поскольку стоимость всегда будет положительной.)

Это не учитывает минимизацию батареи. В этом случае (и я не совсем уверен, что именно вы пытаетесь свести к минимуму), вы можете захотеть заглянуть в Min-cost max поток. Тем не менее, это позволит сначала оптимизировать (максимизировать) "поток", прежде чем минимизировать затраты. Это может быть или не быть идеальным.

Чтобы создать ограничение вершин (каждый node может работать только с сообщениями k), вам просто нужно создать второй график G_1, где вы добавляете дополнительную вершину u_i для каждого v_i - и имея поток v_i to u_i будет любым вашим ограничением, в данном случае k+1, со стоимостью 0. Поэтому, если в исходном графе G есть ребро (a,b), то в G_1 для каждого из этих ребер будет ребро (u_a,v_b). По сути, вы создаете второй слой вершин, который ограничивает поток до k. (Особый случай для корня, если вы также не хотите ограничения сообщения для корня.)

Стандартное решение максимального потока на G_1 должно быть достаточным - источник, который указывает на каждую вершину с потоком 1, и раковину, которая связана с корнем. Существует решение для G_1 (меняется на k), если максимальный поток G_1 равен N, число вершин.

Ответ 2

Я бы подумал, что вы можете построить полный граф, а затем использовать алгоритм кратчайшего пути Dijkstra на каждом node, чтобы найти наименьшую стоимость маршрут для этого node. Объединение этих путей должно формировать минимальное дерево затрат.

Заметим, что с помощью алгоритма Дейкстры также можно вычислить все дерево за один проход.

Ответ 3

Это не просто минимальное остовное дерево, потому что вес каждого ребра зависит от веса других ребер. Кроме того, вам не нужно минимизировать сумму весов, но максимальный вес на одном node, который является весом его выходного края, умноженным на количество входящих ребер плюс один.

Каждый node должен будет передавать несколько сообщений, но если вы отправляете сообщения из внешних узлов через внутренние узлы, внутренние узлы будут передавать большее количество сообщений. Чтобы уравнять разрядку батареи по всем узлам, внутренним узлам придется использовать гораздо более короткие соединения, чем внешние узлы; Я подозреваю, что эта зависимость от расстояния от корня экспоненциальна.

В ваших примерах не так ясно, является ли левый более эффективным с помощью меры, которую вы дали (максимальное количество сообщений), потому что, в то время как node at (1,2) имеет меньшее потребление энергии, один на (0,1) удваивает свой выход.

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

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

Детерминированный метод, возможно, попытается найти улучшение для текущего худшего node, так что новые весы node меньше текущего максимального веса node. Трудно сделать это таким образом, чтобы результатом был глобальный оптимум.

Имитированный отжиг будет означать изменение целых цепей узлов на каждом шаге, но этому может мешать тот факт, что "доброта" конфигурации определяется ее наихудшим node. Вам нужно будет убедиться, что худшее node достаточно часто затрагивается у детей-кандидатов, что может быть затруднено, когда температура падает.

В генетическом алгоритме вы должны создать "геном" как отображение каждого node в его цель node. Точечная мутация будет состоять в изменении одной цели node на случайный node (но следует учитывать только корень и узлы, которые ближе, чем корень).

Ответ 4

Вы можете попытаться сформулировать проблему как проблему с максимальным потоком с минимальными затратами. Просто некоторые идеи:

Создайте дополнительный фиктивный элемент node в качестве источника и соедините края нулевой стоимости и емкости 1 с этим node с каждым не-root node. Затем установите корень в раковине и установите все затраты по фронту, как вы хотите (квадрат евклидова расстояния в этом случае).

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

Ответ 5

Мне интересно, используете ли вы динамическую беспроводную сенсорную сеть (например, из датчиков Telos)? Если это так, вы захотите разработать распределенный протокол минимального расстояния, а не нечто более монолитное, как Dijkstra.

Я считаю, что вы можете использовать некоторые принципы из протокола AHODV (http://moment.cs.ucsb.edu/AODV/aodv.html), но имейте в виду, что вам нужно будет что-то увеличит метрику. Счет хопа имеет много общего с потреблением энергии, но в то же время вам нужно иметь в виду, сколько энергии используется для передачи сообщения. Возможно, начало метрики может быть суммой всех мощностей в каждом node на заданном пути. Когда ваш код устанавливает вашу сеть вверх, вы просто отслеживаете стоимость пути для данного "направления" маршрутизации и позволяете вашему распределенному протоколу делать остальное на каждом node.

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

Ответ 6

Считаете ли вы использование ориентированного ациклического графа вместо дерева? Другими словами, каждый node имеет несколько "родителей", на которые он может отправлять сообщения, - ациклическое требование гарантирует, что все сообщения в конечном итоге прибудут. Я спрашиваю, потому что это похоже на то, что у вас есть беспроводная сеть, и потому, что есть эффективный подход к вычислению оптимального решения.

Подход - это линейное программирование. Пусть r - индекс корня node. Для узлов i, j пусть cij - стоимость энергии отправки сообщения от я до j. Пусть xij - переменная, которая будет представлять количество сообщений, отправленных node я в node j на каждом временном шаге. Пусть z - переменная, которая будет представлять максимальную скорость потребления энергии на каждом node.

Линейная программа

minimize z
subject to
# the right hand side is the rate of energy consumption by i
(for all i) z >= sum over all j of cij * xij
# every node other than the root sends one more message than it receives
(for all i != r) sum over all j of xij == 1 + sum over all j of xji
# every link has nonnegative utilization
(for all i, j) xij >= 0

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

Есть несколько особенностей LP, о которых стоит упомянуть. Во-первых, может показаться странным, что мы не "принудительные" сообщения переходим к корню. Оказывается, что, пока константы cij положительны, он просто тратит энергию на отправку сообщений в циклах, поэтому нет смысла. Это также гарантирует, что построенный нами ориентированный граф является ациклическим.

Во-вторых, переменные xij обычно не целые. Как отправить половину сообщения? Одним из возможных решений является рандомизация: если M - общая скорость сообщений, отправленных node i, то node я отправляет каждое сообщение в node j с вероятностью xij/M. Это гарантирует, что средние значения будут работать со временем. Другой альтернативой является использование какой-то взвешенной циклической схемы.