Транспортная задача по критерию времени

Автор работы: Пользователь скрыл имя, 19 Января 2012 в 20:21, курсовая работа

Краткое описание

Имеется m пунктов отправления, в каждом из которых сосредоточено
определенное количество единиц однородного продукта, предназначенного к
отправке: в первом пункте имеется a1 единиц этого продукта, во втором - a2
единиц, в i− м пункте ai единиц, и, наконец, в m− м пункте am единиц
продукта. Этот продукт следует доставить в n пунктов назначения
(потребления), причем в первый пункт назначения следует доставить b1 единиц
продукта, во второй - b2 единиц, в j− й пункт b j единиц, и, наконец, в n− й
пункт bn единиц продукта.

Содержание работы

1.Постановка задачи........................................................................................3
2.Обоснование математической модели.......................................................4
3.Краткие сведения о методе решения задачи..............................................5
3.1.Метод северо-западного угла...................................................................5
3.2.Метод потенциалов...................................................................................6
3.3.Вариант метода потенциалов, при дополнительных условиях,
вводимых последовательно в процессе решения задачи.........................................8
4.Проверка достоверности полученных результатов..................................9
5.Алгоритм решения задачи.........................................................................10
6.Листинг фрагмента программы, реализующего алгоритм решения
задачи.........................................................................................................................11
7.Руководство пользователя.........................................................................19
7.1.Системные требования...........................................................................19
7.2.Описание возможностей.........................................................................19
7.3.Основное окно программы.....................................................................20
7.4.Главное меню программы......................................................................20
7.5.Использование.........................................................................................21
7.5.1.Ввод данных и результаты работы.....................................................21
7.5.2.Использование инженерного режима.................................................24
8.Решение задачи курсовой работы на ПЭВМ по исходным данным
индивидуального варианта.......................................................................................25
9.Список использованной литературы........................................................28

Содержимое работы - 1 файл

транспотрная задача - КР.doc

— 233.00 Кб (Скачать файл)

В общем случае проверка результатов, полученных после  выполнения

очередной итерации, осуществляется следующим образом:

1) вычисляются  значения Lk1

1 =Lkk1k1 и Lk1

2 =Σ

i=1

m

Σj

=1

n

cijxij

k1 ,

где Lk1

1 , Lk1

2 - значения целевой функции на текущей итерации,

вычисленные разными  способами;

Lk - значение целевой функции на предыдущей итерации

итерации;

k1 - количество товара разгружаемой перевозки;

k1 - минимальное отрицательное значение матрицы Ck1 ;

xij

k1 - элементы плана перевозок, полученного на текущей итерации;

сij - элементы матрицы материальных затрат (временных).

2) Если Lk1

1 =Lk1

2 , то программа приступает к выполнению

следующей итерации. В противном случае программа  выдает сообщение об

ошибке.

Также в программе  есть «инженерный режим», используя  который можно

посмотреть  результаты вычислений после каждой итерации.

9

5. Алгоритм решения  задачи.

1. Проверка  выполнения условия баланса.

2. Если условие  баланса не выполняется, то  вводим фиктивный пункт

потребления или  производства.

3. Построение  опорного плана.

4. Устранение  вырожденности в полученном опорном плане.

5. Поиск наибольшего  времени перевозок среди существующих  в

опорном плане.

6. Блокировка  элементов матрицы временных  затрат, которые больше

максимального времени перевозок, найденного на 4-м  или 10-м этапе.

7. Вычисление  потенциалов.

8. Вычисление оценочной матрицы.

9. Построение  нового плана по полученной  оценочной матрице. Во время

построения  также осуществляется проверка на вырожденность  получаемого

плана.

10. Выполнение  следующих итераций метода потенциалов.  Получение

оптимального  плана.

11. Если в  полученном решении существуют  перевозки на

заблокированных на 5-м этапе местах, то происходит переход к 11 этапу. Иначе

осуществляется  поиск наибольшего времени среди  существующих в

полученном  плане перевозок и переход  к 5-му этапу.

12. Полученный план дооптимизируется по критерию стоимости.

10

6. Листинг фрагмента  программы, реализующего  алгоритм решения

задачи

module Prog where

import GHC.Ptr

import Maybe

import BaseOperations

import Foreign.C

import Foreign.Marshal.Array

foreign export ccall "getplan" getPlan :: CInt → CInt → CInt → Ptr CInt → IO

(Ptr CFloat)

getPlan :: CInt → CInt → CInt → Ptr CInt → IO (Ptr CFloat)

getPlan rC cC eC ptr

= do

aData ← peekArray (fromIntegral eC) ptr

let rCount = fromIntegral rC

cCount = fromIntegral cC

cData = map fromIntegral aData

a = take rCount cData

b = take cCount ◊ drop rCount cData

tT = take (rCount*cCount) ◊ drop (rCount+cCount) cData

cT = drop (rCount*cCount+rCount+cCount) cData

t = [[ tT !! (i*cCount + j) |

j ← [0cCount-1] ] |

i ← [0rCount-1] ]

c = [[ cT !! (i*cCount + j) |

j ← [0cCount-1] ] |

i ← [0rCount-1] ]

-- Проверка баланса и добавление фиктивного пункта

mx = checkForClosing a b

aV = getAddedVector a b

mColCount = if aV ≡ 2

then (cCount + 1)

else cCount

mRowCount = if aV ≡ 1

then (rCount + 1)

else rCount

-- Строим опорнный план

basePlan = northWesternCorner (fst mx) (snd mx) 1

prd = 2 * sum [ t !! i !! j | i ← [0rCount-1], j ← [0cCount-1]]

maxi = maximum [ t !! i !! j |

i ← [0rCount-1], j ← [0cCount-1], (basePlan !! (i*cCount + j))

≠ 0]

-- Избавляемся от вырожденности.

lNDPlan = makeNonDegeneratePlan basePlan mColCount

-- Находим оптимальный план по критерию времени.

ans = addConditions lNDPlan t mRowCount mColCount rCount cCount aV maxi

[]

optimPlan = last ◊ fst ◊ fst ◊ last ◊ init ans

-- Находим максимальноое время перевозки

maxT = maximum [ t !! ((fst ◊ fst el) - 1) !! ((snd ◊ fst el) - 1)|

el ← optimPlan,

(snd el ≥ 0.9) &&

(((aV ≡ 1 ) ((fst ◊ fst el) ≠ mRowCount)) ||

((aV ≡ 2 ) ((snd ◊ fst el) ≠ mColCount)) ||

(aV ≡ 3 )) ]

cM = 2 * sum [ c !! i !! j | i ← [0rCount-1], j ← [0cCount-1]]

-- Блокируем

c1 = [[(case aV of

1 → if i ≡ mRowCount - 1

then cM

else (if (t !! i !! j) > maxT

11

then cM

else c !! i !! j)

2 → if j ≡ mColCount - 1

then cM

else (if (t !! i !! j) > maxT

then cM

else (c !! i !! j))

3 → (if (t !! i !! j) > maxT

then cM

else (c !! i !! j))) |

j ← [0mColCount-1] ] |

i ← [0mRowCount-1] ]

nonDPlan = listToArrayList lNDPlan mColCount

-- Потенциалы и оценочная матрица

rt = potentials c1 (map snd optimPlan) ([(0,0)],[])

c0 = [[ (c1 !! i !! j) - ((fromJust ◊ lookup j ◊ snd rt) - (fromJust ◊

lookup i ◊ fst rt)) |

j ← [0mColCount-1] ] |

i ← [0mRowCount-1] ]

fstSum = sum ◊ zipWith (*) (mkNonClsdPlan optimPlan mColCount aV) ◊

concat c

-- Находим план, дооптимизированный по стоимости.

pl = if null [ minimum i | i ← c0, (minimum i) < 0 ]

then (([optimPlan,optimPlan], [c1,c0]),([maxT,maxT],[fstSum,fstSum])

)

else

let newStepsPlan = fst ◊ mkNewPlan c0 optimPlan mRowCount mColCount

sndSum = sum ◊ zipWith (*) (mkNonClsdPlan newStepsPlan mColCount

aV) ◊ concat c

maximm = maximum [ t !! i !! j |

i ← [0rCount-1], j ← [0cCount-1],

(snd (newStepsPlan !! (i*cCount + j))) ≠ 0]

in (potentialsMethod t (mkNonClsdPlan2 c1 aV) ([maxT,maxT,maximm],

[fstSum,sndSum,sndSum])

mColCount aV False [optimPlan,optimPlan,newStepsPlan]

[c1,c0])

parameters = [mRowCount, mColCount, 1 + length ans] [ length ◊ fst ◊

fst el | el ← ans ]

[fromIntegral ◊ length ◊ fst ◊ fst pl]

pr ← newArray ([ fromIntegral i | i ← parameters ]

(concat [[ fromRational ◊ toRational el |

el ← map snd (concat ◊ fst ◊ fst et)] ++

(map fromIntegral ◊ concat ◊ concat ◊ snd ◊ fst et) |

et ← ans])

( [ fromRational ◊ toRational el |

el ← map snd (concat ◊ fst ◊ fst pl)] ++

(map fromIntegral ◊ concat ◊ concat ◊ snd ◊ fst pl))

---et ← ans])

(map fromIntegral ◊ concat [fst ◊ snd et | et ← ans])

(map fromIntegral ◊ concat [snd ◊ snd et | et ← ans])

(map fromIntegral ◊ fst ◊ snd pl)

(map fromIntegral ◊ snd ◊ snd pl))

return pr

module BaseOperations where

import List

import Maybe

type Plan = [((Int, Int), Float)]

type Ansset = (([Plan],[[[Int]]]),([Int],[Int]))

addConditions :: [Float] → [[Int]] → Int → Int → Int → Int → Int → Int →

[Ansset] → [Ansset]

addConditions plan t mRC mCC rC cC aV maxi dec = (

12

-- blok - Значение, которым будем блокировать перевозки.

let blok = 5 * sum [ t !! i !! j | i ← [0rC-1], j ← [0cC-1]]

Информация о работе Транспортная задача по критерию времени