Задача о рационе питания задача о диете

Пример №1. Бройлерное хозяйство птицеводческой фермы насчитывает 20 000 цыплят, которые выращиваются до 8-недельного возраста и после соответствующей обработки поступают в продажу.
Недельный расход корма в среднем (за 8 недель) составляет 500г = 0.5 кг.

Для того, чтобы цыплята достигли к 8-й неделе необходимого веса, кормовой рацион должен удовлетворять определённым требованиям по питательности.
Этим требованиям могут соответствовать смеси различных видов кормов, или ингредиентов.

В таблице приведены данные, характеризующие содержание (по весу) питательных веществ в каждом из ингредиентов и удельную стоимость каждого ингредиента. Смесь должна содержать:

  • не менее 0.8% кальция (от общего веса смеси)
  • не менее 22% белка  (от общего веса смеси)
  • не более 5% клетчатки (от общего веса смеси )

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

ИнгредиентСодержание питательных веществ (кг/ингредиента)Стоимость (руб./кг)
КальцийБелокКлетчатка
Известняк
Зерно
Соевые бобы
0.38
0.001
0.002

0.09
0.5

0.02
0.08
0.04
0.15
0.40

Математическая формулировка задачи. Введём следующие обозначения:

X 1 – содержание известняка в смеси (кг);

Х2 – содержание зерна в смеси (кг);

Х3 – содержание соевых бобов в смеси (кг);

Общий вес смеси, еженедельно расходуемый на кормление цыплят: 20 000 х 0.5 = 10 000 кг.

Ограничения, связанные с содержанием кальция, белка и клетчатки в кормовом рационе, имеют вид:

0.38X1 + 0.001Х2 + 0.002Х3 ≥ 0.008 х 10 000,

0.09Х2 + 0.50Х3 ≥ 0.22 х 10 000,

0.02Х2+ 0.08Х3 ≤ 0.05 х 10 000.

Окончательный вид математической формулировки задачи:

min f(X) = 0.04 x1 + 0.15Х2 +0,40Х3

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

Х1+Х2+Х3= 10 000

0.38Х1 + 0.001Х2 + 0.002Х3 ≥ 80

0.09Х2+ 0.50Х3 ≥ 2200

0.02Х2+ 0.08Х3 ≤ 500

Xj > 0,  j = 1, 2, 3.

Перейти к решению симплекс-методом

Задача о составлении рациона (задача о диете, задача о смесях)

Пример №1. Имеется два вида продукции П1 и П2, содержащие питательные вещества S1, S2, S3, S4 (жиры, белки, углеводы, витамины). Содержание числа единиц питательных веществ в единице каждого вида продукции и необходимый минимум питательных веществ приведены в табл. 2.

Таблица 2

Питательные вещества

Число единиц питательных веществ в единице продукции

Необходимый минимум питательных веществ

П1П2
S11210
S2328
S3219
S42211

Стоимость единицы продукции П1 и П2 соответственно равна 3 и 4 д.е.

Решение. Обозначим через х1 и х2 – количество продукции П1 и П2, входящей в дневной рацион. Тогда общая стоимость рациона составит (д.е.)

F = 3×1 + 4×2. (5)

С учетом необходимого минимума питательных веществ составим систему ограничений. Рацион включает (x1 + 2×2) единиц питательного вещества S1, (3×1 + 2×2) единиц питательного вещества S2, (2×1 + x2) единиц питательного вещества S3 и (2×1 + 2×2) единиц питательного вещества S4. Так как содержание питательных веществ S1, S2, S3, S4 в рационе должно быть не менее 10, 8, 9, 11 единиц, соответственно, то получим систему ограничений неравенств:

x1+2×2 ≥ 10 (6)

3×1+2×2 ≥ 8

2×1+x2 ≥ 9

2×1+2×2 ≥ 11

x1 ≥ 0, x2 ≥ 0

Итак, экономико-математическая модель задачи: составить дневной рацион , удовлетворяющий системе ограничений (6), при котором функция (5) принимает минимальное значение.

Сформулируем данную задачу в общей постановке.

Обозначим через xj (j = 1, 2,…, n) – количество единиц j-го продукта в дневном рационе. В рационе используется n видов продуктов. Каждый продукт содержит m питательных веществ в количестве не менее bi (i = 1,2,…,m) единиц, aij – число единиц питательного вещества si в единице продукта j-го вида. Известна стоимость cj единицы j-го продукта. Необходимо составить рацион нужной питательности при минимальных затратах на него.

Экономико-математическая модель примет вид:

F=c1x1+c2x2+…+cnxn→(min) (7)

(8)

Замечание 1. Целевую функцию (7) и систему ограничений неравенств можно записать, используя знак ∑ (суммы).

(9)

(10)

Замечание 2. В задаче составления рациона (диеты, кормовой смеси) могут использоваться ограничения не только по необходимому минимуму питательных веществ, но и по минимальному общему весу смеси.

Например. Некоторая фирма имеет возможность купить n различных видов сырья и приготавливать различные виды смесей (продуктов). Каждый вид сырья содержит разное количество питательных веществ. Установлено, что продукция должна удовлетворять некоторым минимальным требованиям с точки зрения питательности (полезности). Необходимо определить количество каждого j-го вида сырья, образующего смесь минимальной стоимости при соблюдении требований к общему расходу смеси и её питательность.

Экономико-математическая модель задачи будет иметь вид:

,

при ограничениях: на общий расход смеси
на питательность смеси

на не отрицательность переменных

xj≥0, j=1,2,…n,

где xj – количество j-го сырья в смеси;

n – количество видов сырья;

m – количество питательных веществ;

aij – количество i-го питательного вещества, содержащегося в единице j-го вида сырья;

b1 – минимальное количество i-го питательного вещества, содержащегося в единице смеси;

cj – стоимость единицы сырья j;

q – минимальный общий вид смеси.

Пример №3. В заводской лаборатории создается антифрикционный сплав (оловянистый баббит), который должен содержать: олова – не меньше 15%, сурьмы – не меньше 15%, свинца – около 70%. Есть четыре сплава, процентный состав и цены на которые приведенные в таблице:

ЭлементыСплав
1234
Олово12201220
Сурьма12181814
Свинец76627066
Цена на 1 кг3,55,24,04,6

Рассчитать количество элементов для сплава каждого вида, необходимое для 1 кг смеси, которая бы обеспечила минимальные затраты.

Решение

Составим экономико-математическую модель задачи.

Обозначим через

x1 – количество сплава 1, кг

x2 – количество сплава 2, кг

x3 – количество сплава 3, кг

x4 – количество сплава 4, кг

Система ограничений по содержанию

12×1 + 20×2 + 12×3 + 20×4 ≥ 15(x1 + x2 + x3 + x4)

12×1 + 18×2 + 18×3 + 14×4 ≥ 15(x1 + x2 + x3 + x4)

76×1 + 62×2 + 70×3 + 66×4 = 70(x1 + x2 + x3 + x4)

Ограничение по количеству

x1 + x2 + x3 + x4 = 1 (кг)

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

3,5×1 + 5,2×2 + 4×3 + 4,6×4  → min

Ответ: x1 = 0,25; x2 = 0; x3 = 0,375; x4 = 0,375 (решение можно получить через калькулятор или средствами Excel).

Пример №4. Для сохранения здоровья и работоспособности человек должен в сутки потреблять не менее 63 усл.ед. белков, не менее 147 усл.ед. жиров и не менее 126 усл.ед. углеводов. Для простоты допустим, что имеется всего два вида продуктов и ; стоимость единицы каждого из них равна соответственно 12 и 9 ден.ед. Содержание названных питательных веществ в различных продуктах неодинаково. Предположим, что в единице продукта содержится 9 усл.ед. белков, 7 усл.ед. жиров 9 усл.ед. углеводов; а в единице продукта содержится соответственно 3, 21, 10 усл.ед. тех же питательных веществ. Требуется:

  1. составить экономико-математическую модель задачи, позволяющую сформировать из продуктов и суточную диету, которая с одной стороны содержала бы белков, жиров и углеводов не менее минимально научно обоснованных норм и вместе с тем требовала бы минимальных затрат;
  2. решить задачу графическим способом.

Решение.

x1 – продукт 1, x2 – продукт 2,

Целевая функция: 12×1+9×2 → min

Система ограничений:

9×1+3×2 ≥ 63

7×1+21×2 ≥ 147

9×1+10×2 ≥ 126

Задача о смесях

Постановка задачи: N ингредиентов – y1, y2, y3, y4. В результате смешивания этих ингредиентов в пропорциях g11:g12:g13:g14, g21:g22:g23:g24, g31:g32:g33:g34 и g41:g42:g43:g44 получают смесь n сортов x1, x2, x3, x4. Цена его реализации соответственно s1, s2, s3, s4.

Экономико-математическая модель задачи

Компоненты

Сорта

Объем ресурсов

x1

x2

x3

x4

N1

g11/Σg1i

g21/Σg2i

g31/Σg3i

g41/Σg4i

y1

N2

g12/Σg1i

g22/Σg2i

g32/Σg3i

g42/Σg4i

y2

N3

g13/Σg1i

g23/Σg2i

g33/Σg3i

g43/Σg4i

y3

N4

g14/Σg1i

g24/Σg2i

g34/Σg3i

g44/Σg4i

y4

Цена

s1

s2

s3

s4

Σg1i = g11 + g12 + g13 + g14

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

F(x) = s1x1 + s2x2 + s3x3 + s4x4 → max

Ограничения

x1g11/Σg1i + x2g21/Σg2i + x3g31/Σg3i + x4g41/Σg4i ≤ y1
x1g12/Σg1i + x2g22/Σg2i + x3g32/Σg3i + x4g42/Σg4i ≤ y2
x1g13/Σg1i + x2g23/Σg2i + x3g33/Σg3i + x4g43/Σg4i ≤ y3
x1g14/Σg1i + x2g24/Σg2i + x3g34/Σg3i + x4g44/Σg4i ≤ y4

Перейти к составлению условий онлайн

Пример. Завод выпускает 4 вида полуфабрикатов Bi в количествах: В1 – 400 т, В2 – 250 т, В3 – 350 т и В4 – 100 т.

В результате смешения этих компонентов получают 3 вида продукции Aj. Пропорции смешиваемых полуфабрикатов следующие: для А1 – 2:3:5:2, для А2 – 3:1:2:1, для A3 – 2:2:1:3. Стоимость 1 т продукции Aj составляет: А1 – 12 руб., А2 – 10 руб., А3 – 15 руб.

Составить оптимальный план выпуска продукции по критерию:

а) максимальной стоимости выпущенной продукции;

б) максимального использования полуфабрикатов

Задача об оптимальном составе бетонной смеси

Для приготовления b0 кг бетонной смеси c заданными свойствами используются три вещества Аj (j = 1, 2, 3). В xj кг каждого вещества Аj содержится aijxj кг химического элемента Bi (i = 1, 2). Содержание элемента Bi в смеси должно находиться в пределах от bi1 до bi2 кг. Стоимость 1 кг каждого вещества Aj составляет cj руб.

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

A1A2A3Нижняя границаВерхняя граница
a11a12a13b1b1
a21a22a23b2b2
c1c2c3  

Источник



В поисках оптимальной диеты методом линейного программирования -2

Разработка под Windows, Математика, Python

Задача о рационе питания задача о диете
Задача о рационе питания задача о диете

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

Должна ли диета быть экономной?

Для поддержания нормальной жизнедеятельности человеку необходимо потреблять в день не менее 118 г белков, 56 г жиров, 500 г углеводов и 28 г минеральных солей. Эти питательные вещества содержатся в разных количествах и разных пищевых продуктах.

В таблице приведено количество питательных веществ в различных продуктах в г/кг и цена этих продуктов за 1 кг. Необходимо составить дневной рацион, содержащий минимальную суточную норму питательных веществ при минимальной их стоимости.

Обозначив через: Х1 –количество мяса; Х2- количество рыбы; Х3- количество молока; Х4- количество масла; Х5- количество сыра; Х6- количество крупы; Х7- количество картофеля, потребляемых человеком в день. Можем составить уравнение общей стоимости F питания в день:
F=333*X1+308*X2+52*X3+400*X4+450*X5+56*X6+25*X7

Нам нужно найти минимум F.
Суммарное количество белков в рационе человека должно быть не меньше 118 г. Отсюда,
180*X1+190*X2+30*X3+10*X4+260*X5+130*X6+21*X7?118

Такие же неравенства составляем для жиров, углеводов и солей. Имеем:
20*X1+3*X2+40*X3+865*X4+310*X5+30*X6+2*X7?56
50*X3+6*X4+20*X5+650*X6+200*X7?500
9*X1+10*X2+7*X3+12*X4+60*X5+20*X6+10*X7?28

Решим задачу на Python

from cvxopt.modeling import variable, op
import time
start = time.time()
x = variable(7, ‘x’)
z=(333*x[0] + 308*x[1] +52* x[2] +400*x[3] +450*x[4] +56* x[5]+20*x[6])
mass1 =(- (180*x[0] + 190*x[1] +30* x[2] +10*x[3] +260*x[4] +130* x[5]+21*x[6]) <= -118)
mass2 =(- (20*x[0] + 3*x[1] +40* x[2] +865*x[3] +310*x[4] +30* x[5]+2*x[6]) <= -56)
mass3 =(- (50* x[2] +6*x[3] +20*x[4] +650* x[5]+200*x[6]) <= -500)
mass4 =(- (9*x[0] + 10*x[1] +7* x[2] +12*x[3] +60*x[4] +20* x[5]+10*x[6]) <= -28)
x_non_negative = (x >= 0)
problem =op(z,[mass1,mass2,mass3,mass4 ,x_non_negative])
problem.solve(solver=’glpk’)
problem.status
print(“Результат:”)
print(round(1000*x.value[0],1),’-грамм мяса, затраты -‘,round(x.value[0]*333,1),’руб.’)
print(round(1000*x.value[1],1),’-грамм рыбы, затраты -‘,round(x.value[1]*308,1),’руб.’)
print(round(1000*x.value[2],1),’-миллилитров молока, затраты -‘,round(x.value[2]*52,1),’руб.’)
print(round(1000*x.value[3],1),’-грамм масла, затраты -‘,round(x.value[3]*400,1),’руб.’)
print(round(1000*x.value[4],1),’-грамм сыр, затраты -‘,round(x.value[4]*450,1),’руб.’)
print(round(1000*x.value[5],1),’-грамм крупы, затраты -‘,round(x.value[5]*56,1),’руб.’)
print(round(1000*x.value[6],1),’-грамм картофеля, затраты -‘,round(x.value[6]*25,1),’руб.’)
print(round(problem.objective.value()[0],1),”- стоимость рациона одного человека в день”)
stop = time.time()
print (“Время :”,round(stop-start,3))

Следует отметить некоторые особенности написания программы с использованием модуля cvxopt. Modeling: все переменные сохраняются в списках, а индексы списков начинаются не с 1, а с 0; в условиях, которые записываются в виде нестрогих неравенств должно быть установлено ограничение сверху, поэтому, для перехода от ограничения снизу, обе части неравенств умножены на -1.

Результат:

0.0 -грамм мяса, затраты — 0.0 руб.
0.0 -грамм рыбы, затраты — 0.0 руб.
0.0 -миллилитров молока, затраты — 0.0 руб.
38.0 -грамм масла, затраты — 15.2 руб.
-0.0 -грамм сыр, затраты — -0.0 руб.
679.3 -грамм крупы, затраты — 38.0 руб.
1395.9 -грамм картофеля, затраты — 34.9 руб.
81.1 — стоимость рациона одного человека в день
Время: 0.09

Анализ результатов показывает: ни мяса, ни рыбы- крупа, масло и картофель — вот такое линейное программирование. Вряд ли такой рацион можно рассматривать серьёзно, но для общности анализа пусть будет. А мы продолжим поиск.

Должна ли диета быть калорийной?

Для определённости предположим, что в качестве исходных продуктов рассмотрим хлеб, мясо, сыр, бананы, огурцы, помидоры, виноград – всего семь продуктов. В качестве питательных веществ – белки, жира, углеводы.

Калорийность одной весовой единицы каждого из продуктов следующая: c1=2060, c2=2430, c3=3600, c4=890, c5=140, c6=230, c7=650.

Содержание питательных веществ в продуктах питания поместим в следующую таблицу.

Минимальная суточная потребность человека в питательных веществах следующая: в белках b1=100, в жирах b2=70, в углеводах b3=400.

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

Обозначив через: x1 –количество хлеба; x2- количество мяса; x3- количество сыра; x4- количество бананов; x5- количество огурцов; x6- количество помидоров; x7- количество винограда, потребляемых человеком в день в килограммах.

Можем составить уравнение общей калорийности F питания в день:
F=2060*x1 + 2430*x2 +3600* x3+890*x4 +140*x5 +230* x6+650*x7

Нам нужно найти минимум F.
Суммарное количество белков в рационе человека должно быть не меньше 100 г. Отсюда
61*x1+ 220*x2 +230* x3 +15*x4 +8*x5 +11* x6+6*x7 ?100

Такие же неравенства составляем для жиров и углеводов. Имеем:
12*x1 +172*x2 +290* x3+1*x4 +1*x5 +2* x6+2*x7 ?70
420*x1 +0*x2 +0* x3 +212*x4+26*x5 +38* x6+155*x7 ?400

Решим задачу на Python

from cvxopt.modeling import variable, op
import time
start = time.time()
x = variable(7, ‘x’)
z=(333*x[0] + 308*x[1] +52* x[2] +400*x[3] +450*x[4] +56* x[5]+20*x[6])
mass1 =(- (180*x[0] + 190*x[1] +30* x[2] +10*x[3] +260*x[4] +130* x[5]+21*x[6]) <= -118)
mass2 =(- (20*x[0] + 3*x[1] +40* x[2] +865*x[3] +310*x[4] +30* x[5]+2*x[6]) <= -56)
mass3 =(- (50* x[2] +6*x[3] +20*x[4] +650* x[5]+200*x[6]) <= -500)
mass4 =(- (9*x[0] + 10*x[1] +7* x[2] +12*x[3] +60*x[4] +20* x[5]+10*x[6]) <= -28)
x_non_negative = (x >= 0)
problem =op(z,[mass1,mass2,mass3,mass4 ,x_non_negative])
problem.solve(solver=’glpk’)
problem.status
print(“Результат:”)
print(round(1000*x.value[0],1),’-грамм хлеба’)
print(round(1000*x.value[1],1),’-грамм мяса’)
print(round(1000*x.value[2],1),’-грамм сыра’)
print(round(1000*x.value[3],1),’-грамм бананов’)
print(round(1000*x.value[4],1),’-грамм огурцов’)
print(round(1000*x.value[5],1),’-грамм помидоров’)
print(round(1000*x.value[6],1),’-грамм винограда’)
print(round(problem.objective.value()[0],1),”-Калорийность рациона одного человека в день”)
stop = time.time()
print (“Время :”,round(stop-start,3))

Результат:

0.0 -грамм хлеба
211.5 -грамм мяса
109.4 -грамм сыра
1886.8 -грамм бананов
0.0 -грамм огурцов
0.0 -грамм помидоров
0.0 -грамм винограда
2587.1 -килокалорий -калорийность
рациона одного человека в день
Время: 0.06

Анализ результатов решения показывает, что для удовлетворения суточной потребности в питательных веществах (белки, жиры, углеводы), следует использовать 211 грамм мяса баранины, 109 грамм сыра, 1887 грамм бананов, совсем отказаться от хлеба, огурцов, помидоров и винограда. При этом общая калорийность найденной оптимальной диеты будет равна 2587 килокалорий, что вполне соответствует малоактивному образу жизни без существенных физических нагрузок. Напомним, что согласно медицинским данным, энергетические затраты работников умственного труда (программисты, юристы, врачи, педагоги, бухгалтера) лежат в пределах 3000 килокалорий.

Содержательный анализ результатов задачи об оптимальной диете явно выявляет недостатки рассмотренной математической модели. С одной стороны, для вкусной и питательной пищи не всегда приемлемым оказывается ограниченный рацион продуктов питания, который совершенно игнорирует индивидуальные предпочтения при выборе отдельных продуктов. С другой стороны, найденное оптимальное решение (мясо + сыр + бананы) для многих покажется однообразным и способным повергнуть в уныние даже пациентов больницы. Наконец, рассмотренная математическая модель задачи об оптимальной диете не учитывает суточную потребность в витаминах и микроэлементах, учет которых может существенно повлиять на выбор оптимального состава продуктов.

Что можно предложить заинтересованному читателю?

Заинтересованным читателям данной публикации в качестве упражнения предлагается рассмотреть собственную постановку задачи об оптимальной диете, отражающую их индивидуальные предпочтения в выборе тех или иных продуктов. При этом условия задачи можно несколько изменить, включив в качестве одного из ограничений общую калорийность диеты, а в качестве целевой функции рассмотреть общую массу наиболее предпочтительных продуктов.

Решение задачи на Python (только как пример)

from cvxopt.modeling import variable, op
import time
start = time.time()
x = variable(7, ‘x’)
z=( x[0] + x[1] +x[2] +x[3] +x[4] +x[5]+x[6])
mass1 =(- (61*x[0] + 220*x[1] +230* x[2] +15*x[3] +8*x[4] +11* x[5]+6*x[6]) <= -100)
mass2 =(- (12*x[0] +172*x[1] +290* x[2] +1*x[3] +1*x[4] +2* x[5]+2*x[6]) <= -70)
mass3 =(- (420*x[0] +0*x[1] +0* x[2] +212*x[3] +26*x[4] +38* x[5]+155*x[6]) <= -400)
mass4 =(-( 2060*x[0] + 2430*x[1] +3600* x[2] +890*x[3] +140*x[4] +230* x[5]+650*x[6]) <= -3000)
x_non_negative = (x >= 0)
problem =op(z,[mass1,mass2,mass3, mass4,x_non_negative])
problem.solve(solver=’glpk’)
problem.status
print(“Результат:”)
print(round(1000*x.value[0],1),’-грамм хлеба’)
print(round(1000*x.value[1],1),’-грамм мяса’)
print(round(1000*x.value[2],1),’-грамм сыра’)
print(round(1000*x.value[3],1),’-грамм бананов’)
print(round(1000*x.value[4],1),’-грамм огурцов’)
print(round(1000*x.value[5],1),’-грамм помидоров’)
print(round(1000*x.value[6],1),’-грамм винограда’)
print(round(problem.objective.value()[0],1),”-килограмм-общая масса продуктов из n рациона одного человека в день”)
stop = time.time()
print (“Время :”,round(stop-start,3))

Результат:

952.4 -грамм хлеба
0.0 -грамм мяса
288.4 -грамм сыра
0.0 -грамм бананов
0.0 -грамм огурцов
0.0 -грамм помидоров
0.0 -грамм винограда
1.2 -килограмм-общая масса продуктов из
рациона одного человека в день
Время: 0.051

Это мне напоминает рацион долгожителей высокогорных районов лепёшки на козьем молоке и сыр того же происхождения, но воспоминания скорее всего обманчивы, поскольку список продуктов явно не оттуда.

Вместо вывода

Несмотря на выявленные недостатки рассмотренной математической модели задачи об оптимальной диете, найденное оптимальное решение в точности соответствует исходной постановке задачи. Это свидетельствует о достаточно высокой точности решения задач линейного программирования при помощи библиотеки cvxopt. Modeling Python.
Интерфейс программы настолько простой и наглядный, что не требует каких-либо дополнительных навыков. Достаточно скачать и установить последнюю версию Python, например, с сайта [1], а библиотеку cvxopt с сайта [2]. Затем создать файл с расширением py и поместить в него любую из приведенных в статье программ, предварительно модифицировав её под свою задачу с новой функцией цели и ограничениями.

Ссылки

  1. Python.
  2. Windows binaries for python.



Источник