Этот класс задач связан с выбором конкретных вариантов органи-зации системы с учетом ресурсных ограничений. Как правило, в зада-чах логического выбора используются изменяемые ячейки, которые могут хранить одно из двух значений: 1 или 0, - иначе «выбирать ва-риант организации» или «не выбирать». В математическом програм-мировании такие задачи называются задачами булевского програм-мирования. Использование булевских переменных позволяет сформулировать различные логические ограничения выбора.
Например, выбор одного из 2-х вариантов организации исследуе-мой системы (1,2) может определяться двумя булевскими переменны-ми (Х1, Х2).
Условие выбора только одного из двух вариантов эквивалентно логическому ограничению: Х1+Х2=1. Такое ограничение моделирует условие взаимоисключения.
Условие выбора хотя бы одного из двух вариантов эквивалентно логическому ограничению Х1+Х2>=1.
Если вариант 2 может быть принят только при принятии варианта 1 (взаимообусловленность) следует использовать ограничение Х1>=Х2. Если же вариант 2 должен быть принят при принятии вари-анта 1, вводится ограничение Х2>=Х1.
В качестве примера рассмотрим задачу о выборе варианта капита-ловложений.
Распределение капиталовложений
Проект Распределение капиталовложений Прибыль
Год 1 Год 2 Год 3
1 5 1 8 20
2 4 7 10 40
3 3 9 2 20
4 7 4 10 15
5 8 6 1 30
Максималь-ный объем капиталовло-жений 25 25 25
Рассматриваются пять проектов, которые могут быть осуществле-ны в течение последующих трех лет. Ожидаемые величины прибыли от реализации каждого из проектов и распределение необходимых капиталовложений по годам (в тыс.$.) приведены в таблице. Предпо-лагается, что каждый утвержденный проект будет реализован за трех-летний период. Требуется выбрать совокупность проектов, которой соответствует максимум суммарной прибыли.
Добавим к таблице исходных данных столбец изменяемых ячеек. Обозначим содержимое этих ячеек как Xi, где i=1, 2,..., 5 определяет номер проекта, а Xi определяет решение: вкладывать (Xi=1) или нет (Xi=0) средства в i-ый проект. Такую переменную, принимающую только два возможных значения (1 или 0), называют булевской.
Ограничения:
1) по объему капиталовложений
в первый год: 5* X1 + 4*X2 +3*X3 + 7*X4 + 8*X5 <= 25;
во второй год: 1* X1 + 7*X2 +9*X3 + 4*X4 + 6*X5 <= 25;
в третий год: 8* X1 + 10*X2 +2*X3 + 10*X4 + 1*X5 <= 25;
2) “естественные” ограничения:
X1X5 = двоичные (булевские)
Целевая функция:
Z= 20*X1 + 40*X2 + 20*X3 + 15*X4 + 30*X5;
Максимизировать Z.
Электронная таблица в этом варианте может выглядеть следую-щим образом.
A B C D E F
1 Проект Распределение капиталовложений (тыс.$) Прибыль (тыс.$) Выбор про-екта (1–да, 0–нет)
var s,v,t,a:real; begin writeln('Введите скорость, ускорение и время соотвественно'); read(v,a,t); s:=v*t+(a*sqr(t))/2; writeln('Расстояние S = ',s); end.
Задание №2
var a,b,c,d,m,n:integer; begin writeln('Введите ширину и высоту комнаты'); read(a,b); writeln('Введите размеры окна'); read(c,d); writeln('Введите размеры двери'); read(m,n); writeln('Площадь стен для оклеивания обоями = ',a*b-c*d-m*n); end.
Задание №3
var a,b:real; begin writeln('Введите два числа'); read(a,b); writeln('Среднее арифметическое кубов этих чисел = ',(power(a,3)+power(b,3))/2); writeln('Среднее геометрическое модулей этих чисел = ',sqrt(abs(a*b))); end.
Задание №4
var x:real; begin writeln('Введите ребро куба'); read(x); writeln('Площадь грани = ',sqr(x)); writeln('Площадь полной поверхности = ',6*sqr(x)); writeln('Объем куба = ',power(x,3)); end.
Задание №5
var r1,r2:real; begin writeln('Введите внешний и внутренний радиус'); read(r1,r2); if r1<r2 then writeln('Внешний радиус должен быть больше внутреннего') else writeln('Площадь кольца = ', Pi*sqr(r1)-Pi*sqr(r2)); end.
Begin writeln('Введите первое число'); readln(a); writeln('Введите второе число'); readln(b);
if (a<0) and (b<0) then Begin a:=a+2; b:=b+2; writeln('a = ',a); writeln('b = ',b); end else if (a>0) and (b<0) then writeln('a*b = ',a*b) else if (a<0) and (b>0) then writeln('b-a = ', b-a)
var s,v,t,a:real;
begin
writeln('Введите скорость, ускорение и время соотвественно');
read(v,a,t);
s:=v*t+(a*sqr(t))/2;
writeln('Расстояние S = ',s);
end.
Задание №2
var a,b,c,d,m,n:integer;
begin
writeln('Введите ширину и высоту комнаты');
read(a,b);
writeln('Введите размеры окна');
read(c,d);
writeln('Введите размеры двери');
read(m,n);
writeln('Площадь стен для оклеивания обоями = ',a*b-c*d-m*n);
end.
Задание №3
var a,b:real;
begin
writeln('Введите два числа');
read(a,b);
writeln('Среднее арифметическое кубов этих чисел = ',(power(a,3)+power(b,3))/2);
writeln('Среднее геометрическое модулей этих чисел = ',sqrt(abs(a*b)));
end.
Задание №4
var x:real;
begin
writeln('Введите ребро куба');
read(x);
writeln('Площадь грани = ',sqr(x));
writeln('Площадь полной поверхности = ',6*sqr(x));
writeln('Объем куба = ',power(x,3));
end.
Задание №5
var r1,r2:real;
begin
writeln('Введите внешний и внутренний радиус');
read(r1,r2);
if r1<r2 then writeln('Внешний радиус должен быть больше внутреннего') else
writeln('Площадь кольца = ', Pi*sqr(r1)-Pi*sqr(r2));
end.
uses crt;
var a,b:real;
Begin
writeln('Введите первое число');
readln(a);
writeln('Введите второе число');
readln(b);
if (a<0) and (b<0)
then
Begin
a:=a+2;
b:=b+2;
writeln('a = ',a);
writeln('b = ',b);
end
else
if (a>0) and (b<0)
then
writeln('a*b = ',a*b)
else
if (a<0) and (b>0)
then
writeln('b-a = ', b-a)
else writeln('Ни одно условие не выполняется');
readln;
end.