Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  124

•  TDictionary Custom Sort  3 311

•  Fast Watermark Sources  3 060

•  3D Designer  4 817

•  Sik Screen Capture  3 313

•  Patch Maker  3 527

•  Айболит (remote control)  3 628

•  ListBox Drag & Drop  2 990

•  Доска для игры Реверси  81 531

•  Графические эффекты  3 921

•  Рисование по маске  3 226

•  Перетаскивание изображений  2 607

•  Canvas Drawing  2 731

•  Рисование Луны  2 555

•  Поворот изображения  2 162

•  Рисование стержней  2 160

•  Paint on Shape  1 564

•  Генератор кроссвордов  2 223

•  Головоломка Paletto  1 764

•  Теорема Монжа об окружностях  2 209

•  Пазл Numbrix  1 682

•  Заборы и коммивояжеры  2 052

•  Игра HIP  1 278

•  Игра Go (Го)  1 224

•  Симулятор лифта  1 470

•  Программа укладки плитки  1 214

•  Генератор лабиринта  1 542

•  Проверка числового ввода  1 350

•  HEX View  1 488

•  Физический маятник  1 355

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Поиск кратчайшего пути



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

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

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

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

procedure TForm1.Button1Click(Sender: TObject);
const
  N = 10; { кол-во вершин графа}
var
  map: array[1..N, 1..N] of integer;
  // Карта.map[i,j] не 0,если
  // точки i и j соединены

  road: array[1..N] of integer;
  // Дорога — номера точек карты

  incl: array[1..N] of boolean; // incl[1]равен TRUE,если точка
  // с номером i включена в road

  start, finish: integer;
  // Начальная и конечная точки

  found: boolean; len: integer; // длина найденного (минимального) маршрута
  c_len: integer; // длина текущего (формируемого) маршрута
  i, j: integer;

  // выбор очередной точки
  procedure step(s, f, p: integer);
  var
    с: integer; { Номер точки, в которую делаем очередной шаг }
    i: integer;
  begin
    if s = f then
    begin
      len := c_len; { сохраним длину найденного маршрута }
      { вывод найденного маршрута }
      for i := 1 to p - 1 do
        Label1.caption := Label1.caption + ' ' + IntToStr(road[i]);
      Label1.caption := Label1.caption
        + ', длина:' + IntToStr(len) + #13;
    end
    else
      { выбираем очередную точку }
      for c := l to N do { проверяем все вершины }
        if (map[s, c] <> 0) and (not incite])
          and ((len = 0) or (c_len + map[s, c] < len)) then
        begin
          // точка соединена с текущей, но не включена в маршрут
          roadtp] := c; { добавим вершину в путь }
          incl[c] := TRUE; { пометим вершину как включенную }
          c_len := c_len + map[s, с];
          step(c, f, p + l);
          incite := FALSE;
          roadtp := 0;
          c_len := c_len - map[s, с];
        end;
  end;
  { конец процедуры step }

begin
  Labell.caption := '';
  { инициализация массивов }
  for i: = 1 to N do
    road[i]: = 0;

  for i := l to N do
    incl[i] := FALSE;

  { ввод описания карты из SrtingGrid.Cells}
  for i := l to N do
    for j := 1 to N do
      if StringGridl.Cells[i, j] <> '' then
        mapti, j] := StrToInt(StringGridl.Cells[i, j])
      else
        mapti, j] := 0;

  len := 0; // длина найденного (минимального) маршрута
  len := 0, // длина текущего (формируемого) маршрута

  start := StrToInt(Edit1.text);
  finish := StrToInt(Edit2.text);

  road[1] := start; { внесем точку в маршрут }
  incl[start] := TRUE; { пометим ее как включенную }
  step(start, finish, 2); {ищем вторую точку маршрута }

  // проверим, найден ли хотя бы один путь
  if not found then
    Label1.caption := 'Указанные точки не соединены!';
end;

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





Похожие по теме исходники

Поисковик

Поиск символа

Поиск файлов

Поиск открытых файлов

 

Findup (поиск дублей)

Дейкстра: поиск кратчайшего пути

A Star (нахождение кратчайшего пути)

Нахождение кратчайшего пути

 



Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте