-- blok - Значение, которым будем блокировать перевозки.
let blok = 5 * sum [ t !! i !! j | i ← [0 rC-1], j ← [0 cC-1]] ‥ ‥
-- Блокируем в матрице временных затрат те элементы,
-- которые больше максимального времени перевозок, соответсвующего
опорному плану, или равны ему.
tBl = [[(case aV of
1 → (if (i ≡ mRC - 1) ((t !! i !! j) ≥ maxi) ∨
then blok
else t !! i !! j)
2 → (if (j ≡ mCC - 1) ((t !! i !! j) ≥ maxi) ∨
then blok
else (t !! i !! j))
3 → (if (t !! i !! j) ≥ maxi
then blok
else (t !! i !! j))) |
j ← [0 mCC-1] ] | ‥
i ← [0 mRC-1] ] ‥
--sumNew = sum ◊ zipWith (*) (map round plan) ◊ concat t
nonClosedModelTime = (case aV of
1 → listToArrayList (concat ◊ init tBl) mCC
2 → listToArrayList (concat ◊ [ init i | i ← tBl ]) (mCC-1)
3 → listToArrayList (concat ◊ tBl) mCC)
nonDPlan = listToArrayList plan mCC
-- Вычисляем потенциалы
pts = potentials tBl plan ([(0,0)],[])
-- Рассчитываем матрицу T1
t1 = [[ (tBl !! i !! j) - ((fromJust ◊ lookup j ◊ snd pts) - (fromJust
◊ lookup i ◊ fst pts)) |
j ← [0 mCC-1] ] | ‥
i ← [0 mRC-1] ] ‥
fstSum = sum ◊ zipWith (*) (mkNonClsdPlan nonDPlan mCC aV) ◊ concat t
-- Проверяем на наличие отрицательных элементов в T1
in if null [ minimum i | i ← t1, (minimum i) < 0 ]
then
-- Если нету, то выдаем ответ.
if null dec
then [(([nonDPlan,nonDPlan], [tBl,t1]), ([maxi,maxi],[fstSum,fstSum]))]
else dec {-++ [([nonDPlan], [t1 [[maxi]]])]-} ⊕
-- Иначе строим новый, улучшенный план.
else (let newStepsPlan = fst ◊ mkNewPlan t1 nonDPlan mRC mCC
-- После предварительного этапа и первой итерации приступаем к следующим
итеррациям и находим
-- оптимальный план при данных условиях.
planT = mkNonClsdPlan newStepsPlan mCC aV
maximm = maximum [ t !! i !! j |
i ← [0 rC-1], j ← [0 cC-1], (planT !! (i*cC + j)) ≠ 0] ‥ ‥
sndSum = sum ◊ zipWith (*) (mkNonClsdPlan newStepsPlan mCC aV) ◊
concat ◊ mkNonClsdPlan2 tBl aV
decision = potentialsMethod (mkNonClsdPlan2 tBl aV) []
([maxi,maxi,maximm],[fstSum,fstSum,sndSum]) mCC aV True
[nonDPlan, nonDPlan, newStepsPlan] [tBl, t1]
pl = last ◊ fst ◊ fst decision
-- Убираем из оптимального плана добавленную при переходе к закрытой модели
строку или столбец,
-- если модель была открытой.
newPlan = mkNonClsdPlan pl mCC aV
newPlan1 = mkNonClsdPlan1 pl mCC aV
in if or
[(fst el) `elem` (map fst ◊ filter ( λa → snd a≥ 0.9) newPlan1) |
el ← (filter (λa → snd a > (blok `div` 2)) nonClosedModelTime) ]
then dec [decision] ⊕
else addConditions plan t mRC mCC rC cC aV
(maximum [ t !! i !! j |
i ← [0 rC-1], j ← [0 cC-1], newPlan !! (i*cC + j) > 0 ]) ‥ ‥
(dec [decision]))) ⊕
mkNonClsdPlan :: Plan → Int → Int → [Int]
mkNonClsdPlan plan mCC addV =