Optimization GAMS中的迭代优化
假设一个单一农场问题,如Mayaland示例(Optimization GAMS中的迭代优化,optimization,gams-math,Optimization,Gams Math,假设一个单一农场问题,如Mayaland示例(Hazell&Norton,1986;第2章;第2.2节),我们可以在GAMS中使用以下代码进行优化 数据(单个农场) Mayaland.csv resourses\u endowments.csv 活动\u毛利.csv 代码(单个农场) resourses\u endowments.csv 活动\u毛利.csv 预期结果(多个农场、多个地区、多种耕作方式) 我们如何使上述代码能够解决多个级别的每个唯一组合的问题?换句话说,May
Hazell&Norton,1986;第2章;第2.2节
),我们可以在GAMS
中使用以下代码进行优化
数据(单个农场)
- Mayaland.csv
- resourses\u endowments.csv
- 活动\u毛利.csv
- resourses\u endowments.csv
- 活动\u毛利.csv
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
参考
哈泽尔,p.B.R.,诺顿,R.D.(1986)。农业经济分析的数学规划。美国纽约
frp(农民、地区、机构)
。这可以从csv文件中读取,也可以根据毛利率计算
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.
frp(农民、地区、机构)
。这可以从csv文件中读取,也可以根据毛利率计算
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文件相比,使用一个包含所有数据的电子表格可能更容易。Hi@Erwin Kalvelagen,感谢您的帮助!我不能用正确的方法建立方程。简而言之,我似乎无法将您的解释转换为实际的代码。您介意更新您的答案以提供更完整的解决方案吗?我将在下一篇评论中共享数据的单个CSV文件。
农民、地区、实践、resrs、作物、玉米、大豆、高粱、花生、resEndow、grosMarg farmer1、a、p1、土地、玉米、1、1、1、1、1、1、1、1、16.51372农民1、a、p1、劳动力、大豆、1.42、1.87、1.92、2.64、51219农民1、a、p1、骡子、高粱、1.45、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1,,,,0.98,0.54874农场主2,b,p2,土地,玉米,1,1,1,1,16.51372农场主2,b,p3,劳动力,大豆,1.42,1.87,1.92,2.64,51219农场主2,b,p4,骡子,高粱,1.45,1.27,1.16,1.45,101523农场主2,b,p5,市场,花生,0.98,0.54874
你到底不明白什么?模型方程应该和你的“单一情况”模型相同。老实说,我不太懂。如果我改变了数据,方程就不起作用了。直接从<代码>利润。。Prft=E=sum(crops,grosMarg(crops)*x(crops)),我得到的错误维度不同-符号引用了声明的更多/更少索引
。这对你来说有用吗?没错,错误信息是不言自明的,但我似乎不明白如何解决它。如果你能更新你的答案,这将对我有很大帮助。嗨@Erwin Kalvelagen,谢谢你的帮助!我不能用正确的方法建立方程。简而言之,我似乎无法将您的解释转换为实际的代码。您介意更新您的答案以提供更完整的解决方案吗?我将在下一篇评论中共享数据的单个CSV文件。农民、地区、实践、resrs、作物、玉米、大豆、高粱、花生、resEndow、grosMarg farmer1、a、p1、土地、玉米、1、1、1、1、1、1、1、1、16.51372农民1、a、p1、劳动力、大豆、1.42、1.87、1.92、2.64、51219农民1、a、p1、骡子、高粱、1.45、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1,,,,0.98,0.54874农场主2,b,p2,土地,玉米,1,1,1,1,16.51372农场主2,b,p3,劳动力,大豆,1.42,1.87,1.92,2.64,51219农场主2,b,p4,骡子,高粱,1.45,1.27,1.16,1.45,101523农场主2,b,p5,市场,花生,0.98,0.54874
你到底不明白什么?模型方程应该和你的“单一情况”模型相同。老实说,我不太懂。如果我改变了数据,方程就不起作用了。直接从<代码>利润。。Prft=E=sum(crops,grosMarg(crops)*x(crops)),我得到的错误维度不同-符号引用了声明的更多/更少索引
。这对你来说有用吗?没错,错误信息是不言自明的,但我似乎不明白如何解决它。如果你能更新你的答案,这将对我有很大帮助。
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;
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
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
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
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
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.