public void ДобавитьПуть(int ostFrom, int ostTo, ПутьКорреспонденции новПуть) { ostFrom--; ostTo--; матрица[ostFrom, ostTo].пути.Add(новПуть); if (матрица[ostFrom, ostTo].ЛучшийКритерий > новПуть.Критерий) { матрица[ostFrom, ostTo].ЛучшийКритерий = новПуть.Критерий; } }
public void Инициализация(Маршрут[] масМаршрутов) { int count, ostFrom, ostTo; ПутьКорреспонденции новПуть; double sumcrit; for (int i_marsh = 0; i_marsh < масМаршрутов.Length; i_marsh++) { Маршрут marsh = масМаршрутов[i_marsh]; count = marsh.КоличОстановок - 1; int[] масКодОст = marsh.КодыОстановок; for (int i = 0; i < count; i++) { ostFrom = масКодОст[i] - 1; sumcrit = 0; for (int j = i + 1; j <= count; j++) { ostTo = масКодОст[j] - 1; sumcrit += marsh.ДлинаПерегона(j); новПуть = new ПутьКорреспонденции { КодМаршрута = marsh.Код, Критерий = sumcrit, ТипПутиКорресп = ТипПутиКорреспонденцииEnum.безПересадки }; матрица[ostFrom, ostTo].пути.Add(новПуть); if (матрица[ostFrom, ostTo].ЛучшийКритерий > sumcrit) { матрица[ostFrom, ostTo].ЛучшийКритерий = sumcrit; } } } } }
public int КодМаршрутаПослеПересадки;// только для проверки правильности расчета (в модели не используется) ////Public ПутьПослеПересадки As ПутьКорреспонденции public int CompareTo(object obj) { ПутьКорреспонденции pk = obj as ПутьКорреспонденции; return(Критерий.CompareTo(pk.Критерий)); }
public void УчетПересадок(Маршрут[] масМарш) { int countOst = матрица.GetLength(0);//Размерность - 1; //цикл по элементам матрицы корреспонденции - поиск недостижимой пары остановок for (int i_matr = 0; i_matr < countOst; i_matr++) { for (int j_matr = 0; j_matr < countOst; j_matr++) { if (i_matr == j_matr) { continue; } if (матрица[i_matr, j_matr].ЛучшийКритерий != ПутьКорреспонденции.БЕСКОНЕЧНОСТЬ) { if (матрица[i_matr, j_matr].пути[0].ТипПутиКорресп == ТипПутиКорреспонденцииEnum.безПересадки) { continue; } } //найдена недостижимая пара остановок (из i_matr в j_matr) // поиск маршрута начала (через i_matr) for (int i_mrsh = 0; i_mrsh < масМарш.Length; i_mrsh++) { int[] масКодОст = масМарш[i_mrsh].КодыОстановок; for (int i_ost = 0; i_ost < масКодОст.Length; i_ost++) { int code_i_ost = масКодОст[i_ost] - 1; //коды остановок идут с 1, поэтому -1 if (code_i_ost == i_matr) { //маршрут начала найден (i_mrsh) //перебор по остановкам после i_ost - можно с них добраться до j_matr for (int j_ost = i_ost + 1; j_ost < масКодОст.Length; j_ost++) { int code_j_ost = масКодОст[j_ost] - 1; if (i_ost == j_ost || матрица[code_j_ost, j_matr].ЛучшийКритерий == ПутьКорреспонденции.БЕСКОНЕЧНОСТЬ) { continue; } if (матрица[code_j_ost, j_matr].пути[0].ТипПутиКорресп == ТипПутиКорреспонденцииEnum.сПересадкой) { continue; } //найден маршрут с пересадкой в code_j_ost //формирование маршрута с пересадкой // перебор всех беспересадочных путей из ячейки (code_j_ost, j_matr) foreach (ПутьКорреспонденции путь2 in матрица[code_j_ost, j_matr].пути) { if (путь2.ТипПутиКорресп == ТипПутиКорреспонденцииEnum.сПересадкой) { break; } //найти критерий до остановки пересадки - перебор всех беспересадочных путей из ячейки (code_i_ost, code_j_ost) double crit_i = 0; int codeMarsh = масМарш[i_mrsh].Код; foreach (ПутьКорреспонденции путь1 in матрица[code_i_ost, code_j_ost].пути) { if (путь1.ТипПутиКорресп == ТипПутиКорреспонденцииEnum.безПересадки && путь1.КодМаршрута == codeMarsh) { crit_i = путь1.Критерий; break; } } //добавить новый маршрут с пересадкой ПутьКорреспонденции новПуть = new ПутьКорреспонденции { КодМаршрута = codeMarsh, КодОстановкиПересадки = code_j_ost + 1, КодМаршрутаПослеПересадки = путь2.КодМаршрута, Критерий = crit_i + путь2.Критерий, ТипПутиКорресп = ТипПутиКорреспонденцииEnum.сПересадкой }; матрица[i_matr, j_matr].пути.Add(новПуть); if (матрица[i_matr, j_matr].ЛучшийКритерий > новПуть.Критерий) { матрица[i_matr, j_matr].ЛучшийКритерий = новПуть.Критерий; } } break; //после первой остановки с пересадкой - перейти к следующему маршруту } break; //маршрут с i_ost = i_matr проверен } } } } СтрокаОтработана?.Invoke(this, new IntEventArg(i_matr)); } }