Итерационная оптимизация в GAMS

Предполагая единственную проблему фермы, как в случае примера Mayaland (Hazell & Norton, 1986; Chapter 2; section 2.2), мы можем использовать следующий код для оптимизации в GAMS.

Данные (одна ферма)

  • Mayaland.csv
resrs,Corn,    Bean,  Sorghum,  Peanut
Land,1,1,1,1
Labor,1.42,1.87,1.92,2.64
Mules,1.45,1.27,1.16,1.45
Market,,,,0.98

  • ressourses_endowments.csv
resrs,resEndow
Labor,16.5
Land,5
Mules,10
Market,0.5
  • activity_gross_margin.csv
crop,grosMarg
Corn,1372
Bean,1219
Sorghum,1523
Peanut,4874

Код (отдельная ферма)

SETS resrs, crops;

PARAMETERS
    farmData
    resEndow
    grosMarg
    ;

************************** I prefer NOT to input data like this **************************
*SETS
*    resrs ressourses /labor, land, mules, market /
*    crops mayaland activities /
*Corn
*Bean
*Sorghum
*Peanut
*/
*;
*PARAMETERS
*
*resEndow (resrs) ressourses endowments
*                        /
*                        Labor 16.5
*                        Land 5
*                        Mules 10.0
*                        Market 0.5
*                        /
*grosMarg (crops) gross margins
*                        /
*                        Corn 1372
*                        Bean 1219
*                        Sorghum 1523
*                        Peanut 4874
*                        /
*;
*table farmData A ressource requirements
*         Corn    Bean  Sorghum  Peanut
*Land     1       1      1       1
*Labor    1.42    1.87   1.92    2.64
*Mules    1.45    1.27   1.16    1.45
*Market                          0.983
*;
*
*******************************************************************************************

******************** I prefer to load the data from csv files like this********************
$call csv2gdx Mayaland.csv id=farmData useHeader=y fieldSep=Comma index=1 values=2..lastCol trace=3 
$ifE errorLevel<>0 $abort Problems reading Mayaland.csv!

$gdxIn Mayaland.gdx
$load resrs             = dim1
$load crops            = dim2
$load farmData
$gdxIn
;

$call csv2gdx ressourses_endowments.csv id=resEndow useHeader=y fieldSep=Comma index=1 values=2 trace=3 
$ifE errorLevel<>0 $abort Problems reading ressourses_endowments.csv!

$gdxIn ressourses_endowments.gdx
$load resEndow
$gdxIn
;

$call csv2gdx activity_gross_margin.csv id=grosMarg useHeader=y fieldSep=Comma index=1 values=2 trace=3 
$ifE errorLevel<>0 $abort Problems reading activity_gross_margin.csv!

$gdxIn activity_gross_margin.gdx
$load grosMarg
$gdxIn
;
*******************************************************************************************


DISPLAY resEndow, grosMarg, farmData;

VARIABLES

Prft Total gross margin
x(crops) activity levels
;

EQUATIONS

Profit definition of Z
RESCON ressouse constraint
NONNEG non-negativity condition;

Profit.. Prft =E= sum(crops, grosMarg (crops)*x(crops));
RESCON(resrs).. sum(crops, farmData(resrs, crops)*x(crops)) =L= resEndow(resrs);
NONNEG(crops).. x(crops) =G= 0;

model mayaland / Profit, RESCON, NONNEG /
;

SOLVE mayaland maximizing Prft using LP;
DISPLAY x.l, Prft.l;

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

Данные (несколько хозяйств, несколько регионов, несколько методов ведения сельского хозяйства)

  • Mayaland.csv
farmer,region,practice,resrs,Corn,    Bean,  Sorghum,  Peanut
farmer1,a,p1,Land,1,1,1,1
farmer1,a,p1,Labor,1.42,1.87,1.92,2.64
farmer1,a,p1,Mules,1.45,1.27,1.16,1.45
farmer1,a,p1,Market,,,,0.98
farmer2,b,p2,Land,1,1,1,1
farmer2,b,p3,Labor,1.42,1.87,1.92,2.64
farmer2,b,p4,Mules,1.45,1.27,1.16,1.45
farmer2,b,p5,Market,,,,0.98
  • ressourses_endowments.csv
farmer,region,practice,resrs,resEndow
farmer1,a,p1,Land,16.5
farmer1,a,p1,Labor,5
farmer1,a,p1,Mules,10
farmer1,a,p1,Market,0.5
farmer2,b,p2,Land,16.5
farmer2,b,p3,Labor,5
farmer2,b,p4,Mules,10
farmer2,b,p5,Market,0.5
  • activity_gross_margin.csv
farmer,region,practice,crop,grosMarg
farmer1,a,p1,Corn,1372
farmer1,a,p1,Bean,1219
farmer1,a,p1,Sorghum,1523
farmer1,a,p1,Peanut,4874
farmer2,b,p2,Corn,1372
farmer2,b,p3,Bean,1219
farmer2,b,p4,Sorghum,1523
farmer2,b,p5,Peanut,4874

Ожидаемый результат (несколько ферм, несколько регионов, несколько методов ведения сельского хозяйства)

Как мы можем заставить приведенный выше код работать для решения проблемы для каждой уникальной комбинации нескольких уровней? Другими словами, каждая строка в Mayaland.csv (ниже) представляет собой независимое наблюдение, следовательно, ее следует моделировать независимо.

farmer,region,practice   ===================================>  result 1
farmer,region,practice   ===================================>  result 2
farmer,region,practice   ===================================>  result 3
farmer,region,practice   ===================================>  result 4
farmer,region,practice   ===================================>  result 5
farmer,region,practice   ===================================>  result 6
farmer,region,practice   ===================================>  result 7
farmer,region,practice   ===================================>  result 8

Ссылка

Хазелл, П. Б. Р. и Нортон, Р. Д. (1986). Математическое программирование для экономического анализа в сельском хозяйстве. Нью-Йорк, США. https://www.ifpri.org/publication/matMathematical-programming-economic-analysis-agriculture


person Liman    schedule 12.11.2020    source источник


Ответы (1)


  1. Сформируйте набор frp(farmer,region,practice) с допустимыми комбинациями. Это можно прочитать из файла csv или рассчитать, например, из валовая прибыль.

  2. Прокрутите этот набор

    parameter results(farmer,region,practice,*,*) 'collect results'; 
    loop(frp(farmer,region,practice),
    * extract data for single case
           endow(res) =  endowmentData(farmer,region,practice,res);
           ...
    * solve single case
           solve ....
    * store results in parameter
           results(farmer,region,practice,'x',crops) = x.l(crops);
           results(farmer,region,practice,'profit','-') = Prft.l;
           ....
    );
    * export results to spreadsheet or csv file.
    

PS Может быть проще использовать одну электронную таблицу со всеми данными по сравнению с несколькими файлами csv.

person Erwin Kalvelagen    schedule 12.11.2020
comment
Привет, @Erwin Kalvelagen, спасибо за помощь! Я не мог правильно составить уравнения. Вкратце, я не могу перевести ваше объяснение в реальный код, который работает. Не могли бы вы обновить свой ответ, чтобы предоставить более полное решение? Я расскажу об одном CSV-файле данных в следующем комментарии. - person Liman; 13.11.2020
comment
Что именно ты не понимаешь? Уравнения модели должны быть идентичны вашей модели для отдельного случая. - person Erwin Kalvelagen; 13.11.2020
comment
Если честно, я не многого понимаю. Уравнения не работают, если я изменил данные. Прямо с Profit.. Prft =E= sum(crops, grosMarg (crops)*x(crops)) получаю ошибку dimension different - the symbol is referenced with more/less indices as declared. Это работает с вашей стороны? - person Liman; 13.11.2020
comment
Правда, сообщение об ошибке говорит само за себя, но я не понимаю, как ее решить. Если бы вы обновили свой ответ, это очень помогло бы мне. - person Liman; 13.11.2020