Металургична компания иска да произведе сплав от 30 процента олово (lead), 30 процента цинк (zinc) и 30 процента калай (tin). Компанията може да закупи различни количества от други сплави (A, B, …, I), които да претопи и да произведе желания продукт. Цената на сплавите и тяхното съдържание на олово, цинк и калай (в проценти) са дадени в Таблица 5.1. Колко и от кои сплави трябва да закупи компанията, за да произведе желаната сплав на минимална цена?
Опростете задачата, като игнорирате изискванията за процент олово и цинк (оставете само изискването за процент калай) и използвайте само сплавите B, C, H, и E. Използвайте графика, за да намерите оптималното решение (Desmos).
Покажи
import pandas as pdalloys = pd.read_excel("excel/Alloys.xlsx")alloys
Таблица 5.1: Съдържание на олово, цинк и калай (в проценти) и цени на наличните сплави
Alloy
A
B
C
D
E
F
G
H
I
0
% Lead
10.0
10.0
40.0
60
30.0
30.0
30.0
50.0
20.0
1
% Zinc
10.0
30.0
50.0
30
30.0
40.0
20.0
40.0
30.0
2
% Tin
80.0
60.0
10.0
10
40.0
30.0
50.0
10.0
50.0
3
Cost USD/kg
4.1
4.3
5.8
6
7.6
7.5
7.3
6.9
7.3
БележкаРешение
Нека x_A, x_B, \ldots, x_I са дяловете от всяка сплав, която купуваме:
Банка е в процес на определяне на кредитната си политика за пет различни сектора с характеристики дадени в следната таблица:
Вид кредит
Лихва
Дял на несъбираеми кредити
Потребителски
0.15
0.10
Автомобили
0.13
0.07
Недвижими имоти
0.12
0.03
Земеделие
0.125
0.05
Търговия
0.10
0.02
Банката има бюджет от общо 12 милиона лева, които може да използва за кредитиране си при определяне на политиката трябва да се съобрази със следните регулации:
Поне 40% от заемите трябва да са за земеделие или търговия.
Заеми за недвижими имоти трябва да са поне половината от общата сума на потребителски кредити, кредити свързани с автомобили и недвижими имоти.
Според регулаторни изисквания дялът на несъбираемите кредити не трябва да надвишава 4% от всички кредити. Несъбираемите кредити не носят лихви.
Какъв е оптималният (най-висока печалба) план за банката?
5.3 Планиране на градско строителство
Да приемем, че София е изправена пред бюджетен дефицит и общинският съвет обмисля как да увеличи приходите от данък сгради чрез преустройство на общински имоти. Проектът се състои от две части – разчистване на занемарени и повредени постройки и построяване на нови жилища.
В момента на планиране общината притежава 300 занемарени постройки, които могат да бъдат съборени. Всяка от тях освобождава 1000 кв. метра и събарянето й струва 3 000 EUR на постройка. 15 процента от освободеното пространство е предвидено за улици, тротоари и свободни пространства.
На освободените парцели общината може да построи четири вида нови жилищни сгради: еднофамилни (300 кв. метра), двуфамилни (500 кв. метра), три-фамилни (700 кв. метра) и четири-фамилни къщи (900 кв. метра). Очакваните данъчни постъпления са съответно 1 000 EUR, 1 700 EUR, 2 400 EUR и 2 800 EUR на година.
Поне 20 процента от новите постройки трябва да са еднофамилни къщи, двуфамилните домове трябва да съставляват поне 20 процента, а три и четири-фамилните домове трябва (заедно) да са поне една четвърт от всички нови постройки.
Строителните разходи за новите домове са съответно 50 000 EUR, 70 000 EUR, 130 000 EUR и 160 000 EUR.
Общината предвижда на финансира проекта чрез банков заем, който не може да надвишава 15 милиона EUR.
Колко от всеки вид къщи трябва да планира да построи общината, така че да постигне възможно най-високи данъчни постъпления?
Използвайте Excel за да намерите оптималното решение.
5.4 Оптимизация на производство (рафинерия)
Рафинерия произвежда три вида безоловен бензин, които се различават по октановото си число (ON): A: обикновен (ON \geq 87), B: премиум (ON \geq 89) и C: супер (ON \geq 92). Преработката на суровия петрол обхваща три компонента.
В първият компонент суровият петрол се дестилира до петролна суровина (feedstock) с октаново число ON = 82. За производството на един барел суровина са нужни 5 барела суров петрол. Капацитетът на дестилационните съоръжения е 1 500 хиляди барела на ден.
Част от петролната суровина се обработва допълнително в термичен крекер, който произвежда бензин с ON = 98. От един барел суровина крекерът произвежда половин барел бензин. Капацитетът на крекера е ограничен до 200 000 барела петролна суровина на ден.
Последният елемент в рафинерията е смесител, който комбинира бензин от крекера и петролна суровина от дестилацията. Октановото число на смеси е приблизително равно на претегленото средно на октановите числа на компонентите им. Пример: от 1 барел с ON=90 и 2 барела с ON=100 ще се получат три барела смес с октаново число (1\times 90 + 2 \times 100) / 3 \approx 96.6
Търсенето на трите вида бензин е ограничено до съответно 50, 30, и 40 хиляди барела на ден.
Рафинерията оценява печалбата от барел бензин на съответно 6, 7 и 8 долара за трите вида бензин, които продава.
Съставете математически модел, на базата на който да препоръчате оптимален (най-висока печалба) производствен план на рафинерията.
Виж Фигура 5.1 за производствената схема на рафинерията.
flowchart LR
A[Дестилация 5:1] -->|ON=82| B[Крекер 2:1]
A --> |ON=82| C
B -->|ON=98| C[Смесител 1:1]
C --> D(ON=87)
C --> E(ON=89)
C --> F(ON=92)
Фигура 5.1: Производствена схема на рафинерията
5.5 Управление на ресторант
Управител на ресторант установява, че през изминалия сезон е реализирана значително по-малка от очакваната печалба. Една от основните причини е неефективно управление на наетия персонал.
При планиране на дейността за следващия период управителят се обръща към вас за съвет как да подобри дейността. Той ви предоставя следната информация:
ресторантът наема сервитьори с различно ниво на опит, като заплащането на сервитьори с опит над 1 година е 15 EUR/час, съответно за опис от 6 месеца до 1 година е 10 EUR/час, а за опит под 6 месеца е 8 EUR/час.
Салонът е организиран в три секции – в първата секция са разположени маси за малки компании (до 4 човека), във втората секция – маси за средни по големина компании (до 8 човека), а в третата секция масите са за големи компании (над 8 човека).
След анализ на данни от предходни сезони вие установявате, че на час средно са били обслужвани по 40 малки, 30 средни и 25 големи маси. През следващия сезон не се очакват промени. Според оценката на двамата помощник-мениджъри, сервитьор с опит над 1 година успява да обслужи една малка маса за сумарно време от 5 минути, една средна маса – за 6 минути, а една голяма маса – за 7.5 минути. Аналогичните данни за сервитьор с опит между 6 месеца и 1 година са 7.5, 10 и 15 минути. Сервитьори с опит по-малък от 6 месеца обслужват само малки и средни маси, като съответното време е 15 минути за малка маса и 30 минути за средна маса.
Вашата задача е да минимизирате разходите за възнаграждения, изплатени на сервитьорите, при условие, че ресторантът винаги трябва да разполага с достатъчно на брой служители, които да обслужват заетите маси.
Нека x, y, z са броя сервитьори с опит под 6 месеца, между 6 и 12 месеца и над 12 месеца. Общите разходи на час за персонал са
\min C(x, y, z) = 8x + 10y + 15z
Да обозначим трите вида маси с S (small), M (medium) и L (large) и броя сервитьори с различен опит, които обслужват малки маси с
x_{S}, y_{S}, z_{S}
Изискването на час да бъдат обслужени поне 40 малки маси можем да изразим така (като от минутите, които са нужни за обслужването на масите изчислим колко маси на час обслужват трите категории сервитьори):
4 x_{S} + 8 y_{S} + 12 z_{S} \geq 40
За средните по големина маси получаваме:
2 x_{M} + 6 y_{M} + 10 z_{M} \geq 30
За големите маси:
0 x_{L} + 4 y_{L} + 8 z_{L} \geq 25
Променливите трябва да са неотрицателни:
x_{S}, x_{M}, x_{L}, y_{S}, \ldots, z_{L} \geq 0
Общият брой на сервитьорите с различен опит получаваме от броя обслужващи маси S, M и L.
\begin{align*}
x & = x_{S} + x_{M} + x_{L} \quad \text{опит под 6 м.}\\
y & = y_{S} + y_{M} + y_{L} \quad \text{опит 6-12 м.}\\
z & = z_{S} + z_{M} + z_{L} \quad \text{опит 6-12 м.}\\
\end{align*}
Restricted license - for non-production use only - expires 2027-11-29
Set parameter LogToConsole to value 0
W1
W2
W3
Required
Tables
Small
15
7.5
5.0
40
Medium
20
10.0
6.0
30
Large
9999
15.0
7.5
25
Покажи
m = gp.Model("Restaurant")w_exp = ["W1", "W2", "W3"]x = m.addVars(dt.index, w_exp, name="x")# Objectivem.setObjective( gp.quicksum(costs[j] * x[i, w_exp[j]] for i in dt.index for j inrange(len(w_exp))), GRB.MINIMIZE,)# Constraintsm.addConstrs( gp.quicksum((60/ dt.loc[i, w_exp[j]]) * x[i, w_exp[j]] for j inrange(len(w_exp))) >= dt.loc[i, "Required"] for i in dt.index)m.write("restaurant.lp")# Print the model# with open("restaurant.lp", "r") as f:# print(f.read())m.optimize()# The solution as a DataFramesolution = pd.DataFrame( {"Tables": [i for i in dt.index for j inrange(len(w_exp))],"Workers": [w_exp[j] for i in dt.index for j inrange(len(w_exp))],"Hours": [x[i, w_exp[j]].X for i in dt.index for j inrange(len(w_exp))], }).set_index("Tables")solution.pivot_table(index="Tables", columns="Workers", values="Hours").fillna(0)