С помощью данной программы вы сможете без труда производить вычисления по транспортной задаче. Интерфейс программы удобен и приятен.
Литература
К.Л. Самаров Транспортная задача. Учебное пособие для студента.
2 Колин Мук ActionScript 3.0 для Flash. Подробное руководство.
ПРИЛОЖЕНИЕ А
(обязательное)
Листинг программы
/*
________________________________________________________________________
Курсовой проект
Тема "Решение транспортной задачи"
________________________________________________________________________
Язык: ActionScript 3.0
Кодировка: ASCII (win.1251)
Среда: Adobe Flash CS6.0
Разработали:
А. В. Андронов
С. А. Соколов
А.Ю. Бадаев
А.В. Никитин
Е.А. Туровский
Дата: 1 ноября 2012г
________________________________________________________________________
Задачей курсовой работы является разработка программы для построения
оптимального плана транспортной задачи.
________________________________________________________________________
Используемые глобальные константы:
STAGE_HEIGHT - высота сцены;
STAGE_WIDTH - ширина сцены.
________________________________________________________________________
Используемые глобальные переменные класса:
|
|
task - класс управления задачей;
mm - главное меню;
a - информация о программе.
________________________________________________________________________
Используемые методы класса:
init - инициализация программы;
nTask - создание нового плана;
clearMenu - удаление главного меню;
clearTask - удаление плана;
showMenu - создание главного меню;
about - информация о программе.
________________________________________________________________________
*/
package src
{
import flash.display.MovieClip;
import flash.events.Event;
import src.transport.*;
import flash.events.MouseEvent;
public class Main extends MovieClip
{
public static var STAGE_HEIGHT:int=580,STAGE_WIDTH:int=789;
private var task:Task;
private var mm:MainMenu;
private var a:About;
/*
________________________________________________________________________
Метод enterSize - ввод количества заявок и запасов.
________________________________________________________________________
*/ public function Main()
{
addEventListener(Event.ADDED_TO_STAGE, init);
}
/*
________________________________________________________________________
Метод init - инициализация программы.
________________________________________________________________________
Формальный параметр:
e - событие.
________________________________________________________________________
*/ private function init(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
STAGE_HEIGHT = stage.height;
STAGE_WIDTH = stage.width;
showMenu(new TEvent(TEvent.FIRST_TRANSPORT));
}
/*
________________________________________________________________________
Метод nTask - создание нового плана.
________________________________________________________________________
Формальный параметр:
e - событие мышки.
________________________________________________________________________
*/ private function nTask(e:MouseEvent):void
{
if (a)
{
removeChild(a);
a = null;
}
if (task)
{
clearTask();
}
else
{
task=new Task();
task.enterSize();
addChild(task);
task.addEventListener(TEvent.END_TRANSPORT,showMenu);
task.addEventListener(TEvent.NEW_TRANSPORT,clearMenu);
}
}//end
/*
________________________________________________________________________
Метод clearMenu - удаление главного меню.
________________________________________________________________________
Формальный параметр:
|
|
e - событие.
________________________________________________________________________
*/ private function clearMenu(e:TEvent):void
{
mm.new_task.removeEventListener(MouseEvent.CLICK,nTask);
mm.about.removeEventListener(MouseEvent.CLICK,about);
removeChild(mm);
mm = null;
}
/*
________________________________________________________________________
Метод clearTask - удаление плана.
________________________________________________________________________
*/ private function clearTask():void
{
task.removeEventListener(TEvent.END_TRANSPORT,showMenu);
task.removeEventListener(TEvent.NEW_TRANSPORT,clearMenu);
removeChild(task);
task = null;
}//end
/*
________________________________________________________________________
Метод showMenu - создание главного меню.
________________________________________________________________________
Формальный параметр:
e - событие.
________________________________________________________________________
*/ private function showMenu(e:TEvent):void
{
if (e.type == TEvent.END_TRANSPORT)
{
clearTask();
}
mm=new MainMenu();
mm.x = STAGE_WIDTH - mm.width;
mm.y = STAGE_HEIGHT/2-mm.height/2;
addChild(mm);
mm.new_task.addEventListener(MouseEvent.CLICK,nTask);
mm.about.addEventListener(MouseEvent.CLICK,about);
}//end
/*
________________________________________________________________________
Метод about - информация о программе.
________________________________________________________________________
Формальный параметр:
e - событие мышки.
________________________________________________________________________
*/ private function about(e:MouseEvent):void
{
if (a)
{
removeChild(a);
a = null;
}
else
{
a=new About();
a.x = STAGE_WIDTH / 2 - a.width / 2;
a.y = STAGE_HEIGHT / 2 - a.height / 2;
addChild(a);
}
}//end
}//end class
}//end package
/*
________________________________________________________________________
Класс программы управления задачей.
________________________________________________________________________
Используемые глобальные переменные класса:
m - класс матрицы перевозок;
store, stock - вектора заявок и запасов соответственно;
dataConStore,
dataConStock - контейнеры объектов запасов и заявок;
kolZayavok,
kolZapasov - количество заявок и запасов;
control - класс элементов управления;
hint - класс подсказки;
sizeForm - класс формы ввода подсказки.
________________________________________________________________________
Используемые методы класса:
H - вывод информации;
enterSize - ввод размера матрицы перевозок;
checkedSize - проверка ввода размера матрицы перевозок;
enterData - создание и вывод на экран матрицы, кнопок;
showHint - вывод подсказки;
goMenu - выход в главное меню программы;
firstPlan - постраение первого плана;
nextPlan - постраение следующего плана;
sumElementsVector - суммирует элементы вектора запасов или заявок;
showSS - создание и вывод на экран векторов запасов и заявок;
addZaya - добавление в вектор заявок элемента;
addZap - добавление в вектор запасов элемента;
closeEnter - ограничение доступа ввода запасов и заявок;
correctness - проверка корректности ввода значений запасов и заявок.
________________________________________________________________________
*/
package src
{
import flash.display.MovieClip;
import src.transport.data.*;
import src.transport.*;
import flash.events.MouseEvent;
import flash.display.Sprite;
public class Task extends MovieClip
{
private var m:Mat;
private var store:Array,stock:Array;
private var dataConStore:Sprite,dataConStock:Sprite;
private var kolZayavok:int,kolZapasov:int;
private var control:BandControl;
private var hint:Hint;
private var sizeForm:FormSize;
/*
________________________________________________________________________
Конструктор класса.
________________________________________________________________________
*/ public function Task()
{
hint= new Hint();
hint.x = Main.STAGE_WIDTH / 2 - hint.width / 2;
hint.y = Main.STAGE_HEIGHT / 2 - hint.height / 2;
}//end
/*
________________________________________________________________________
Метод H - выводит информацию на экран.
________________________________________________________________________
Формальный параметр:
s - строка информации.
________________________________________________________________________
*/ private function H(s:String):void
{
hint.hint = s;
addChild(hint);
}//end
/*
________________________________________________________________________
Метод enterSize - ввод количества заявок и запасов.
________________________________________________________________________
*/ public function enterSize():void
{
sizeForm=new FormSize();
sizeForm.y = Main.STAGE_HEIGHT / 2 - sizeForm.height / 2;
addChild(sizeForm);
sizeForm.ok.addEventListener(MouseEvent.CLICK,checkedSize);
}//end
/*
________________________________________________________________________
Метод checkedSize - проверка правильности заполнения полей
размеров.
________________________________________________________________________
Формальный параметр:
e - событие мышки.
________________________________________________________________________
*/ private function checkedSize(e:MouseEvent):void
{
if (sizeForm.check)
{
sizeForm.ok.removeEventListener(MouseEvent.CLICK,enterData);
removeChild(sizeForm);
kolZayavok = int(sizeForm.kolzaya.text);
kolZapasov = int(sizeForm.kolzap.text);
sizeForm = null;
|
|
enterData();
}
else
{
H('\n\nНе правильный ввод!\n Все поля должны быть заполнены!');
}
}//end
/*
________________________________________________________________________
Метод enterData - создание и вывод на экран матрицы, кнопок.
________________________________________________________________________
*/ private function enterData():void
{
control= new BandControl();
control.y = 0;
addChild(control);
control.btnNext.addEventListener(MouseEvent.CLICK,firstPlan);
control.menu.addEventListener(MouseEvent.CLICK,goMenu);
control.hint_btn.addEventListener(MouseEvent.CLICK,showHint);
m=new Mat();
m.y = 40;
m.x = 40;
m.showMat(kolZayavok,kolZapasov);
addChild(m);
showSS();
H('Заполните поля цены, поля заявок и поля запасов.\nИ нажмите кнопку "Далее" для продолжения...');
}//end
/*
________________________________________________________________________
Метод showHint - вывод подсказки.
________________________________________________________________________
*/ private function showHint(e:MouseEvent):void
{
hint.gotoAndStop(2);
hint.visible = true;
addChild(hint);
}//end
/*
________________________________________________________________________
Метод goMenu - выход в главное меню программы.
________________________________________________________________________
Формальный параметр:
e - событие мышки.
________________________________________________________________________
*/ private function goMenu(e:MouseEvent):void
{
control.btnNext.removeEventListener(MouseEvent.CLICK,firstPlan);
control.menu.removeEventListener(MouseEvent.CLICK,goMenu);
control.hint_btn.removeEventListener(MouseEvent.CLICK,showHint);
dispatchEvent(new TEvent(TEvent.END_TRANSPORT));
}//end
/*
________________________________________________________________________
Метод firstPlan - постраение первого плана.
________________________________________________________________________
Формальный параметр:
e - событие мышки.
________________________________________________________________________
Переменные используемые в методе:
sZaya, sZap - сумма элементов вектора заявок, сумма элементов
вектора запасов.
________________________________________________________________________
*/ private function firstPlan(e:MouseEvent):void
{
var sZaya:int = sumElementsVector(store,kolZayavok);
var sZap:int = sumElementsVector(stock,kolZapasov);
if (stock.every(correctness) && store.every(correctness))
{
if (sZaya<sZap)
{
addZaya(sZap-sZaya);
}
else if (sZaya>sZap)
{
addZap(sZaya-sZap);
}else
{
control.btnNext.removeEventListener(MouseEvent.CLICK,firstPlan);
control.stoimost_plana_txt.text = m.firstPlan(stock,store,kolZayavok,kolZapasov).toString();
control.btnNext.addEventListener(MouseEvent.CLICK,nextPlan);
control.cargo_units_txt.text = sZaya.toString();
H('Первый план поcтроен.\n Нажмите "Далее" для продолжения...');
store.forEach(closeEnter);
stock.forEach(closeEnter);
}
}
else
{
H('Значения полей запасов и заявок \nне должны быть равными нулю или оставаться пустыми\nпроверте правильность');
|
|
}
}//end
/*
________________________________________________________________________
Метод nextPlan - постраение следующего плана.
________________________________________________________________________
Формальный параметр:
e - событие мышки.
________________________________________________________________________
*/ private function nextPlan(e:MouseEvent):void
{
hint.visible = false;
if (m.newPlan(kolZayavok,kolZapasov))
{
H('\n\nПлан оптимален, задача решена.\nСтоимость плана:'+control.stoimost_plana_txt.text);
control.btnNext.removeEventListener(MouseEvent.CLICK,nextPlan);
}
else
{
control.stoimost_plana_txt.text = m.sumTransport(kolZayavok,kolZapasov).toString();
}
}//end
/*
________________________________________________________________________
Метод sumElementsVector - суммирует элементы вектора запасов
или заявок.
________________________________________________________________________
Формальные параметры:
v - вектор;
m - количество элементов.
________________________________________________________________________
Переменная используемые в методе:
sum - сумма элементов.
________________________________________________________________________
*/ public function sumElementsVector(v:Array,m:int):int
{
var sum:int = 0;
for (var i:int=0; i<m; i++)
{
sum += int(v[i].stock);
}
return sum;
}//end
/*
________________________________________________________________________
Метод showSS - создание и вывод на экран векторов
запасов и заявок
________________________________________________________________________
Переменные используемые в методе:
i - счетчик цикла;
yy,xx - координаты расположения объектов.
________________________________________________________________________
*/ private function showSS():void
{
var yy:int = 0;
var i:int;
store = new Array();
dataConStore= new Sprite();
dataConStore.x = m.x + m.width + 10,dataConStore.y = m.y;
for (i=0; i<kolZayavok; i++)
{
store.push(new SStore());
store[i].y = yy;
dataConStore.addChild(store[i]);
yy += store[i].height + 5;
}
addChild(dataConStore);
stock= new Array();
dataConStock= new Sprite();
dataConStock.x = m.x;
dataConStock.y = m.y + m.height + 10;
var xx:int = 0;
for (i=0; i<kolZapasov; i++)
{
stock.push(new SStore());
stock[i].x = xx;
dataConStock.addChild(stock[i]);
xx += stock[i].width + 5;
}
addChild(dataConStock);
}//end
/*
________________________________________________________________________
Метод addZaya - добавление в вектор заявок элемента.
________________________________________________________________________
Формальный параметр:
arg - значение добавляемого элемента.
________________________________________________________________________
*/ private function addZaya(arg:int):void
{
kolZayavok = m.addStr(kolZapasov);
store.push(new SStore());
store[kolZayavok - 1].y = dataConStore.height + 5;
dataConStore.addChild(store[kolZayavok-1]);
store[kolZayavok - 1].stock = arg.toString();
dataConStock.y = m.y + m.height + 10;
}//end
/*
________________________________________________________________________
Метод addZap - добавление в вектор запасов элемента.
________________________________________________________________________
Формальный параметр:
arg - значение добавляемого элемента.
________________________________________________________________________
*/ private function addZap(arg:int):void
{
kolZapasov = m.addSto(kolZapasov);
stock.push(new SStore());
stock[kolZapasov - 1].x = dataConStock.width + 5;
dataConStock.addChild(stock[kolZapasov -1]);
stock[kolZapasov - 1].stock = arg.toString();
dataConStore.x = m.x + m.width + 10;
}//end
/*
________________________________________________________________________
Метод closeEnter - ограничение доступа ввода запасов и заявок.
________________________________________________________________________
Формальные параметры:
element - элемент для ограничения доступа;
index - индекс элемента в массиве;
arr - массив элементов.
________________________________________________________________________
*/ private function closeEnter(element:*, index:Number, arr:Array):void
{
element.closeStock();
}//end
/*
________________________________________________________________________
Метод correctness - проверка корректности ввода значений
запасов и заявок.
________________________________________________________________________
Формальные параметры:
element - элемент для ограничения доступа;
index - индекс элемента в массиве;
arr - массив элементов.
________________________________________________________________________
*/ private function correctness(element:*, index:Number, arr:Array):Boolean
{
return element.stock>0;
}//end
}//end class
}//end package
/*
________________________________________________________________________
Класс работы с матрицой перевозок.
________________________________________________________________________
Используемые глобальные переменные класса:
element - матрица перевозок;
cicle - вектор цикла.
________________________________________________________________________
Используемые методы класса:
showMat - создание и вывод на экран матрицы перевозок;
sumTransport - подсчет стоимости плана;
firstPlan - построение первого плана;
getValue - вспомогательный метод копирования значений запасов и
заявок;
addStr - добавление строки в матрицу;
addSto - добавление столбца в матрицу;
newPlan - построение нового плана;
ciclePr - улучшение плана перевозок;
clearCicleShow - визуальная очистка плана;
endCycle - проверка завершения цикла;
searchCycle - поиск цикла;
newObjectWay - добавление в вектор элемента цикла;
priceCicle - определение цены цикла.
________________________________________________________________________
*/
package src.transport
{
import flash.display.MovieClip;
import src.transport.data.*;
public class Mat extends MovieClip
{
private var element:Array;
private var cicle:Array;
/*
________________________________________________________________________
Конструктор класса.
________________________________________________________________________
*/ public function Mat()
{
}
/*
________________________________________________________________________
Метод showMat - создание и вывод на экран матрицы перевозок.
________________________________________________________________________
Формальные параметры:
n - количество строк;
m - количество столбцов.
________________________________________________________________________
Переменные используемые в методе:
yy,xx - координаты расположения элементов.
________________________________________________________________________
*/ public function showMat(n:int,m:int):void
{
var xx:int = 0,yy:int = 0;
element = new Array(n);
for (var i:int=0; i<n; i++)
{
element[i] = new Array(m);
for (var j:int=0; j<m; j++)
{
element[i][j]= new Element();
element[i][j].x = xx;
element[i][j].y = yy;
addChild(element[i][j]);
xx += element[i][j].width + 5;
}
xx = 0;
yy += element[i][j - 1].height + 5;
}
}//end
/*
________________________________________________________________________
Метод sumTransport - подсчет стоимости плана.
________________________________________________________________________
Формальные параметры:
n - количество строк;
m - количество столбцов.
________________________________________________________________________
Переменная используемые в методе:
sum - сумма элементов.
________________________________________________________________________
*/ public function sumTransport(n:int,m:int):int
{
var sum:int = 0;
for (var i:int=0; i<n; i++)
{
for (var j:int=0; j<m; j++)
{
sum += element[i][j].stoimost * element[i][j].perevozka;
}
}
return sum;
}//end
/*
________________________________________________________________________
Метод firstPlan - построение первого плана.
________________________________________________________________________
Формальные параметры:
n - количество строк;
m - количество столбцов;
_a - вектор запасов;
_b - вектор заявок;
________________________________________________________________________
Переменные используемые в методе:
i, j, k - счетчики.
a - вектор запасов;
b - вектор заявок;
min - минимальная стоимость;
I, J - индексы элемента;
sum - стоимость первого плана;
p - количество груза.
________________________________________________________________________
*/ public function firstPlan(_a:Array,_b:Array,n:int,m:int):int
{
var i:int,j:int;
var a:Array = _a.map(getValue);
var b:Array = _b.map(getValue);
var min:int,k:int,J:int,I:int,sum:int = 0,p:int = 0;
for (k=0; k<(n+m-1); k++)
{
min = 1000;
for (i=0; i<n; i++)
{
if (b[i] > 0)
{
for (j=0; j<m; j++)
{
if (min>element[i][j].stoimost&&(a[j]>0))
{
min = element[i][j].stoimost;
I = i;
J = j;
}
}
}
}
if (! element[I][J].bazis)
{
p=(a[J]<b[I])?a[J]:b[I];
a[J] -= p;
b[I] -= p;
element[I][J].perevozka = p;
element[I][J].bazis = true;
sum += min * p;
}
else
{
i = 0;
while (i<n)
{
for (j=0; j<m; j++)
{
if (! element[i][j].bazis)
{
element[i][j].bazis = true;
i = n;
break;
}
}
i++;
}
}
}
return sum;
}//end
/*
________________________________________________________________________
Метод getValue - вспомогательный метод копирования значений
запасов и заявок.
________________________________________________________________________
Формальные параметры:
element - элемент для ограничения доступа;
index - индекс элемента в массиве;
arr - массив элементов.
________________________________________________________________________
*/ private function getValue(element:*, index:int, arr:Array):int
{
return element.stock;
}//end
/*
________________________________________________________________________
Метод addStr - добавление строки в матрицу.
________________________________________________________________________
Формальный параметр:
zap - длина вектора запасов.
________________________________________________________________________
*/ public function addStr(zap:int):int
{
var i:int = element.length,xx:int = 0;
var yy:int = element[i - 1][0].y + element[i - 1][0].width - 5;
element[i]=new Array();
for (var j:int=0; j<zap; j++)
{
element[i][j]=new Element();
element[i][j].y = yy;
element[i][j].x = xx;
addChild(element[i][j]);
xx += element[i][j].width + 5;
}
return element.length;
}//end
/*
________________________________________________________________________
Метод addSto - добавление столбца в матрицу.
________________________________________________________________________
Формальный параметр:
zap - длина вектора заявок.
________________________________________________________________________
*/ public function addSto(zap:int):int
{
var xx:int = element[0][zap - 1].x + element[0][zap - 1].width + 5;
var yy:int = 0;
for (var j:int=0; j<element.length; j++)
{
element[j][zap]=new Element();
element[j][zap].y = yy;
element[j][zap].x = xx;
addChild(element[j][zap]);
yy += element[j][zap].height + 5;
}
return element[j-1].length;
}//end
/*
________________________________________________________________________
Метод newPlan - построение нового плана.
________________________________________________________________________
Формальные параметры:
n - количество строк;
m - количество столбцов.
________________________________________________________________________
Переменные используемые в методе:
i, j - счетчики.
________________________________________________________________________
*/ public function newPlan(n:int,m:int):Boolean
{
var i:int,j:int;
if (cicle)
{
clearCicleShow();
}
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
if (! element[i][j].bazis)
{
cicle= new Array();
newObjectWay(0,i,j);
if (searchCycle(1,1,i,j,n,m)||searchCycle(1,3,i,j,n,m)
||searchCycle(1,2,i,j,n,m)||searchCycle(1,4,i,j,n,m))
{
if (priceCicle())
{
ciclePr();
return false;
}
}
}
}
}
return true;
}//end
/*
________________________________________________________________________
Метод ciclePr - улучшение плана перевозок.
________________________________________________________________________
Переменные используемые в методе:
i - счетчик;
min - минимальный груз;
ki, kj - индексы;
zn - знак операции.
________________________________________________________________________
*/ private function ciclePr():void
{
var min:int = cicle[1].perev,ki:int = cicle[1].i,kj:int = cicle[1].j,i:int = 1;
while (i<cicle.length)
{
if (min>cicle[i].perev)
{
min = cicle[i].perev;
ki = cicle[i].i;
kj = cicle[i].j;
}
i += 2;
}
var zn:int = 1;
element[cicle[0].i][cicle[0].j].bazis = true;
element[ki][kj].bazis = false;
for (i=0; i<cicle.length; i++)
{
element[cicle[i].i][cicle[i].j].perevozka += min * zn;
element[cicle[i].i][cicle[i].j].gotoAndStop(3);
zn *= -zn;
}
element[cicle[0].i][cicle[0].j].gotoAndStop(4);
element[ki][kj].gotoAndStop(5);
}//end
/*
________________________________________________________________________
Метод clearCicleShow - визуальная очистка плана.
________________________________________________________________________
Переменная используемая в методе:
i - счетчик.
________________________________________________________________________
*/ private function clearCicleShow():void
{
for (var i:int=0; i<cicle.length; i++)
{
if (element[cicle[i].i][cicle[i].j].bazis)
{
element[cicle[i].i][cicle[i].j].gotoAndStop(2);
}
else
{
element[cicle[i].i][cicle[i].j].gotoAndStop(1);
}
}
}//end
/*
________________________________________________________________________
Метод endCycle - проверка завершения цикла.
________________________________________________________________________
Формальные параметры:
i, j - индексы.
________________________________________________________________________
*/ private function endCycle(i:int,j:int):Boolean
{
return ((cicle[0].i==i)&&(cicle[0].j==j));
}//end
/*
________________________________________________________________________
Метод searchCycle - поиск цикла.
________________________________________________________________________
Формальные параметры:
_n - количество строк;
_m - количество столбцов;
_i, _j - индексы;
p - направление движения;
k - индекс вектора цикла.
________________________________________________________________________
Переменные используемые в методе:
i, j - счетчики;
f - существование цикла;
b - вспомогательная переменная.
________________________________________________________________________
*/ private function searchCycle(k:int,p:int,_i:int,_j:int,_n:int,_m:int):Boolean
{
var j:int,i:int,b:Boolean = false,f:Boolean = false;
if (k>21)
{
return false;
}
switch (p)
{
case 1:
for (i = _i; i<_n; i++)
{
if ((k>2)&&endCycle(i,_j))
{
return true;
}
if (element[i][_j].bazis && b)
{
if (f=(searchCycle(k+1,2,i,_j,_n,_m)||searchCycle(k+1,4,i,_j,_n,_m)))
{
newObjectWay(k,i,_j);
}
else
{
f = searchCycle(k,1,i,_j,_n,_m);
}
return f;
}
b = true;
}
break;
case 2:
for (j = _j; j<_m; j++)
{
if ((k>2)&&endCycle(_i,j))
{
return true;
}
if (element[_i][j].bazis && b)
{
if (f=(searchCycle(k+1,3,_i,j,_n,_m)||searchCycle(k+1,1,_i,j,_n,_m)))
{
newObjectWay(k,_i,j);
}
else
{
f = searchCycle(k,2,_i,j,_n,_m);
}
return f;
}
b = true;
}
break;
case 3:
for (i = _i; i>=0; i--)
{
if ((k>2)&&endCycle(i,_j))
{
return true;
}
if (element[i][_j].bazis && b)
{
if (f=(searchCycle(k+1,4,i,_j,_n,_m)||searchCycle(k+1,2,i,_j,_n,_m)))
{
newObjectWay(k,i,_j);
}
else
{
f = searchCycle(k,3,i,_j,_n,_m);
}
return f;
}
b = true;
}
break;
case 4:
for (j = _j; j>=0; j--)
{
if ((k>2)&&endCycle(_i,j))
{
return true;
}
if (element[_i][j].bazis && b)
{
if (f=(searchCycle(k+1,1,_i,j,_n,_m)||searchCycle(k+1,3,_i,j,_n,_m)))
{
newObjectWay(k,_i,j);
}
else
{
f = searchCycle(k,4,_i,j,_n,_m);
}
return f;
}
b = true;
}
break;
}
return false;
}//end
/*
________________________________________________________________________
Метод newObjectWay - добавление в вектор элемента цикла.
________________________________________________________________________
Формальные параметры:
i, j - индексы элемента матрицы;
k - индекс вектора цикла.
________________________________________________________________________
Переменная используемая в методе:
obj - элемент вектора цикла.
________________________________________________________________________
*/ private function newObjectWay(k:int,i:int,j:int):void
{
var obj:Object= new Object();
obj.i = i;
obj.j = j;
obj.price = element[i][j].stoimost;
obj.perev = element[i][j].perevozka;
cicle[k] = obj;
}//end
/*
________________________________________________________________________
Метод priceCicle - определение цены цикла.
_________________________________________________________________________
Переменная используемая в методе:
sum - цена цикла.
________________________________________________________________________
*/ private function priceCicle():Boolean
{
if ((cicle.length%2)!=0)
{
return false;
}
var sum:int = 0,i:int = 0;
while (i<cicle.length)
{
sum += cicle[i].price - cicle[i + 1].price;
i += 2;
}
return sum<0;
}//end
}//end class
}//end package
/*
________________________________________________________________________
Класс формы ввода размера матрицы.
________________________________________________________________________
Используемые глобальные переменные класса:
kolzaya - количество заявок;
kolzap - количество запасов.
________________________________________________________________________
Используемый метод класса:
get check - метод возвращающий корректность ввода.
________________________________________________________________________
*/
package src.transport
{
import flash.display.MovieClip;
public class FormSize extends MovieClip
{
/*
________________________________________________________________________
Конструктор класса.
________________________________________________________________________
*/ public function FormSize()
{
this.kolzaya.restrict = '1-6';
this.kolzaya.maxChars = 1;
this.kolzap.restrict = '1-6';
this.kolzap.maxChars = 1;
}
/*
________________________________________________________________________
Метод get check - метод возвращающий корректность ввода.
________________________________________________________________________
*/ public function get check():Boolean
{
return kolzaya.text&&kolzap.text;
}
}
}
/*
________________________________________________________________________
Класс вывода информации.
________________________________________________________________________
Используемые глобальные переменные класса:
ok - кнопка;
field - текстовое поле.
________________________________________________________________________
Используемые методы класса:
set hint - установка текста информации;
hideHint - скрытие подсказки.
________________________________________________________________________
*/
package src
{
import flash.display.MovieClip;
import flash.events.MouseEvent;
public class Hint extends MovieClip
{
/*
________________________________________________________________________
Конструктор класса.
________________________________________________________________________
*/ public function Hint()
{
visible = false;
ok.addEventListener(MouseEvent.CLICK,hideHint);
stop();
}
/*
________________________________________________________________________
Метод set hint - установка текста информации.
________________________________________________________________________
Формальный параметр:
val - текст информации.
________________________________________________________________________
*/ public function set hint(val:String):void
{
gotoAndStop(1);
this.field.text = val;
visible = true;
}
/*
________________________________________________________________________
Метод hideHint - скрытие подсказки.
________________________________________________________________________
Формальный параметр:
e - событие мышки.
________________________________________________________________________
*/ private function hideHint(e:MouseEvent):void
{
visible = false;
}
}
}
/*
________________________________________________________________________
Класс событий приложения.
________________________________________________________________________
Используемые глобальные константы:
END_TRANSPORT - событие выхода в меню;
FIRST_TRANSPORT - событие первой инициализации меню;
NEW_TRANSPORT - событие создания меню.
________________________________________________________________________
*/package src
{
import flash.events.Event;
public class TEvent extends Event
{
public static const END_TRANSPORT:String = 'endTransport';
public static const FIRST_TRANSPORT:String = 'firstTransport';
public static const NEW_TRANSPORT:String = 'newTransport';
/*
________________________________________________________________________
Конструктор класса.
________________________________________________________________________
*/ public function TEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
}
}
/*
________________________________________________________________________
Класс элемента матрицы.
________________________________________________________________________
Используемые глобальные переменные класса:
baz - признак базисной клетки;
stoim - стоимость;
perev - перевозка.
________________________________________________________________________
Используемые методы класса:
clearStoimField - очистка поля при первом клике мышки;
get perevozka,
set perevozka - методы доступа поля perev;
get stoimost - метод для чтения значения поля stoim;
get bazis,
set bazis - методы доступа поля baz.
________________________________________________________________________
*/
package src.transport.data
{
import flash.display.MovieClip;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldType;
import flash.events.MouseEvent;
public class Element extends MovieClip
{
private var baz:Boolean;
private var stoim:TextField;
private var perev:TextField;
/*
________________________________________________________________________
Конструктор класса.
________________________________________________________________________
*/ public function Element()
{
stoim= new TextField();
stoim.width=60;
stoim.height=26;
stoim.x=2;
stoim.y=2;
stoim.type= TextFieldType.INPUT;
stoim.defaultTextFormat=new TextFormat(null,16,0x003e41,true,null,null,null,null,'right');
stoim.text='0';
addChild(stoim);
stoim.restrict='0-9';
stoim.maxChars=3;
perev= new TextField();
perev.width=60;
perev.height=37;
perev.selectable=false;
perev.x=2;
perev.y=18;
perev.defaultTextFormat=new TextFormat(null,30,0xFFFFFF,true,null,null,null,null,'center');
perev.text='0';
addChild(perev);
baz=false;
stop();
stoim.addEventListener(MouseEvent.CLICK,clearStoimField);
}
/*
________________________________________________________________________
Метод clearStoimField - очистка поля при первом клике мышки.
________________________________________________________________________
Формальный параметр:
e - событие мышки.
________________________________________________________________________
*/ private function clearStoimField(e:MouseEvent):void
{
stoim.removeEventListener(MouseEvent.CLICK,clearStoimField);
stoim.text = '';
}
/*
________________________________________________________________________
Метод get perevozka - чтение значения поля perev.
________________________________________________________________________
*/ public function get perevozka():int
{
return int(perev.text);
}
/*
________________________________________________________________________
Метод set perevozka - запись значения в поле perev.
________________________________________________________________________
Формальный параметр:
val - значение для установки.
________________________________________________________________________
*/
public function set perevozka(val:int):void
{
perev.text=val.toString();
}
/*
________________________________________________________________________
Метод get stoimost - чтение значения поля stoim.
________________________________________________________________________
*/ public function get stoimost():int
{
return int(stoim.text);
}
/*
________________________________________________________________________
Метод get bazis - чтение значения поля baz.
________________________________________________________________________
*/ public function get bazis():Boolean
{
return baz;
}
/*
________________________________________________________________________
Метод set bazis - запись значения в поле baz.
________________________________________________________________________
Формальный параметр:
val - значение для установки.
________________________________________________________________________
*/ public function set bazis(val:Boolean):void
{
baz=val;
(val)?gotoAndStop(2):gotoAndStop(1);
}
}
}
/*
________________________________________________________________________
Класс элемента вектора запасов и вектора заявок.
________________________________________________________________________
Используемая глобальная переменная класса:
st - груз.
________________________________________________________________________
Используемые методы класса:
clearStField - очистка поля при первом клике мышки;
get stock,
set stock - методы доступа поля stock;
closeStock - ограничение на запись данных в поле st.
________________________________________________________________________
*/
package src.transport.data
{
import flash.display.MovieClip;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.text.TextFormat;
import flash.events.MouseEvent;
public class SStore extends MovieClip
{
private var st:TextField;
/*
________________________________________________________________________
Конструктор класса.
________________________________________________________________________
*/ public function SStore()
{
st=new TextField();
st.width = 70;
st.height = 38;
st.y = 10;
st.type = TextFieldType.INPUT;
st.defaultTextFormat = new TextFormat(null,30,0xf04c33,true,null,null,null,null,'center');
st.text = '0';
addChild(st);
st.restrict = '0-9';
st.maxChars = 3;
st.addEventListener(MouseEvent.CLICK,clearStField);
}//end
/*
________________________________________________________________________
Метод clearStField - очистка поля при первом клике мышки.
________________________________________________________________________
Формальный параметр:
e - событие мышки.
________________________________________________________________________
*/ private function clearStField(e:MouseEvent):void
{
st.removeEventListener(MouseEvent.CLICK,clearStField);
st.text = '';
}
/*
________________________________________________________________________
Метод get stock - чтение значения поля st.
________________________________________________________________________
*/ public function get stock():int
{
return int(st.text);
}
/*
________________________________________________________________________
Метод set stock - запись значения в поле st.
________________________________________________________________________
Формальный параметр:
val - значение для установки.
________________________________________________________________________
*/ public function set stock(val:int):void
{
st.text = val.toString();
}
/*
________________________________________________________________________
Метод closeStock - ограничение на запись данных в поле st.
________________________________________________________________________
*/ public function closeStock():void
{
st.selectable = false;
}
}
}
ПРИЛОЖЕНИЕ Б
(обязательное)
Результаты выполнения программы
Рисунок 6.1 – Опорный план
Рисунок 6.2 – Улучшение плана
Рисунок 6.3 – Улучшение плана
Рисунок 6.4 – Улучшение плана
Рисунок 6.5 – Улучшение плана
Рисунок 6.6 – Стоимость оптимального плана
Рисунок 6.7 – Оптимальный план