другое поведение модели glpk

#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 с разными наборами данных.