我的任务如下:
有些投资者想投资股票市场。我们知道在一段时间内股票的价格,他们已经给出了投资的金额。找到一种办法,在这段时间结束前实现利润最大化。
我试着去做,这样当你增加了更多的投资者,这就像你运行的模式只有一个投资者,但很多次。
例如(下面代码):如果投资者只由拥有100美元的奥利弗组成,那么利润将是3424。如果投资者仅由拥有15万美元的艾玛组成,其利润将为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 "%s\n", 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;发布于 2021-04-24 16:56:25
GLPK只允许最大限度地使用单个术语。ProfitAtTheEnd不应该被索引,相反,你必须在你的目标函数中对投资者的利润进行汇总。
由于解决方案的时间与投资者的数量不成线性,所以把它们都放在一个模型中是没有任何意义的。相反,您应该使用脚本来使用不同的数据集重复调用GLPK。
https://stackoverflow.com/questions/65451205
复制相似问题