#model #glpk
#Модель #glpk
Вопрос:
Моя задача заключается в следующем:
Есть инвесторы, которые хотят инвестировать в фондовый рынок. Мы знаем цены акций вперед на данный момент времени, и они дали сумму денег для инвестирования. Найдите способ максимизировать прибыль к концу этого времени.
Я стараюсь сделать так, чтобы при добавлении большего количества инвесторов в набор создавалось впечатление, что вы запускаете модель только с одним инвестором, но так много раз.
Например (код ниже): если набор инвесторов состоит только из Оливера, у которого 100 денег, прибыль составит 3424. Если набор инвесторов состоит только из Emma, у которых 150 денег, прибыль составит 5337. Но если я помещу их оба в набор, прибыль Оливера составит 3424, а Эммы — только 1979. Моя цель — быть таким же, как если бы он был один.
Я думаю, что проблема связана с функцией максимизации, но я не уверен.
param numberOfWeeks := 12;
set Weeks := 1..numberOfWeeks;
set Stocks;
set Investors;
param priceOfStocks{Stocks, Weeks};
param HowMuchCanInvest{Investors};
# Buying is a positive number, selling is negative
var buySell{Stocks, Weeks, Investors} integer;
s.t. CannotSpendMoreThanWeHave{w in Weeks, i in Investors}:
sum{w2 in 1..w, s in Stocks} buySell[s, w2, i] * priceOfStocks[s, w2] <= HowMuchCanInvest[i];
s.t. OnlySellStocksWeHave{w in Weeks, s in Stocks, i in Investors}:
sum{w2 in 1..w} buySell[s, w2, i] >= 0;
maximize ProfitAtTheEnd{i in Investors}:
0 - (sum{w in Weeks, s in Stocks} buySell[s, w, i] * priceOfStocks[s, w]);
solve;
for{i in Investors}{
printf "%sn", i;
for{w in Weeks}{
printf "Week %d", w, "n";
printf "tBuy: ";
for{s in Stocks: buySell[s, w, i] > 0}{
printf "%s(%d)", s, buySell[s, w, i];
}
printf "n";
printf "tSell: ";
for{s in Stocks: buySell[s, w, i] < 0}{
printf "%s(%d)", s, -buySell[s, w, i];
}
printf "n";
}
printf "%s: %d", i, ProfitAtTheEnd[i];
printf "n";
}
data;
set Stocks := OTP MOL AMZN GOOGL FB TSLA NFLX AAPL MSFT NVDA;
param priceOfStocks:
1 2 3 4 5 6 7 8 9 10 11 12 :=
OTP 10 11 12 11 14 16 9 25 22 18 19 21
MOL 52 54 51 59 48 55 57 61 56 60 62 56
AMZN 36 39 41 40 38 42 37 40 43 48 46 37
GOOGL 20 18 16 17 19 21 23 22 24 28 26 27
FB 8 9 10 15 13 14 17 18 16 9 19 17
TSLA 25 22 24 28 31 30 33 32 30 29 33 34
NFLX 44 48 51 50 50 52 47 53 55 54 58 53
AAPL 88 85 83 84 80 78 77 81 84 86 82 81
MSFT 64 68 69 71 72 70 68 65 63 67 70 74
NVDA 15 19 17 21 25 29 23 18 20 16 17 22
;
set Investors := Oliver Emma /*Jack*/ ;
param HowMuchCanInvest :=
Oliver 100
Emma 150
/*Jack 200*/
;
end;
Ответ №1:
GLPK позволяет максимизировать только один член. Конечная прибыль не должна индексироваться, вместо этого вы должны суммировать прибыль по инвесторам в вашей целевой функции.
Поскольку время принятия решения не зависит от количества инвесторов, помещать их всех в одну модель не имеет никакого смысла. Вместо этого вам следует использовать скрипт для повторного вызова GLPK с разными наборами данных.