资源

收益管理(mpex24)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*名称:mpex24*//*标题:收益管理(mpex24)*//*产品:或*//*系统:所有*//*程序:OPTMODEL*//*数据:*//*                                                             *//*支持:更新:*//*参考编号:*//*MISC:数学规划示例24*//*示例手册*//*                                                             *//***************************************************************/数据类data;输入类$9。num_seats;数据线;前37个商业38经济47;数据价格数据;输入周期类$9。价格1—价格3;数据线;1首1200 1000 9501商务900 800 6001经济500 300 2002首1400 1300 11502商务1100 900 7502经济舱700 400 3503第一批1500 900 8503业务820 800 5003经济480 470 450;数据场景数据;输入问题;数据线;0.10.70.2;数据需求数据;输入周期场景类$9。需求1需求3;数据线;1 1第一个10 15 201 1业务20 25 351 1经济45 55 601 2首20 25 351 2商业40 42 451 2经济50 52 631 3第一个45 50 601 3商业45 46 471 3经济55 56 642 1首20 25 352 1商业42 45 462 1经济50 52 602 2首10 40 502 2商务50 60 802 2经济60 65 902 3首50 55 802 3商业20 30 502 3经济10 40 603 1第一个30 35 403 1商业40 50 553 1经济50 60 803 2第一个30 40 603 2商务10 40 453 2经济50 60 703 3第一个50 70 803 3商业40 45 603 3经济60 65 70;数据actual_demand_data;输入周期类$9。需求1—需求3;数据线;1第一个25 30 401商业50 40 451经济50 53 652首22 45 502商务45 55 752经济50 60 803首45 60 753商业20 40 503经济55 60 75;%设num_ periods=3;%设num_planes=6;%设plane_cost=50000;%设transfer_fraction_ub=0.10;%设num_options=3;过程操作模型;设置PERIODS=1..&num_perices;集合<str>CLASSES;num个座位{CLASSES};将数据class_data读入CLASSES=[class]num_seats;设置OPTIONS=1..&num_OPTIONS;num价格{周期、类别、选项};将数据price_data读入[period class]{OPTIONS}中的选项<price[period,class,option]=col('price'||option)>;设置SCENARIOS;num prob{场景};将数据scenario_data读入SCENARIOS=[_N_]prob;设置SCENARIOS2=SCENARIO交叉SCENARIOS;设置SCENARIOS3=SCENARIOS2交叉SCENARIO;num需求{周期、场景、类别、选项};将数据demand_data读入[period scenario class]{OPTIONS}中的选项<demand[period,scenario,class,option]=col('demand'||option)>;num actual_demand{周期、类别、选项};将数据actual_demand_data读取到[period class]{OPTIONS}中的选项<actual_demand[period,class,option]=col('demand'||option)>;num actual_price{周期,类别};num实际销售额{周期,类别};num实际收入{周期,类别};num当前周期;变量P1{CLASSES,OPTIONS}二进制;变量P2{SCENARIOS,CLASSES,OPTIONS}二进制;变量P3{SCENARIOS2,类,选项}二进制;var S1{场景、类别、选项}>=0;var S2{SCENARIOS2,类,选项}>=0;var S3{场景3,类,选项}>=0;var R1{场景、类别、选项}>=0;var R2{场景2,类别,选项}>=0;var R3{场景3,类别,选项}>=0;var TransferFrom{SCENARIOS3,CLASSES}>=0;var传输到{SCENARIOS3,类}>=0;var NumPlanes>=0<=&num_planes整数;SCENARIOS3中的con NumPlanes_con{<i,j,k>,CLASSES}中的类:sum{OPTIONS}中的选项(S1[i,类,选项]+S2[i,j,类,选件]+S3[i,j,k,类,选件])+转移自[i,j,k,class]-转移至[i,j,k,类]<=num_seats[class]*NumPlanes;对于SCENARIOS3中的{<i,j,k>,CLASSES}中的类do;TransferFrom[i,j,k,class].ub=&transfer_fraction_ub*num_seats[class];传输到[i,j,k,class].ub=&transfer_fraction_ub*num_seats[class];结束;场景3}中的con Balance_con{<i,j,k>:sum{CLASSES}中的类TransferFrom[i,j,k,class]=sum{CLASSES}中的类TransferTo[i,j,k,class];con P1_con{CLASSES}中的类:sum{OPTIONS}中的选项P1[class,option]=1;SCENARIOS中的con P2_con{i,CLASSES}中的类:sum{OPTIONS}P2[i,class,option]=1;SCENARIOS2中的con P3_con{<i,j>,CLASSES}中的类:和{OPTIONS}中的选项}P3[i,j,class,option]=1;SCENARIOS中的con S1_con{i,CLASSES中的类,OPTIONS}中的选项:S1[i,class,option]<=需求[1,i,classes,option]*P1[class,option];SCENARIOS2中的con S2_con{<i,j>,CLASSES中的类,OPTIONS}中的选项:S2[i,j,class,option]<=需求[2,j,类,option]*P2[i,class、option];SCENARIOS3中的con S3_con{<i,j,k>,CLASSES中的类,OPTIONS}中的选项:S3[i,j,k,类,选项]<=需求[3,k,类别,选项]*P3[i,j,类别,选项];/*R1[i,类别,选项]=价格[1,等级,选项]*P1[class,选项]*S1[i,等级,选件]*/SCENARIOS中的con R1_con_a{i,CLASSES中的class,OPTIONS}中的option:R1[i,类,选项]<=价格[1,类,期权]*S1[i,类别,选项];SCENARIOS中的con R1_con_b{i,CLASSES中的class,OPTIONS}中的option:价格[1,类别,选项]*S1[i,类别,选项]-R1[i,类别,选项]<=价格[1,类,选项]*需求[1,i,类,期权]*(1-P1[等级,选项]);/*R2[i,j,类,选项]=价格[2,等级,选项]*P2[i,等级,选件]*S2[i,j,等级,可选件]*/con R2_con_a{场景2中的<i,j>,CLASSES中的类,OPTIONS中的选项}:R2[i,j,class,option]<=价格[2,classes,option]*S2[i,j,classe,option];SCENARIOS2中的con R2_con_b{<i,j>,CLASSES中的类,OPTIONS}中的选项:价格[2,等级,选项]*S2[i,j,等级,选件]-R2[i,j,等级,可选件]<=价格[2,类,选项]*需求[2,j,类,期权]*(1-P2[i,等级,选项]);/*R3[i,j,k,类别,选项]=价格[3,等级,选项]*P3[i,j,等级,选件]*S3[i,j,k,等级,可选件]*/SCENARIOS3中的con R3_con_a{<i,j,k>,CLASSES中的类,OPTIONS}中的选项:R3[i,j,k,类,选项]<=价格[3,类,期权]*S3[i,j,k,类别,选项];SCENARIOS3中的con R3_con_b{<i,j,k>,CLASSES中的类,OPTIONS}中的选项:价格[3,等级,选项]*S3[i,j,k,等级,选件]-R3[i,j,k,类别,选项]<=价格[3,类,选项]*需求[3,k,类,期权]*(1-P3[i,j,类别,选项]);最大预期收益=(如果当前周期<=1然后求SCENARIOS中的和{i,CLASSES中的类,OPTIONS}中的选项问题[i]*R1[i,类,选项])+(如果当前周期<=2然后求SCENARIOS2中的和{<i,j>,CLASSES中的类,OPTIONS}中的选项prob[i]*prob[j]*R2[i,j,class,option])+(如果当前周期<=3然后求SCENARIOS3中的和{<i,j,k>,CLASSES中的类,OPTIONS}中的选项prob[i]*prob[j]*prob[k]*R3[i,j,k,class,option])+sum{period in 1..current_period-1,CLASSES}中的类实际收入[期间,类别]-&plane_cost*平面数;num price_sol_1{类中的类}=sum{OPTIONS}中的期权价格[1,class,option]*P1[class,option].sol;num price_sol_2{CLASSES中的类,SCENARIOS}中的i=sum{选项中的选项}价格[2,class,option]*P2[i,class、option].sol;num price_sol_3{CLASSES中的类,SCENARIOS2}中的<i,j>=sum{选项中的选项}价格[3,class,option]*P3[i,j,class、option].sol;num remaining_seats{类中的类}=num_seats[类别]*NumPlanes.sol-总和{1.current_period-1}实际销售额[period,class]中的period;num sell_up_to_1{CLASSES中的类}=最小值(最大{i在SCENARIOS中,选项在OPTIONS中}S1〔i,class,选项〕.sol,remaining_seats[类]);num sell_up_to2{CLASSES}中的类=最小值(SCENARIOS2中的max{<i,j>,OPTIONS}中的option S2[i,j,class,option].sol,remaining_seats[类]);num sell_up_to_3{类}=最小值(SCENARIOS3中的最大值{<i,j,k>,OPTIONS}中的选项S3[i,j,k,class,option].sol,remaining_seats[class]);当前周期=1;解决;对于SCENARIOS中的{i,CLASSES中的类,OPTIONS}中的选项S1[i,class,option]=圆形(S1[i、class,选项].sol);打印价格sol_1;打印sell_up_to1;在SCENARIOS中打印{i,在CLASSES中打印类,在OPTIONS中打印选项:S1[i,类,选项].sol>0}S1;打印价格sol2;打印价格sol3;打印NumPlanes ExpectedYield;对于CLASSES中的{class,OPTIONS}中的option do;如果P1[类别,选项].sol>0.5,则执行;修复P1[类,选项]=1;actual_price[1,class]=price_sol_1[class];实际销售额[1,类别]=min(sell_up_to1[class],actual_demand[1,class,option]);对于SCENARIOS}中的{i,修复S1[i,class,option]=actual_sales[1,class];结束;否则修复P1[类,选项]=0;结束;用于{CLASSES}中的类actual_revenue[1,class]=actual_price[1,类]*actual_sales[1,类别];打印实际价格实际销售额实际收入;下降P1_con S1_con R1_con_a R1_con_b;当前周期=2;解决;对于场景2中的{<i,j>,CLASSES中的类,OPTIONS中的选项}S2[i,j,class,option]=圆形(S2[i、j,classes,option].sol);打印价格sol2;打印sell_up_to_2;在SCENARIOS2中打印{i,j>,在CLASSES中打印类,在OPTIONS中打印选项:i=1和S2[1,j,class,option].sol>0}S2;打印价格sol3;打印NumPlanes ExpectedYield;对于SCENARIOS中的{i,CLASSES中的类,OPTIONS}中的选项do;如果P2[i,class,option].sol>0.5,则执行;修复P2[i,类,选项]=1;actual_price[2,class]=price_sol2[class,i];实际销售额[2,类别]=min(sell_up_to2[class],actual_demand[2,class,option]);对于SCENARIOS}中的{j,修复S2[i,j,class,option]=actual_sales[2,class];结束;否则修复P2[i,类,选项]=0;结束;用于{CLASSES}中的类actual_revenue[2,class]=actual_price[2,类]*actual_sales[2],类];打印实际价格实际销售额实际收入;当前周期=3;删除P2_con S2_con R2_na R2_nb;解决;对于SCENARIOS3中的{<i,j,k>,CLASSES中的类,OPTIONS}中的选项S3[i,j,k,class,option]=圆形(S3[i、j、k,classes,option].sol);打印价格sol3;打印sell_up_to3;在SCENARIOS3中打印{i,j,k>,在CLASSES中打印类,在OPTIONS中打印选项:{<1,1>}中的<i,j>和S3[i,j,k,类,选项].sol>0}S3;打印NumPlanes ExpectedYield;对于SCENARIOS2中的{<i,j>,CLASSES中的类,OPTIONS}中的选项do;如果P3[i,j,class,option].sol>0.5,则执行;固定P3[i,j,类,选项]=1;actual_price[3,class]=price_sol3[class,i,j];实际销售额[3,类]=min(sell_up_to3[class],actual_demand[3,class,option]);对于SCENARIOS}中的{k,修复S3[i,j,k,class,option]=实际销售额[3,类别];结束;否则修复P3[i,j,class,option]=0;结束;用于{CLASSES}中的类actual_venuy[3,class]=实际价格[3,class]*实际销售额[3,class];打印实际价格实际销售额实际收入;当前周期=4;打印预期收益率;退出;过程操作模型;设置PERIODS=1..&num_perices;设置<str>CLASSES;num个座位{CLASSES};将数据class_data读入CLASSES=[class]num_seats;设置OPTIONS=1..&num_OPTIONS;num价格{周期、类别、选项};将数据price_data读入[period class]{OPTIONS}中的选项<price[period,class,option]=col('price'||option)>;设置SCENARIOS;num prob{场景};将数据scenario_data读入SCENARIOS=[_N_]prob;num需求{周期、场景、类别、选项};将数据demand_data读入[period scenario class]{OPTIONS}中的选项<demand[period,scenario,class,option]=col('demand'||option)>;num actual_demand{周期、类别、选项};将数据actual_demand_data读取到[period class]{OPTIONS}中的选项<actual_demand[period,class,option]=col('demand'||option)>;num actual_price{周期,类别};num实际销售额{周期,类别};num实际收入{周期,类别};num expected_demand{PERIODS中的句点,CLASSES中的类,OPTIONS}中的选项=sum{SCENARIOS}中的场景prob[scenario]*需求[period,scenario,class,option];var P{PERIODS,CLASSES,OPTIONS}二进制;var S{周期,类,选项}>=0;var R{周期,类,选项}>=0;var TransferFrom{CLASSES}>=0;var传输到{CLASSES}>=0;var NumPlanes>=0<=&num_planes整数;con NumPlanes_con{CLASSES}中的类:sum{PERIODS中的period,OPTIONS}中的option[period、class、option]+TransferFrom[类别]-TransferTo[类别]<=num_seats[class]*数量平面;对于{CLASSES}中的类do;TransferFrom[class].ub=&transfer_fraction_ub*num_seats[class];TransferTo[class].ub=&transfer_fraction_ub*num_seats[class];结束;con余额con:sum{CLASSES中的class}TransferFrom〔class〕=sum{CLASSES}中的类TransferTo[class];con P_con{周期中的句点,CLASSES}中的类:sum{OPTIONS}中的选项}P[周期,类,选项]=1;con S_con{PERIODS中的句点,CLASSES中的类,OPTIONS}中的选项:S[周期、类别、选项]<=expected_demand[period,class,option]*P[period,class,option];/*R[周期、类别、选项]=价格[周期,类别,选项]*P[周期,类,选项]*S[周期、类别、选项]*/con R_con_a{PERIODS中的句点,CLASSES中的类,OPTIONS}中的选项:R[period,class,option]<=price[periodid,class]*S[周期、类别、选项];con R_con_b{PERIODS中的句点,CLASSES中的类,OPTIONS}中的选项:价格[period,class,option]*S[period、class、option]-R[周期、类别、选项]<=价格[period,class,option]*expected_demand[period,class,option]*(1-P[周期、类别、选项]);最大收益率=sum{PERIODS中的period,CLASSES中的class,OPTIONS}中的optionR[周期、类别、选项]-&plane_cost*平面数;num price_sol{PERIODS中的句点,CLASSES}中的类=总和{OPTIONS}中的选项}价格[period,class,option]*P[period,class,option].sol;解决;对于{PERIODS中的句点,CLASSES中的类,OPTIONS}中的选项S[period,class,option]=圆形(S[peroid,classe,option].sol);打印price_sol;打印{PERIODS中的句点,CLASSES中的类,OPTIONS中的选项:S[period,class,option].sol>0}S;打印NumPlanes产量;对于{PERIODS中的period,CLASSES中的class,OPTIONS}中的option do;如果P[period,class,option].sol>0.5,则执行;actual_price[period,class]=price_sol[period,class];实际销售额[期间,类别]=min(S[period,class,option],actual_demand[period,class,option]);实际收益[期间,类别]=实际价格[期间,类别]*实际销售额[期间,类];R[期间,类别,选项]=实际收益[期间,类别];结束;结束;打印实际价格实际销售额实际收入;印刷收益率;删除S_con R_con_b;con S_con_actual{PERIODS中的句点,CLASSES中的类,OPTIONS}中的选项:S[周期、类别、选项]<=实际需求[period,class,option]*P[period、class、option];con R_con_b_actual{PERIODS中的period,CLASSES中的class,OPTIONS}中的option:价格[period,class,option]*S[period、class、option]-R[周期、类别、选项]<=价格[周期,类别,选项]*实际需求[周期,类,选项]*(1-P[周期、类别、选项]);解决;对于{PERIODS中的句点,CLASSES中的类,OPTIONS}中的选项S[period,class,option]=圆形(S[peroid,classe,option].sol);打印price_sol;打印{PERIODS中的句点,CLASSES中的类,OPTIONS中的选项:S[period,class,option].sol>0}S;打印NumPlanes产量;对于{PERIODS中的period,CLASSES中的class,OPTIONS}中的option do;如果P[period,class,option].sol>0.5,则执行;actual_price[period,class]=price_sol[periode,class];actual_sales[period,class]=S[periold,class,option];实际收入[期间,类别]=实际价格[期间,类别]*实际销售额[期间,类];R[period,class,option]=实际收入[periold,class];结束;结束;打印实际价格实际销售额实际收入;退出;