Предполагая единственную проблему фермы, как в случае примера 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