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

Автор работы: Пользователь скрыл имя, 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 Кб (Скачать файл)

-- Образуем список из ненулевых элементов текущей строки, и

проверяем его длину.

(if (length [ plan !! ((counter-1)*colCount + m) |

m ← [0colCount-1],

let curRow = rowMass !! (counter-1),

let curCol = colMass !! m,

((fromJust ◊ lookup (curRow, curCol) plan) ≠ 0) ||

((curRow ≡ i ) (curCol ≡ j))]) > 1

then findCycle i j colCount (counter + 1) plan

-- Если в строке не больше одного ненулевего элемента, то

удаляем строку.

else findCycle i j colCount 1 [ plan !! ((n-1)*colCount + (m-1))

|

n ← [1rowCount],

m ← [1colCount],

n ≠ counter])

else

-- Образуем список из ненулевых элементов текущего столбца, и

проверяем его длину.

(if (length [ plan !! (n*colCount + (counter - rowCount) - 1)

|

n ← [0rowCount-1],

let curRow = rowMass !! n,

let curCol = colMass !! (counter - rowCount - 1) ,

((fromJust ◊ lookup (curRow, curCol) plan) ≠ 0) ||

((curRow ≡ i) (curCol ≡ j))]) > 1

then findCycle i j colCount (counter + 1) plan

-- Если в солбце не больше одного ненулевего элемента, то

удаляем столбец.

else findCycle i j (colCount - 1) 1 [ plan !! ((n-1)*colCount +

(m-1)) |

n ← [1rowCount],

m ← [1colCount],

m ≠ (counter - rowCount)]))

listToArrayList :: [a] → Int → [((Int, Int), a)]

listToArrayList t colCount = [((i, j), (t !!((i-1)*colCount + j - 1))) |

i ← [1((length t) `div` colCount)], j ← [1colCount]]

16

-- | Функция рассчитывает потенциалы для опорного плана basePlan и матрицы

временных затрат t.

-- Возвращает пару списков: первый содержит вектор U, второй - V.

potentials :: [[Int]] → [Float] → ([(Int, Int)], [(Int, Int)]) → ([(Int,

Int)], [(Int, Int)])

potentials t basePlan pt =

let rC = (length t)

cC = (length ◊ head t)

in if ((length ◊ fst pt) ≥ rC) ((length ◊ snd pt) ≥ cC)

then pt

else potentials t basePlan

((fst pt) [(n, (snd el) - t !! n !! (fst el) ) |

el ← snd pt,

n ← [0rC-1],

((last ◊ take ((fst el)+1) ◊ drop (n*cC) basePlan) ≠ 0.0)

((lookup n ◊ fst pt) ≡ Nothing) ],

(snd pt) [(m, (snd el) + t !! (fst el) !! m) |

m ← [0cC-1],

el ← fst pt,

((last ◊ take (m+1) ◊ drop ((fst el)*cC) basePlan) ≠ 0.0)

((lookup m ◊ snd pt) ≡ Nothing) ])

-- | Функция проверяет модель и (если нужно) добавляет фиктивный пункт

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

checkForClosing :: [Int] → [Int] → ([Int], [Int])

checkForClosing _ [] = error "checkForClosing: Can't process an empty list!"

checkForClosing [] _ = error "checkForClosing: Can't process an empty list!"

checkForClosing a b

| (sum a) ≡ (sum b) = (a, b)

| (sum a) > (sum b) = (a, b [sum a - sum b])

| otherwise = (a [sum b - sum a], b)

getAddedVector :: [Int] → [Int] → Int

getAddedVector _ [] = error "getAddedVector: Can't process an empty list!"

getAddedVector [] _ = error "getAddedVector: Can't process an empty list!"

getAddedVector a b

| (sum a) < (sum b) = 1

| (sum a) > (sum b) = 2

| otherwise = 3

-- | Функция, реализующая метод северозападного угла, для построения опорного

плана.

northWesternCorner :: [Int] → [Int] → Int → [Int]

northWesternCorner [] _ _ = error "northWesternCorner: Can't process an empty

list!"

northWesternCorner _ [] _ = error "northWesternCorner: Can't process an empty

list!"

northWesternCorner a b c

| c > ((length a) * (length b)) = []

| otherwise = [me] northWesternCorner

((take ((c - 1) `div` (length b)) a) [ca - me] (drop (((c - 1)

`div` (length b)) + 1) a))

((take ((c - 1) `mod` (length b)) b) [cb - me] (drop (((c - 1)

`mod` (length b)) + 1) b))

(c + 1)

where

ca = a !! ((c - 1) `div` (length b))

cb = b !! ((c - 1) `mod` (length b))

me = min ca cb

-- | Функция, преобразующая вырожденный план в невырожденный.

makeNonDegeneratePlan :: [Int] → Int → [Float]

makeNonDegeneratePlan basePlan cC = [

if (i < ((length basePlan) `div` cC) - 1) (j > 0) &&

((basePlan !! (i*cC + j)) ≡ 0) ((basePlan !! ((i + 1)*cC + (j - 1))) ≡

0) &&

((basePlan !! (i*cC + (j - 1))) ≠ 0) ((basePlan !! ((i + 1)*cC + j)) ≠

0)

17

then 0.000001

else fromInteger ◊ toInteger (basePlan !! (i*cC + j)) |

i ← [0((length basePlan) `div` cC)-1], j ← [0cC-1] ]

-- | Функция, строящая цепочку из элементов подматрицы текущего плана, которая

содержит цикл.

--

getCycle :: Int -- ↑ i - строка элемента, вводимого в цепочку

→ Int -- ↑ j - столбец элемента, вводимого в цепочку

→ Int -- ↑ сС - количество столбцов подматрицы

→ [((Int, Int), Float)] -- ↑ cycle - подматрица, содержащая цикл

→ [((Int, Int), Float)] -- ↑ возвращается цепочка из не

использованных на текущей

-- и предыдущих итерациях положительных

элементов

getCycle i j cC cycle =

let rC = ((length cycle) `div` cC) - 1

-- Ниже обнуляем текущий элемент цепочки в подматрице (чтобы не обращать больше

на него внимания).

mCycle = [ (if (i ≠ n+1) (j ≠ m+1)

then cycle !! (n*cC + m)

else (fst (cycle !! (n*cC + m)), 0.0)) |

n ← [0rC], m ← [0cC-1]]

-- Ищем индекс ненулевого элемента в той же строке, в которой находится вводимый

в цепочку элемент.

id = (findIndex (>0) [ snd (mCycle !! ((i-1)*cC + m)) | m ← [0cC-

1] ])

-- Проверка на отсутствие элементов, который можно ввести в цепочку

in if (length ◊ filter (>0) ◊ snd ◊ unzip mCycle) ≡ 0

then [cycle !! ((i-1)*cC + j - 1)]

else (if id ≠ Nothing

then [cycle !! ((i-1)*cC + j - 1)] (getCycle i ((fromJust id)+1)

cC mCycle)

else let idi = findIndex (>0) [ snd (mCycle !! (n*cC + j-1)) | n ←

[0rC]]

in if idi ≠ Nothing

then ([cycle !! ((i-1)*cC + j-1)] (getCycle ((fromJust idi)

+1) j cC mCycle))

else error "getCycle: no non-zero elements in this row or

coloumn!")

18

7. Руководство пользователя

7.1. Системные требования

Процессор: Pentium I или аналогичный AMD, 400 MHz и выше.

ОЗУ: 64 Мб и более.

ОС: Windows 98, 2000, ХР.

7.2. Описание возможностей

Данная программа  предназначена для решения транспортной задачи по

критерию времени  вариантом метода потенциалов, при  дополнительных

условиях, вводимых последовательно в процесс решения, а также

дооптимизации полученного решения по критерию стоимости.

Производится  оптимизация транспортных перевозок, тем самым

сокращаются время  перевозок и издержки.

В программе  есть "Инженерный" режим работы, с помощью которого

можно просмотреть  все этапы вычисления. Этот режим  предназначен для

специалистов  в данной области.

19

7.3. Основное окно программы

7.4. Главное меню программы

Главное меню программы  содержит пункты ォФайлサ, ォРежимサ,

ォПомощьサ.

В пункте ォФайлサ находится подпункт ォВыходサ, который используется

для завершения работы программы.

В пункте ォРежимサ находятся подпункты ォОбычныйサ и

ォИнженерныйサ.

20

ォОбычныйサ - основной режим, в котором представлены результаты

работы программы.

ォИнженерныйサ - режим проверки этапов вычисления. Предназначен для

специалистов.

В пункте ォПомощьサ находится подпункт ォО программеサ, при выборе

которого выводится  окно с информацией о программе.

7.5. Использование

Для начала работы с программой запустите файл program.exe.

7.5.1. Ввод данных и  результаты работы

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

Затем нажмите  кнопку «OK».

В следующем  окне укажите количество пунктов  потребления. Также

нажмите кнопку «ОК».

Затем перед  вами появится окно (см. рисунок ниже) ввода названий

пунктов производства и количества производимого ими продукта. Укажите

названия производителей и количество продукта, которое они  производят.

Затем нажмите  кнопку «Продолжить» в этом окне.

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

указать имена  потребителей и количество потребляемого ими продукта.

Нажмите кнопку «Продолжить».

21

Теперь Вы увидите  новое окно. Здесь нужно ввести в первой колонке

стоимость доставки от производителя, имя которого указано  вверху окна

программы, в  пункты потребления, которые указаны слева, а во второй колонке

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