телевизори. Конзоли. Проектори и аксесоари. Технологии. Цифрова телевизия

Коя програма се нарича линейна. Накратко за линейното програмиране. Съставяне на прости програми

По-горе разгледахме различни практически проблеми, които могат да бъдат сведени до схема за линейно програмиране. В някои от тези задачи линейните ограничения имат формата на неравенство, в други - равенства, в трети - и двете.

Тук ще разгледаме задача за линейно програмиране с ограничения за равенство - така наречената основна задача за линейно програмиране (BLP).

В бъдеще ще покажем как можете да преминете от проблем с ограничения на неравенството към OPLP и обратно.

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

Има редица променливи

Необходимо е да се намерят такива неотрицателни стойности на тези променливи, които да удовлетворяват системата от линейни уравнения:

и освен това ще плати до минимум линейна функция

Очевидно случаят, когато линейна функция трябва да бъде обърната не към минимум, а към максимум, може лесно да се сведе до предишния, ако променим знака на функцията и вместо това разгледаме функцията

Нека се съгласим да наричаме всеки набор от променливи допустимо решение на OLP

удовлетворяващи уравнения (2.1).

Оптималното решение ще наричаме едно от допустими решения, при което линейната функция (2.2) се превръща в минимум.

Основният проблем на линейното програмиране не е задължително да има решение.

Може да се окаже, че уравненията (2.1) си противоречат; може да се окаже, че имат решение, но не в областта на неотрицателните стойности. Тогава OLP няма допустими решения. Накрая може да се окаже, че съществуват допустими решения на OLP, но сред тях няма оптимално: функцията L в областта на допустимите решения е неограничена отдолу.

По-късно ще се запознаем с примери за такива характеристики на OPLP.

Нека разгледаме на първо място въпроса за съществуването на допустими решения на ОЛП.

Когато решаваме този проблем, можем да изключим от разглеждането линейната функция L, която трябва да бъде минимизирана - наличието на възможни решения се определя само от уравнения (2.1).

И така, нека има система от уравнения (2.1). Има ли неотрицателни стойности, които удовлетворяват тази система? Този въпрос се разглежда в специален клон на математиката - линейната алгебра.

Нека представим накратко някои разпоредби на линейната алгебра, без да се спираме на доказателствата на съответните теореми

Матрица на система от линейни уравнения

е таблица, съставена от коефициентите за

Разширена матрица на система от линейни уравнения е същата матрица, допълнена с колона от свободни членове:

Рангът на матрица е най-високият порядък на ненулева детерминанта, която може да бъде получена чрез изтриване на някои редове и някои колони от матрицата.

В линейната алгебра е доказано, че за да бъде съвместима системата от линейни уравнения (2.1), е необходимо и достатъчно рангът на матрицата на системата да бъде равен на ранговете на нейната разширена матрица.

Пример 1. Дадена е система от три уравнения с четири неизвестни:

Определете дали тази система е колаборативна?

Решение. Системна матрица:

Разширена матрица:

Нека определим ранга на първата матрица. Не може да бъде по-голямо от 3 (тъй като броят на редовете е 3). Нека създадем някакъв детерминант, като изтрием някоя колона от матрицата, например последната. Получаваме

Изчислявайки този детерминант съгласно добре известното правило, получаваме:

Тази детерминанта не е равна на нула, което означава, че рангът на системната матрица е 3. Очевидно рангът на разширената матрица също е равен на 3, тъй като същата детерминанта може да бъде съставена от елементите на разширена матрица. От равенството на ранговете на матриците следва, че системата от уравнения е непротиворечива.

Пример 2. Изследване на съвместимостта на система от две уравнения с три неизвестни:

Решение. Разширена системна матрица:

(лявата му страна е системната матрица).

Нека намерим ранга на системната матрица, като съставим всички възможни детерминанти от втори ред:

И така, всички възможни детерминанти от втори ред, съставени от елементи на системната матрица, са равни на нула; Това означава, че рангът на тази матрица на системата е

Нека намерим ранга на разширената матрица. Определящо

Следователно рангът на разширената матрица не е равен на ранга на системната матрица: Grfg, следователно системата от уравнения е непоследователна.

Пример 3. Изследвайте съвместимостта на система от три уравнения с четири неизвестни:

Решение Разширена системна матрица (заедно със системната матрица):

Нека намерим ранга на системната матрица. Да вземем детерминант от трети ред, съставен от неговите елементи, например:

Известно е, че ако някой ред от детерминанта е линейна комбинация от други два реда, то детерминантата е равна на нула. В нашия случай третият ред е линейна комбинация от първите два: за да го получите, достатъчно е да добавите първия ред с двойно втория Следователно.

Лесно е да се провери, че всяка детерминанта от трети ред, съставена от елементи на системната матрица, има същото свойство.Следователно рангът на системната матрица е.

Тъй като има ненулева детерминанта от втори ред, например,

тогава рангът на системната матрица е равен на

Използвайки същото разсъждение, ние се уверяваме, че рангът на разширената матрица е равен на две: Следователно системата от уравнения е съвместима

Обърнете внимание, че трите уравнения този примерне са независими: третото може да се получи от първите две чрез умножаване на второто по две и добавяне към първото. Това означава, че третото уравнение е просто следствие от първите две. В системата има само две независими уравнения: това се отразява от факта, че рангът на системната матрица

Така че, ако системата от уравнения-ограничения на OLP е последователна, тогава матрицата на системата и нейната разширена матрица имат еднакъв ранг.

Този общ ранг се нарича ранг на системата; не представлява нищо повече от броя на линейно независимите уравнения сред наложените ограничения.

Очевидно рангът на системата не може да бъде по-голям от броя на уравненията:

Също така е очевидно, че рангът на системата не може да бъде по-голям от общия брой променливи:

Наистина, рангът на системна матрица се определя като най-високия ред на детерминантата, съставена от матрични елементи; тъй като броят на неговите редове е равен на , тогава ; тъй като броят на неговите колони е равен на , тогава .

Структурата на задача за линейно програмиране зависи значително от ранга на системата за ограничения (2.1).

Нека първо разгледаме случая, когато , тоест когато броят на линейно независимите уравнения, включени в системата (2.1), е равен на броя на променливите п. Нека отхвърлим „допълнителните“ уравнения, които са линейни комбинации от други. Системата от уравнения-ограничения на OZLP приема формата:

Тъй като детерминантата, съставена от коефициенти,

не е равно на нула. От алгебрата е известно, че в този случай системата (2.4) има единствено решение. За да намерите количеството, достатъчно е да замените колоната в определителя с колона със свободни членове и да разделите на.

И така, когато системата от уравнения-ограничения на OLP има уникално решение:

Ако в това решение поне една от величините е отрицателна, това означава, че полученото решение е неприемливо и следователно OLP няма решение.

Ако всички величини са неотрицателни, то намереното решение е допустимо. Освен това очевидно е оптимално (защото няма други).

Очевидно този тривиален случай не може да ни интересува.

Следователно в бъдеще ще разглеждаме само случая, когато, т.е. когато броят на независимите уравнения, на които трябва да отговарят променливите, е броят на самите променливи. Тогава, ако системата е последователна, тя има безкрайно много решения. В този случай можем да присвоим произволни стойности на променливите (така наречените безплатни променливи), а останалите променливи ще бъдат изразени чрез тях (ще наречем тези променливи основни).

Една програма се нарича линейна, ако всички нейни оператори се изпълняват последователно, в реда, в който са написани. Това е най-простият тип програма.

Променливи

Променливата е стойност, която, докато програмата работи, може да -

променя значението си. Всички променливи, използвани в програмата, трябва да бъдат описани в раздела за описание на променливи, започвайки с функционалната дума var.

За всяка променлива се посочва нейното име и тип, например:

променливо число: цяло число; x, y: реални; опция: char;

Името на променливата указва мястото в паметта, където се намира стойността на променливата. Името се дава от програмиста. Тя трябва да отразява значението на съхранената стойност и да бъде лесно разпознаваема.

Типът на променливите се избира въз основа на диапазона и изискваната точност на представяне на данните.

Когато декларирате, можете да присвоите на променлива начална стойност, т.е. инициализирамнея. Инициализация означава задаване на стойност, която се изпълнява преди програмата да започне да работи. Инициализираните променливи се декларират след ключова дума const:

const число: цяло число = 100; x: реално = 0,02; опция: char = "yu";

По подразбиране всички променливи, дефинирани в главната програма, са нулирани.

Изрази

Изразът е правило за изчисляване на стойност. Изразът включва -

операнди,обединени от операционни знаци. Операндите на израза могат да бъдат константи, променливи и извиквания на функции. Операциите се извършват в определен ред в съответствие с приоритети,като в математиката. За да промените реда на операциите, използвайте кръгли скоби,нивото на тяхното гнездене е практически неограничено.

Резултатът от израза винаги е стойност от определен тип, който се определя от типовете на операндите. Количествата, включени в израза, трябва да бъдат съвместими видове.

  • 1. Унарна операция не, унарен минус -, вземане на адреса @.
  • 2. Операции тип умножение:* / div mod и shl shr.
  • 3. Операции като събиране: + - или xor.
  • 4. Релационни операции: = o = in.

Първо се оценяват функциите, използвани в израза

Примери за изрази:

t + sin (x)/2 * x - резултатът е от реален тип; А

(x > 0) и (y

Структура на програмата

Програмата на PASCAL се състои от незадължителна заглавка, секция за описание и секция с оператори:

име на програмата; (заглавие) раздели от описания започват раздел от отчети край. (* програмата завършва с точка *)

Програмата може да съдържа коментари,затворен в брекети() или в скоби като (* *).

Общата структура на програмата е показана на фиг. 2.1.

Разделът с изрази съдържа изпълнимите изрази на програмата. Ключовите думи begin и end не са оператори, а служат за обединяването им в т.нар съставен операторили блок.Блокът може да бъде написан навсякъде в програмата, където е приемливо редовно изявление.

Секциите за описание се предлагат в няколко типа: описания на модули, константи, типове, променливи, етикети, процедури и функции.

Модулът е библиотека от ресурси (подпрограми, константи и т.н.), която е свързана с програмата.

Ориз. 2.1.

Секцията за описание на модула, ако присъства, трябва да е първа. Описанието започва с ключовата дума uses, последвана от разделен със запетая списък на всички модули, свързани с програмата, както стандартни, така и ръчно правено, например: използва crt, graph, my_module;

Броят и редът на останалите раздели са произволни; има само едно ограничение: всяка стойност трябва да бъде описана преди нейното използване. Краят на раздел с описание се обозначава с началото на следващия раздел. Една програма може да има няколко раздела за описание от един и същи тип, но за да се опрости структурата на програмата, се препоръчва да се групират всички подобни описания в един раздел.

В раздела за описание на променливи трябва да дефинирате всички променливи, които ще се използват в основната програма.

Секцията за описание на константите се използва, така че вместо стойностите на константите, техните имена да могат да се използват в програмата. Има и друга употреба на раздела за деклариране на константи: той описва променливи, на които трябва да бъде присвоена стойност, преди програмата да може да се изпълни:

const тегло: реално = 61,5; n = 10;

Секцията за описание на етикета започва с ключовата дума label, последвана от разделен със запетаи списък на всички етикети, намерени в програмата. Етикетът е или име, или положително число, което не надвишава 9999. Етикетът се поставя преди всеки изпълним оператор и се отделя от него с двоеточие. Пример за описание на етикет: етикет 1, 2, грешка;

Етикетите се използват за организиране на прехода към конкретен оператор с помощта оператор за безусловен скокгото.

Входно-изходни процедури, с които взаимодейства всяка програма при въвеждане на първоначални данни и извеждане на резултати външни устройства. Набор от стандартни входни и изходни устройства, т.е. клавиатура и екран на дисплея, т.нар конзола.

Въвеждане от клавиатурата. Следните процедури са дефинирани за въвеждане от клавиатурата: read и readln: read(list); readln[(списък)];

Списъкът с имена на променливи, разделени със запетаи, е посочен в скоби. Квадратните скоби показват, че списъкът може да не присъства. Например:

четене (a, b, c); readln(y); readln;

ВНИМАНИЕ!

Можете да въвеждате цели, реални, символни и низови стойности. Входните стойности трябва да бъдат разделени с произволен брой празни знаци (интервал, табулация, преместване на ред).

Въвеждането на стойността на всяка променлива се извършва по следния начин:

  • ? стойността на променливата се маркира като група от знаци, разположени между разделители;
  • ? тези символи се преобразуват във вътрешна форма за представяне, съответстваща на типа на променливата;
  • ? стойността се записва в мястото на паметта, идентифицирано от името на променливата.

Освен това процедурата readln след въвеждане на всички стойности преминава към следващия ред на изходните данни. Процедурата readln без параметри просто изчаква натискането на клавиша Enter.

Характеристики на въвеждане на символи и низовее това бели знаците не се различават от всички останали, така че не могат да бъдат разделители.

Изход на дисплея. При извеждане се извършва обратното преобразуване: от вътрешното представяне към символите, показани на екрана. За тази цел езикът дефинира стандартни процедури write и writeln: write (списък); writeln[(списък)];

Процедурата за запис показва стойностите, посочени в списъка на екрана, а процедурата за запис, в допълнение към това, също премества курсора на следващия ред. Процедурата writeln без параметри просто премества курсора на следващия ред.

Можете да извеждате стойности от логически, цели, реални, символни и низови типове. Списъкът може да съдържа не само имена на променливи, но и изрази, както и техния специален случай - константи. Освен това за всяка изходна стойност можете да я зададете формат,например: writeln(a:4, b:6:2);

След името на променливата АДвоеточие показва броя на позициите, определени за него, в рамките на които стойността е подравнена вдясно. За bпосочени са две спецификации на формата, което означава, че само шест позиции са разпределени за тази променлива, две от които за дробната част.

Линеене програма, която е запис на линеен алгоритъм. В такава програма всички оператори се изпълняват строго последователно, т.е. след изпълнение на всеки от тях (с изключение на END), компютърът автоматично преминава към изпълнение на следващия оператор.

Съставяне на прости програми

Най-простиятще наричаме линейни програми, които не съдържат масиви. Компилирането на такива програми изисква познаване на обсъдените по-рано оператори, разбиране на тяхното съответствие с блоковете на диаграмата на алгоритъма и се извършва съгласно това просто правило:

разгледайте блоковете на диаграмата на алгоритъма (мислим, че е дадено) в ред, започвайки от първия, като за всеки от тях записваме съответния операторОСНОВЕН, т.е.

за блок Започнете- REM оператор с името на програмата;

за блок Въведете -оператор за въвеждане;

за блок процес -оператор за присвояване;

за блок заключение -изходен оператор;

за блок Спри се- оператор END.

Това е цялото правило!

Сега даваме примери за конкретни програми от разглеждания тип.

Задача 12.2

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

Задача 12.3

Пренаредете стойностите на количествата A и B.

Решениезадачи 12.2 и 12.3. Тези проблеми бяха обсъдени в глава 10, така че на фиг. 12.2 е показана без обяснение диаграмата на алгоритъма и програмата на задача 10.2, а на фиг. 12.3 - същото за задача 10.3.

На фиг. 12.2 и 12.3, стрелките показват съответствието на програмните оператори с блоковете на диаграмата на алгоритъма.

Нека представим програми за решаване на още две задачи. Програмата за задача 12.1 илюстрира използването на различни видове величини. Програмата за задача 12.2 демонстрира организацията на извеждане на данни към печатащо устройство.

Ориз. 12.2

Задача 12.1

Изчислете стойности Uи Z по формулите:

Където IN И В - цели количества.

Решение

Изходни данни: E%, V%, C, X, A(a).

Резултат: Y,Z%.

Редът на операциите тук е очевиден, така че нека напишем програмата веднага:

  • 10 REM ЗАДАЧА 1
  • 20 PRINT "ВЪВЕДЕТЕ D%, B%, C, X, A"
  • 30 ВХОД D%,B%, C, X, A 40 R$="HBAH0B, 10A CL"
  • 50 Z%=2*D%-3*B%
  • 60 Y=(3*ABS(X)+C:(1/3)+SIN(A)/COS(A))*Z%
  • 70 ПЕЧАТ "Z%=";Z%; "Y="; Y 80 ПЕЧАТ R$
  • 90 КРАЙ

Задача 12.2

Изчислете стойността на функцията Y = L 2 + В 1и отпечатайте (изведете на принтер) стойностите на първоначалните данни и резултатите.

Решение

Програма за изчисляване на функции Y:

  • 20 REM ПЕЧАТ ИЗХОД 30 ПЕЧАТ "ВЪВЕДЕТЕ A, B"
  • 40 ВХОД A, B 50 U=A L 2+V L 2
  • 60 LPRINT "ДАННИ:"," A=";A;" B=";B 70 LPRINT
  • 80 LPRINT "RESULT:"," Y=";Y 90 END

Операторът в 30-ия ред на тази програма показва текст на екрана на дисплея, а операторите 60-80 - на принтера. Операторът на ред 70 отпечатва празен ред върху лист хартия.

Линейни програми с масиви

Масиви на езика BASIC.Нека си припомним дефиницията на масив: масиве подредена колекция от хомогенни количества, всяко обозначено с едно и също име с различни целочислени индекси, вариращи в ред.

BASIC използва едно- и двумерни масиви (дори осеммерните са приемливи в QBASIC). Те, като прости променливи, могат да бъдат различни видове: цяло число, реално число, текст (низ) и др.

внимание! В BASIC няма операции за обработка на масиви като цяло, т.е. операции от формата “въведете масив P(1:99)”, които сме свикнали да използваме в глави 8 и 9. За да се извърши операция върху масив, е необходимо да се изброят операциите, извършени върху всеки негов елемент.

Нека да разгледаме общия вид на елемент от масив в BASIC:

Където - името на масива трябва да следва същите правила като името на проста променлива;

Да се ​​- индекс(номер) на елемент от едномерен масив, k

аз, j - индексиелемент от двуизмерен масив (номерът на реда и колоната, в пресечната точка на които се намира), i> 0, j> 0. В QBASIC можете да зададете началните стойности на k, i, j до 1. Индексите k, i, j могат да бъдат представени с всякакви аритметични изрази. Когато се оценява израз, представляващ индекс в QBASIC, резултатът се закръгля до най-близкото цяло число.

Примери за запис на елементи от масив:

P$(0), C2(101) , X(4 b.5*K+1) , T%(N/2, M) .

В диаграмата на алгоритъма същите елементи ще имат следните обозначения: P 0,

S2yu1, X46.5?+i, T w /2>m-

внимание! Ако програмата използва масив, той трябва да бъде предварително деклариран, т.е. Компютърът трябва да бъде информиран за типа и размера на този масив с помощта на командата DIM.

Пример: оператор DIM Р$(6), i_iB% (4,8) отчита присъствие в програмата

текстови P(0:6) и цели B(0:4, 0:8) масиви.

Въз основа на информацията, съдържаща се в оператора DIM, компютърът разпределя (резервира) област от паметта с необходимия размер за всеки масив.

Общ изглед на оператора DIM:

В случай на едномерен масив:

DIM (д)

В случай на двуизмерен масив:

DIM (p, w)

където DIM е името на оператора (от думата измерение - "измерение"); - име на масив; d, p, w- размери на масива, т.е. д-номер на последния елемент от едномерен масив; n(m)- номерът на последния ред (последната колона) на двумерен масив.

Размерът на масива се изразява в повечето версии на BASIC (включително QBASIC) като цяло число или цяло число променлива.

Характеристики на запис на оператора DIM:

  • 1) в един DIM израз можете да декларирате произволен брой масиви (вижте примера);
  • 2) командата DIM се препоръчва да се постави в началото на програмата;
  • 3) не трябва да използвате проста променлива и масив с едно и също име в програмата.

Пример:оператор DIM D% (2), A (2,3), K$ (3) докладва:

  • масив D% - едномерно цяло число, съдържащо елементи D%(0), D%(1), D%(2);
  • масив K е едномерен текстов масив, включва елементи K$(0), k$(1), K$(2), K$(3);
  • масив A е двумерен реален масив, включващ следните елементи:

Съставяне на линейни програми с масиви.На първо място, нека отбележим характеристиките на работата с масиви в програмата.

1. На елементите на масива се присвояват стойности, като се използват оператори за въвеждане или присвояване като прости променливи. При въвеждане (извеждане) на масиви операторите за вход (изход) изброяват имената на всички входни (изходни) елементи на масива.

Пример:Програмата за вход и изход за масива P (1:3) може да изглежда така:

  • 20 DIM P(3)
  • 30 ВХОД P(1), P(2), P(3)
  • 40 ПЕЧАТ P(1), P(2), P(3)
  • 50 КРАЙ
  • 2. Всички масиви могат да бъдат разделени на два типа:
    • масиви с постоянен размер(например P(1:7), B(1:4, 1:8)];
    • масиви с променлив размер[например A(1:&); C(1 :T, 1: д).В глави 8 и 9 използвахме и двата типа, без да правим разлика между тях.

В някои версии на BASIC операторът DIM не позволява деклариране на масиви с променлив размер, така че използването им в програма изисква някои трикове. Във версиите на BASIC, разгледани в ръководството, няма такива ограничения, допустимо е използването на масиви от всякакъв тип.

Просто трябва да запомните: променливи - размерите на масива трябва да бъдат определени преди извикване на оператора DIM.

Пример:

10 ВХОД M 20 DIM X(M)

Линейните програми с масиви се компилират в съответствие с разгледаното по-горе правило за съставяне на най-простите програми, което може да бъде допълнено с една точка - „след оператора REM, операторът DIM трябва да бъде написан в програмата“. Освен това трябва да вземете предвид току-що изложената информация за работата с масиви.

Сега ще покажем конструкцията на въпросните програми с помощта на конкретни примери. Първо, нека се върнем на задача 8.5. Алгоритъмната му диаграма е показана на фиг. 10.11. Като заменим всеки блок от тази схема със съответния оператор съгласно правилото, дадено в 12.2, и добавим оператора DIM, получаваме програмата, дадена по-долу. След като се запознаете с тази програма, препоръчваме на читателя сам да създаде програма за решаване на задача 10.7 и да я сравни с тази по-долу:

  • 10 РЕМ СУМА
  • 20 DIM B(3, 3), S(2)
  • 30 PRINT "ВЪВЕДЕТЕ MATER. IN(3, 3)"
  • 4 0 ВХОД B(1, 1), B(1, 2), B(1, 3)
  • 50 ВХОД V(2, 1), V(2, 2), V(2, 3)
  • 60 ВХОД V(3, 1), V(3, 2), V(3, 3)
  • 70 S(l) =B (1, 1)+B(1, 2) +B (1, 3)
  • 80 S (2) =B (1, 3) +B (2, 3)+B (3, 3)
  • 90 ПЕЧАТ "S(1)="; S(1); "S(2)=";
  • S (2)
  • 100 КРАЙ
  • 10 REM SHIFT 20 DIM B(4)
  • 30 PRINT "ВЪВЕДЕТЕ МАСИВА В (4)"
  • 40 ВХОД B(1), B(2),
  • 50 D=B(1)
  • 60 V(1)=V(2)
  • 70 V(2)=V(3)
  • 80V(3)=V(4)
  • 90 V(4)=D
  • 100 PRINT "ARAY B=(";
  • 110 ПЕЧАТ B(1); AT 2);

AT 3) ; AT 4) ; ")"

Контролни въпроси

  • 1. Кой оператор в BASIC показва вида и размера на масива?
  • 2. Каква е нотацията за елементите на масива в BASIC? Какво е като най-малка стойностиндекс на елемент от масив?

Проблеми за самостоятелно решаване

  • 2. Изчислете средноаритметичната стойност на променливите V, C I.
  • 3. Работниците Иванов и Петров изработиха съответно детайли А и Б по време на смяната над нормата. Определете процента на превишаване на нормата (норма - От части на смяна).
  • 4. Определете разликата във възрастта на булките за двама братя Петя и Дима. Тяхната възраст АИ bсъответно. Възрастта на булката се определя по формулата

където (7 е възрастта на младоженеца.

5. Изчислете стойността y:

Където

Да приемем kf 0; g,f 0.

  • 6. Изчислете обема и повърхността на цилиндър с диаметър ОТНОСНОи височина Н.
  • 7. Изчислете стойността на комплект мебели от четири стола, два фотьойла и една маса. Цената на продуктите е съответно A, B и C rub.
  • 8. Да се ​​определи средноаритметичното на елементите на масива C(1:5).
  • 9. Определете произведението на сумите на елементите от всеки ред на матрицата P(1:2, 1:3).
  • 10. Пренаредете съответните елементи от първия и втория ред на матрица A(1:2, 1:2).
  • 11. Пренаредете елементите на масива R(1: 6): 1-ви елемент и 6-ти, 2-ри и 5-ти, 3-ти и 4-ти.

15. Аналитични методи. Методи за линейно програмиране.

15.1. Аналитични методи

През цялата си еволюция човекът, когато извършва определени действия, се стреми да се държи така, че резултатът, постигнат в резултат на някакво действие, да се окаже в известен смисъл най-добрият. Преминавайки от една точка към друга, той търсеше възможно най-краткия път. Когато строи жилище, той търси геометрия, която да осигури приемливи условия на живот с най-малък разход на гориво. Докато строеше кораби, той се опитваше да им придаде форма, в която водата да оказва най-малко съпротивление. Списъкът с подобни примери може лесно да бъде продължен.

Обикновено се наричат ​​най-добрите решения на проблемите в определен смисъл оптимален. Понастоящем нито един повече или по-малко сложен проблем не може да бъде решен без използването на принципи на оптимизация. При поставяне и решаване на оптимизационни проблеми възникват два въпроса: какво и как да оптимизираме?

Отговорът на първия въпрос се получава в резултат на задълбочено проучване на проблема, който трябва да бъде решен. Идентифицира се параметърът, който определя степента на съвършенство на решението на възникналия проблем. Този параметър обикновено се извиква целева функцияили критерий за качество. След това се установява набор от величини, които определят целевата функция. Накрая са формулирани всички ограничения, които трябва да се вземат предвид при решаването на проблема. След това се изгражда математически модел, който се състои в установяване на аналитичната зависимост на целевата функция от всички аргументи и аналитичната формулировка на ограниченията, свързани с проблема. След това започваме да търсим отговор на втория въпрос.

И така, нека в резултат на формализирането на приложния проблем се установи, че целевата функция е , където множеството X е обобщение на ограниченията, то се нарича множество от възможни решения. Същността на задачата за оптимизация е да се търси такова решение на множеството X - множеството от възможни решения
, при която целевата функция f достига своята минимална или максимална стойност.

Неразделна част от методите за оптимизация е линейното програмиране.

15.2. Основни понятия на линейното програмиране

Първото споменаване (1938) на математическите методи в ефективното управление на производството принадлежи на съветския математик Л. В. Канторович. Година по-късно, през 1939 г., Л. В. Канторович публикува работата „Математически методи за организация и планиране на производството“ и практически прилага получените резултати. Терминът "линейно програмиране" е въведен от американските математици J. Danzig и T. Koopmans в края на 40-те години. J. Dantzig разработи математическия апарат на симплексния метод за решаване на задачи на линейното програмиране (1951). За решаване се използва симплексният метод широк обхватпроблеми с линейното програмиране и все още е един от основните методи.

Линейното програмиране е клон на математиката, фокусиран върху намирането на екстремум (максимум или минимум) в проблеми, които се описват с линейни уравнения. Освен това линейните уравнения описват както самата целева функция, така и входните параметри (променливи) и условията на ограничения върху входните параметри. Необходимо условие за проблемите на линейното програмиране е задължителното наличие на ограничения върху ресурсите (суровини, материали, финанси, търсене на произведени продукти и др.). На другите важно условиерешаването на проблема е изборът на критерий за спиране на алгоритъма, т.е. целевата функция трябва да бъде оптимална в някакъв смисъл. Оптималността на целевата функция трябва да се изрази количествено. Ако целевата функция е представена с едно или две уравнения, тогава на практика такива проблеми могат да бъдат решени доста лесно. Критерият за спиране на алгоритъма (или критерият за оптималност) трябва да отговаря на следните изисквания:

    бъдете единствен за дадена задача;

    измерено в количествени единици;

    линейно зависят от входните параметри.

Въз основа на горното можем да формулираме задачата за линейно програмиране в общ вид:

намерете екстремума на целевата функция

при ограничения под формата на равенства:

(2.2)

при ограничения под формата на неравенства:

(2.3)

и условия на неотрицателност на входните параметри:

Накратко проблемът с линейното програмиране може да бъде написан по следния начин:

(2.5)

предвид това

Където
- входни променливи;

Числата са положителни, отрицателни и равни на нула.

В матрична форма този проблем може да бъде написан по следния начин:

Проблемите с линейното програмиране могат да се решават аналитично и графично.

15.3. Проблем с канонично линейно програмиране

, i=1,…,m,

, j=1,…,n.

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

15.4. Обща задача за линейно програмиране

Необходимо е да се максимизира (минимизира) линейна функция на нпроменливи.

под ограничения

, аз=1,…, к,

, аз=1+ к,…, м,

, …,

Тук км, rн. Стандартната задача се получава като частен случай на общата с к= м, r= н; каноничен – при к=0, r= н.

Пример.

Сладкарската фабрика произвежда няколко вида сладкиши. Нека ги наречем "A", "B" и "C". Известно е, че продажбата на десет килограма сладки "А" дава печалба от 90 рубли, "Б" - 100 рубли и "С" - 160 рубли. Бонбоните могат да се произвеждат във всякакви количества (продажбите са гарантирани), но доставките на суровини са ограничени. Необходимо е да се определи какъв вид сладкиши и колко десетки килограма трябва да бъдат произведени, така че общата печалба от продажбите да бъде максимална. Разходните норми на суровини за производството на 10 kg сладкиши от всеки вид са дадени в таблица 1.

Таблица 1. Разход на суровини

за производство

Икономико-математическата постановка на задачата има формата

Намерете такива променливи стойности X=(x1, x2, x3), да се

целева функция

при условия-ограничения:

Програмите, състоящи се от прости команди (оператори), се наричат ​​линейни.
Простите команди (прости инструкции на алгоритъма) са команди, които не използват условия по време на тяхното изпълнение. Към номера прости операторивключват команди (оператори) за присвояване, въвеждане и извеждане, извикване на спомагателен алгоритъм (подпрограма).

Оператор за присвояване. Той задава или променя текущата стойност на някаква променлива. Това променя съдържанието на конкретен елемент от паметта, разпределен за тази променлива. Тъй като целта на всеки алгоритъм е да получи желаната стойност в определено място в паметта, почти всяка програма съдържа този оператор. I/O оператори. Стандартните процедури за въвеждане на данни се използват за определяне на първоначалните стойности на определени променливи и се състоят от име на процедура и списък за въвеждане, съдържащ имената на променливите, чиито стойности ще бъдат въведени от клавиатурата или от файл, т.е. На променливите ще бъдат присвоени специфични стойности.
По-често, за да определите началните стойности, е по-удобно да използвате командата за въвеждане, а не командата за присвояване, тъй като ако трябва да използвате програмата с различни начални данни, не е необходимо да променяте текста на програмата.
Ако записът на алгоритъма съдържа входна команда, тогава нейното изпълнение се прекъсва и управлението се прехвърля към програма, която може да въвежда данни. След въвеждане на данните управлението се прехвърля към следващата команда на алгоритъма.
В Pascal процедурата за въвеждане на данни изглежда така:
READ(списък за въвеждане);
READLN (списък за въвеждане).
При изпълнение на процедурите READ и READLN програмата влиза в състояние на изчакване за въвеждане на данни. Ако в списъка за въвеждане са посочени няколко променливи, те могат да бъдат въведени на един ред, разделени една от друга с интервал, или на отделни редове (в колона), като завършвате въвеждането на всяка стойност с клавиша Enter.
Процедурата няма да завърши, докато не бъдат въведени стойности за всички променливи в списъка. Типът на въведените стойности трябва да съвпада с този на съответната променлива.
Операторът READLN се различава от оператора READ по това, че след въвеждане на необходимото количество данни, курсорът се премества на следващия ред.
Ако данните се въвеждат от клавиатурата, тогава списъкът за въвеждане е списък от променливи, т.е. поредица от имена на променливи, разделени със запетаи. Ако входът е от файл, тогава първата променлива във входния списък е файловата променлива, свързана с името на истинския файл.
Стандартните процедури за извеждане на резултатите от изчисленията се използват за показване на техните стойности на екран, принтер или файл. В Pascal процедурите за извод изглеждат така:
WRITE(изходен списък);
WRITELN (изходен списък).
Списъкът с изходни елементи е много по-широк, отколкото при входните процедури. Това може да включва:
идентификатори на количества, чиито стойности ще бъдат изведени към съответното устройство или файл;
изрази, чиято стойност първо ще бъде изчислена и след това изведена на устройството;
станаха стойности (числови, символни, низови).
Разликата между WRITE и WRITELN е, че изходът на командата WRITE започва от текущото местоположение на курсора на екрана на монитора и курсорът остава на същия ред, след като изходът приключи. Операторът WRITELN отпечатва стойностите от текущата позиция и след това курсорът се премества на следващия ред. Можете да използвате командата WRITELN без изходен списък, за да преместите курсора на нов ред.
Ако изходът е към екран на монитор, тогава изходният списък е списък от променливи или поредица от имена на променливи, константи или изрази, разделени със запетаи. Ако изходът е към файл, тогава първата променлива в изходния списък е файловата променлива, свързана с името на истинския файл.
В командата за изход, след елемента за изходен списък, можете да посочите изходния формат, разделен с двоеточие, т.е. ширината на екрана, на който ще бъдат разположени стойностите. Когато показвате реални данни, можете също да посочите броя на десетичните цифри в дробната част, която искате да покажете.
Пример: напиши (A: 10: 3, B: 8).
Оператор за извикване на спомагателен алгоритъм. Pascal имплементира процедурни подпрограми и функционални подпрограми. Подпрограмата се извиква с нейното име, което показва действителните параметри. В този случай на мястото на действителните аргументи може да има конкретни стойности, имена на действителни променливи, изрази, а на мястото на резултатите - само имена на действителни променливи. В този случай броят, видовете и предназначението на формалните и действителните параметри в съответните списъци с параметри трябва да съвпадат.



Свързани публикации