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

Студент: Наумов Дмитрий Кириллович

2022г.

Научный руководитель: Аксёнов В.Е

Учебная группа: M34351

Оглавление

  • Однопоточный алгоритм
  • Авторский алгоритм
  • Решённые проблемы
  • Корректность алгоритма
  • Актуальность
  • Обзор
  • Первые идеи алгоритма
  • Код
  • Future work

Однопоточный алгоритм

Операции:

  • getDistance(u)
  • setEdge(u, v, w)

Типы операций модификации:

  • инкрементальный
    • вес ребра увеличивается
    • исток ребра - родитель вершины в дереве кратчайших расстояний
  • декрементальный

Однопоточный алгоритм

Авторский алгоритм

  • Однопоточный алгоритм

  • Двухфазная блокировка

  • Помощь потоков

  • Координация потоков

Дедлок при тонкой блокировке

История значений

Проблема хранения расстояния

Проблема хранения расстояния

Проблема хранения расстояния

Линеаризуемость

1.	fun getDistance(index: Int): Double? {
2.	    val vertex = vertexes[index] ?: return null
3.	    return vertex.getDistance().distance
4.	}
5.	 
6.	fun getDistance(): Distance {
7.	    while (true) {
8.	        val curDescriptor = descriptor.value
9.	        val curStatus = curDescriptor.process.status.value
10.	        val curDistance = readActual(curDescriptor, curStatus)
11.	        if (descriptor.value === curDescriptor) {
12.	            return curDistance
13.	        }
14.	    }
15.	}

Линеаризуемость

fun setEdge(fromIndex: Int, toIndex: Int, newWeight: Double): Boolean {
    if (fromIndex == toIndex) return false
    val from = vertexes[fromIndex] ?: return false
    val to = vertexes[toIndex] ?: return false

    while (true) {
        val process = Process(priority, newWeight)
        process.from = from
        process.to = to

        process.help()

        if (process.status.value == Status.SUCCESS) {
            return true
        }
    }
}
Made with Slides.com