首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >glpk模型的不同行为

glpk模型的不同行为
EN

Stack Overflow用户
提问于 2020-12-25 19:41:00
回答 1查看 28关注 0票数 0

我的任务如下:

有些投资者想投资股票市场。我们知道在一段时间内股票的价格,他们已经给出了投资的金额。找到一种办法,在这段时间结束前实现利润最大化。

我试着去做,这样当你增加了更多的投资者,这就像你运行的模式只有一个投资者,但很多次。

例如(下面代码):如果投资者只由拥有100美元的奥利弗组成,那么利润将是3424。如果投资者仅由拥有15万美元的艾玛组成,其利润将为5337。但如果我把它们都放在片场里,奥利弗的利润将是3424英镑,而艾玛只有1979年的利润。我的目标是,它是一样的,如果它是孤独的。

我认为问题在于最大化函数,但我不确定。

代码语言:javascript
运行
复制
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;
EN

回答 1

Stack Overflow用户

发布于 2021-04-24 16:56:25

GLPK只允许最大限度地使用单个术语。ProfitAtTheEnd不应该被索引,相反,你必须在你的目标函数中对投资者的利润进行汇总。

由于解决方案的时间与投资者的数量不成线性,所以把它们都放在一个模型中是没有任何意义的。相反,您应该使用脚本来使用不同的数据集重复调用GLPK。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65451205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档