Транспортная задача

Автор: Пользователь скрыл имя, 08 Января 2013 в 11:42, курсовая работа

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

Описанная в курсовой работе транспортная задача и методы ее решения – только отдельный пример огромного множества задач линейного программирования. Цель транспортной задачи – разработка наиболее рациональных путей и способов транспортирования товаров, устранение чрезмерно дальних, встречных, повторных перевозок. Все это сокращает время продвижения товаров, уменьшает затрата предприятий, фирм, связанные с осуществлением процессов снабжения сырьем, материалами, топливом, оборудованием и т.д.

Оглавление

Описание методов решения транспортных задач 2
Аналитическое решение задачи 4
Ручной расчет 5
Заключение 7
Список литературы 8
Блок-схема решения задачи 9
Листинг программы 13
Инструкция пользователя 23
Контрольный тест программы 24

Файлы: 1 файл

Отчет Н К.doc

— 200.50 Кб (Скачать)

StringGrid1->Cells[5][0]="Запасы";

///////заполняем таблицу (Поставщики)

StringGrid1->Cells[0][1]="A1";

StringGrid1->Cells[0][2]="A2";

StringGrid1->Cells[0][3]="A3";

StringGrid1->Cells[0][4]="Потребн.";

///////заполняем таблицу значениями  по столбзам

///1

StringGrid1->Cells[1][1]=2;

StringGrid1->Cells[1][2]=5;

StringGrid1->Cells[1][3]=2;

///2

StringGrid1->Cells[2][1]=3;

StringGrid1->Cells[2][2]=3;

StringGrid1->Cells[2][3]=1;

///3

StringGrid1->Cells[3][1]=4;

StringGrid1->Cells[3][2]=1;

StringGrid1->Cells[3][3]=4;

///4

StringGrid1->Cells[4][1]=3;

StringGrid1->Cells[4][2]=3;

StringGrid1->Cells[4][3]=2;

/////////////заполняем значения  потребностей

StringGrid1->Cells[1][4]=140;

StringGrid1->Cells[2][4]=40;

StringGrid1->Cells[3][4]=60;

StringGrid1->Cells[4][4]=80;

/////////////заполняем значения запасов

StringGrid1->Cells[5][1]=180;

StringGrid1->Cells[5][2]=60;

StringGrid1->Cells[5][3]=80;

////////////////////////////////////////////////////////////

stb=0;str=0;

}

//---------------------------------------------------------------------------

 

void __fastcall Tmenu1::N2Click(TObject *Sender)

{

about1->ShowModal();

}

//---------------------------------------------------------------------------

void __fastcall Tmenu1::N1Click(TObject *Sender)

{

help->Show();

}

//---------------------------------------------------------------------------

 

 

 

void __fastcall Tmenu1::Button1Click(TObject *Sender)

{

x=StringGrid1->ColCount-1;

y=StringGrid1->RowCount-1;

for(i=0;i<x;i++) {

sevzap->StringGrid1->Cells[i][j]=StringGrid1->Cells[i][j];

                                     }

                                    i=0;

for(j=0;j<y;j++){

sevzap->StringGrid1->Cells[i][j]=StringGrid1->Cells[i][j];

                                    }

                                    j=0;

stb=0;

str=0;

while(stb<x){

sevzap->StringGrid1->Cells[stb][y]=StringGrid1->Cells[stb][y];stb++;

        }

while(str<y){

sevzap->StringGrid1->Cells[x][str]=StringGrid1->Cells[x][str];str++;

        }

//////////////////////////////////////////////////////////////////////////////

menu1->Hide();

sevzap->Show();

}

//---------------------------------------------------------------------------

 

void __fastcall Tmenu1::Button2Click(TObject *Sender)

{

x=StringGrid1->ColCount-1;

y=StringGrid1->RowCount-1;

for(i=0;i<x+1;i++){

        for(j=0;j<y+1;j++){

minimal->StringGrid1->Cells[i][j]=StringGrid1->Cells[i][j];

                        }

                }

i=0;j=0;

////////////////////////////////////////////////////////////

for(i=0;i<x;i++) {

minimal->StringGrid2->Cells[i][j]=StringGrid1->Cells[i][j];

                                     }

                                    i=0;

for(j=0;j<y;j++){

minimal->StringGrid2->Cells[i][j]=StringGrid1->Cells[i][j];

                                    }

                                    j=0;

stb=0;

str=0;

while(stb<x){

minimal->StringGrid2->Cells[stb][y]=StringGrid1->Cells[stb][y];stb++;

        }

while(str<y){

minimal->StringGrid2->Cells[x][str]=StringGrid1->Cells[x][str];str++;

        }

//////////////////////////////////////////////////////////////////////////////

menu1->Hide();

minimal->Show();

}

//---------------------------------------------------------------------------

 

void __fastcall Tmenu1::BitBtn1Click(TObject *Sender)

{

Application->Terminate();

}

//---------------------------------------------------------------------------

 

Исходный код about.cpp

//---------------------------------------------------------------------------

 

#include <vcl.h>

#pragma hdrstop

#include "menu.h"

#include "about.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

Tabout1 *about1;

//---------------------------------------------------------------------------

__fastcall Tabout1::Tabout1(TComponent* Owner)

        : TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall Tabout1::Button1Click(TObject *Sender)

{

about1->Close();

}

//---------------------------------------------------------------------------

 

Исходный код  help1.cpp

//---------------------------------------------------------------------------

 

#include <vcl.h>

#pragma hdrstop

#include "menu.h"

#include "help1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

Thelp *help;

//---------------------------------------------------------------------------

__fastcall Thelp::Thelp(TComponent* Owner)

        : TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall Thelp::Button1Click(TObject *Sender)

{

help->Close();

}

//---------------------------------------------------------------------------

 

Исходный код sevzap.cpp

//---------------------------------------------------------------------------

 

#include <vcl.h>

#pragma hdrstop

#include "menu.h"

#include "sevzap1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

Tsevzap *sevzap;

//---------------------------------------------------------------------------

__fastcall Tsevzap::Tsevzap(TComponent* Owner)

        : TForm(Owner)

{

//присваеваем значения  по умолчанию

stb=1;

str=1;

r=0;

fx=0;

}

//---------------------------------------------------------------------------

void __fastcall Tsevzap::BitBtn2Click(TObject *Sender)

{

///присваеваем количество  строк и столбцов для x y

x=StringGrid1->ColCount-1; ///столбец

y=StringGrid1->RowCount-1; ///строка

///ограничиваем решение  цикла для вывода результата

if((StringGrid1->Cells[x-1][y]!=0)&&(StringGrid1->Cells[x][y-1]!=0)){

///цикл для подсчета, когда запасы больше потребностей

  if(StringGrid1->Cells[x][str].ToDouble()>StringGrid1->Cells[stb][y].ToDouble())

   {//присваем минимальное из значений в целевую ячейку

   StringGrid1->Cells[stb][str]=StringGrid1->Cells[stb][y];

   //из большего вычетаем меньшее и присваеваем большей ячейке

   StringGrid1->Cells[x][str]=StringGrid1->Cells[x][str]-StringGrid1->Cells[stb][y];

   StringGrid1->Cells[stb][y]=0;//обнуляем минемальный элемент

   //считаем F(x)

   r=StringGrid1->Cells[stb][str]*menu1->StringGrid1->Cells[stb][str];

   fx=fx+r;

   r=0;//сбрасываем  результат

   //

   stb++;//сдвигаемся на столбец

   return;//остонавливаем  выполнение

   }

///цикл для подсчета, когда запасы меньше потребностей

  if(StringGrid1->Cells[x][str].ToDouble()<StringGrid1->Cells[stb][y].ToDouble())

   {//присваем минимальное из значений в целевую ячейку

   StringGrid1->Cells[stb][str]=StringGrid1->Cells[x][str];

   //из большего вычетаем меньшее и присваеваем большей ячейке

   StringGrid1->Cells[stb][y]=StringGrid1->Cells[stb][y]-StringGrid1->Cells[x][str];

   StringGrid1->Cells[x][str]=0;//обнуляем минемальный элемент

   //считаем F(x)

   r=StringGrid1->Cells[stb][str]*menu1->StringGrid1->Cells[stb][str];

   fx=fx+r;

   r=0;//сбрасываем  результат

   //

   str++;//сдвигаемся  на строку

   return;//остонавливаем  выполнение

   }

///цикл для подсчета, когда запасы равны потребностям

  if(StringGrid1->Cells[x][str].ToDouble()==StringGrid1->Cells[stb][y].ToDouble())

   {//присваем любое из значений в целевую ячейку

   StringGrid1->Cells[stb][str]=StringGrid1->Cells[x][str];

   StringGrid1->Cells[stb][y]=0;//обнуляем сравниваемые ячейки

   StringGrid1->Cells[x][str]=0;

   //считаем F(x)

   r=StringGrid1->Cells[stb][str]*menu1->StringGrid1->Cells[stb][str];

   fx=fx+r;

   r=0;//сбрасываем  результат

   //

   stb++;str++;//перемещаемся  на стб и стр по таблице

   return;//остонавливаем выполнение

   }

          }

/////////////////////////////////////////////////////////////

else{///включаем кнопку  для вывода результата,вкл эту

BitBtn2->Visible=false;

BitBtn3->Visible=true;

    }

}

//---------------------------------------------------------------------------

 

void __fastcall Tsevzap::BitBtn3Click(TObject *Sender)

{///убераем кнопки - выводим  результат

Label2->Caption=fx;

Label2->Visible=true;

BitBtn3->Visible=false;

}

//---------------------------------------------------------------------------

 

void __fastcall Tsevzap::Button1Click(TObject *Sender)

{/// вывод подсказки

ShowMessage("Выполняйте  шаги до завершения решения  и получения результата");       

}

//---------------------------------------------------------------------------

 

void __fastcall Tsevzap::BitBtn1Click(TObject *Sender)

{

x=StringGrid1->ColCount-1;

y=StringGrid1->RowCount-1;

for(i=0;i<x+1;i++){

        for(j=0;j<y+1;j++){

StringGrid1->Cells[i][j]="";

                        }

                }

Label2->Visible=false;

stb=1;

str=1;

r=0;

fx=0;

BitBtn2->Visible=true;

menu1->Show();

sevzap->Close();

}

//---------------------------------------------------------------------------

 

//---------------------------------------------------------------------------

 

 

Исходный код minimal1.cpp

//---------------------------------------------------------------------------

 

#include <vcl.h>

#pragma hdrstop

 

#include "minimal1.h"

#include "menu.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

Tminimal *minimal;

//---------------------------------------------------------------------------

__fastcall Tminimal::Tminimal(TComponent* Owner)

        : TForm(Owner)

{

/////присваеваем значение  по умолчанию

stb=1;str=1;

r=0;fx=0;

i=1;j=1;

}

//---------------------------------------------------------------------------

void __fastcall Tminimal::BitBtn1Click(TObject *Sender)

{ ///кнопка назад

/////присваеваем переменным  значения размера таблици

x=StringGrid1->ColCount-1;

y=StringGrid1->RowCount-1;

/////очищаем первую  таблицу

for(i=0;i<x+1;i++){

        for(j=0;j<y+1;j++){

StringGrid1->Cells[i][j]="";

                        }

                }

//////очищаем вторую  таблицу

for(i=0;i<x+1;i++){

        for(j=0;j<y+1;j++){

StringGrid2->Cells[i][j]="";

                        }

                }

/////возвращаем начальные  значения переменным

stb=1;str=1;

r=0;fx=0;

i=1;j=1;

BitBtn3->Visible=true;

Label2->Visible=false;

//////////////переходим в  главное меню

menu1->Show();

minimal->Close();

}

//---------------------------------------------------------------------------

 

void __fastcall Tminimal::BitBtn3Click(TObject *Sender)

{

/////присваеваем переменным значения размера таблици

x=StringGrid1->ColCount-1;

y=StringGrid1->RowCount-1;

i=1;j=1;

min=StrToInt(StringGrid1->Cells[i][j]); //принемаем за минимум первый  элемент

stb=1;str=1;////

for(int i = 1; i < StringGrid1->ColCount-1; i++) {

  for(int j = 1; j < StringGrid1->RowCount-1; j++) {

    if (min>StringGrid1->Cells[i][j]) {

      min=StringGrid1->Cells[i][j].ToInt();///присвоеваем значение новому минимальному элементу

      stb=i;str=j;///запоминаем координаты минимального элемента

                                      }

                                                   }

                                                 }

////когда минимальный  не равен, тогда выполняем решение  (ограничение)

if (min != 999){

        ///цикл для подсчета, когда запасы больше потребностей

        if (StringGrid1->Cells[stb][y].ToDouble()<StringGrid1->Cells[x][str].ToDouble())

{

StringGrid2->Cells[stb][str]=StringGrid1->Cells[stb][y];///меньшее  вставляем в таблицу

StringGrid1->Cells[stb][str]=StringGrid1->Cells[stb][y];

///из большего вычитаем  меньшее

StringGrid1->Cells[x][str]=StringGrid1->Cells[x][str]-StringGrid1->Cells[stb][y];

StringGrid2->Cells[x][str]=StringGrid1->Cells[x][str];

///считаем F(x)

r= StringGrid2->Cells[stb][str]*menu1->StringGrid1->Cells[stb][str];

fx=fx+r;r=0; Label2->Caption=fx;

///замещаем столбец  бомьшим числом

for(int str = 1; str < y ; str++) {StringGrid1->Cells[stb][str]=999;}

StringGrid2->Cells[stb][y]=0;

StringGrid1->Cells[stb][y]=0;

return;

}

        /// цикл для подсчета, когда запасы меньше потребностей

        if (StringGrid1->Cells[stb][y].ToDouble()>StringGrid1->Cells[x][str].ToDouble())

{

StringGrid2->Cells[stb][str]=StringGrid1->Cells[x][str];

StringGrid1->Cells[stb][str]=StringGrid1->Cells[x][str];

///из большего вычитаем меньшее

StringGrid1->Cells[stb][y]=StringGrid1->Cells[stb][y]-StringGrid1->Cells[x][str];

StringGrid2->Cells[stb][y]=StringGrid1->Cells[stb][y];

///считаем F(x)

r= StringGrid2->Cells[stb][str]*menu1->StringGrid1->Cells[stb][str];

fx=fx+r;r=0; Label2->Caption=fx;

/////замещаем строку  бомьшим числом

for(int stb = 1; stb < x ; stb++) {StringGrid1->Cells[stb][str]=999;}

StringGrid2->Cells[x][str]=0;

StringGrid1->Cells[x][str]=0;

return;

}

         ///цикл для подсчета, когда запасы  равны потребностям

        if (StringGrid1->Cells[stb][y].ToDouble()==StringGrid1->Cells[x][str].ToDouble())

{

StringGrid2->Cells[stb][str]=StringGrid1->Cells[x][str];///любой  из элементов вставляем в таблицу

StringGrid1->Cells[stb][str]=StringGrid1->Cells[x][str];

StringGrid1->Cells[stb][y]=0;

StringGrid2->Cells[stb][y]=0;

StringGrid1->Cells[x][str]=0;

///считаем F(x)

r= StringGrid2->Cells[stb][str]*menu1->StringGrid1->Cells[stb][str];

fx=fx+r;r=0; Label2->Caption=fx;

/////замещаем строку  и столбец

for(int stb = 1; stb < x ; stb++) {StringGrid1->Cells[stb][str]=999;}

for(int str = 1; str < y ; str++) {StringGrid1->Cells[stb][str]=999;}

StringGrid2->Cells[x][str]=0;

return;

}

}

else {BitBtn4->Visible=true;BitBtn3->Visible=false;}

}

//---------------------------------------------------------------------------

 

void __fastcall Tminimal::BitBtn4Click(TObject *Sender)

{

BitBtn4->Visible=false;

Label2->Visible=true;

}

//---------------------------------------------------------------------------

 

void __fastcall Tminimal::Button1Click(TObject *Sender)

{

/// вывод подсказки

ShowMessage("Выполняйте шаги до завершения решения и получения результата");        

}

//---------------------------------------------------------------------------

 

8.Приложение B (Рекомендуемое) Инструкция пользователя

  1. Осуществляем запуск программы.

 

  1. Интерфейс главного меню содержит: Справку, О программе ,кнопки северо-западного угла и минимального элемента
  2. Выбираем один из методов и нажимаем кнопку сделать шаг(Пошагово решает задачу).
  3. Кнопка получить (Выводит результат F(x))
  4. Кнопка назад возвращает в главное меню

 

9.Приложение Г (Обязательное) Контрольный тест программы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




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