Хобрук: Ваш путь к мастерству в программировании

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

Моя задача следующая:

Есть инвесторы, которые хотят инвестировать в фондовый рынок. Мы знаем цены акций заранее на данный момент времени, и они дали сумму денег для инвестирования. Найдите способ максимизировать прибыль к концу этого времени.

Я пытаюсь сделать так, чтобы по мере добавления новых инвесторов в набор вы запускали модель только с одним инвестором, но столько раз.

Например (код ниже): если набор Инвесторов состоит только из Оливера, у которого 100 денег, прибыль составит 3424. Если набор Инвесторов состоит только из Эммы, которая у меня есть 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 "%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;

25.12.2020

Ответы:


1

GLPK позволяет максимизировать только один термин. ProfitAtTheEnd не должен индексироваться, вместо этого вы должны суммировать прибыль по инвесторам в вашей целевой функции.

Поскольку время решения не зависит от количества инвесторов, помещать их всех в одну модель не имеет смысла. Вместо этого следует использовать сценарий для многократного вызова GLPK с разными наборами данных.

24.04.2021
Новые материалы

Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

Структуры данных в C ++ - Часть 1
Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

Как я опубликовал свое первое приложение в App Store в 13 лет
Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

Что в лицо
Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

Почему шаблоны проектирования и почему нет?
Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

Создание дизайна обуви с помощью машинного обучения
Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

GraalVM в 2022 году: итоги года
2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..