资源

人力规划(mpex05)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*名称:mpex05*//*标题:人力规划(mpex05)*//*产品:或*//*系统:所有*//*程序:OPTMODEL*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:数学规划示例05*//*示例手册*//*                                                             *//***************************************************************/数据需求数据;输入期非熟练-半熟练-熟练;数据线;0 2000 1500 10001 1000 1400 10002  500 2000 15003    0 2500 2000;数据工作者数据;输入工人$12。waste_new waste_old recruit_ub冗余_costovermanning_cost shorttime_ub shorttime_cost;数据线;非熟练0.25 0.10 500 200 1500 50 500半熟练0.20 0.05 800 500 2000 50 400熟练0.10 0.05 500 500 3000 50 400;数据再培训数据;输入工作者1$12。工人2 12美元。再培训_次级再培训_成本;数据线;非熟练半熟练200 400半熟练的。500;数据降级data;输入工作者1$12。工人2美元12。;数据线;半熟练非熟练工熟练半熟练熟练的非熟练的;%设semiskill_retrain_frac_ub=0.25;%让downgrade_leave_frac=0.5;%设overmanning_ub=150;%设shorttime_frac=0.5;过程操作模型;设置<str>WORKERS;num waste_new{WORKERS};num waste_old{工人};num recruit_ub{工人};num redundancy_cost{WORKERS};num overmanning_cost{WORKERS};num shorttime_ub{工人};num shorttime_cost{工人};将数据worker_data读入WORKERS=[worker]浪费_新浪费_旧招聘_ ub冗余_成本过高_成本shorttime_ub shorttime_cost;设置PERIODS0;num需求{工人,周期0};将数据demand_data读入PERIODS0=[period]{WORKERS}中的工人<demand[worker,period]=col(worker)>;var NumWorkers{WORKERS,PERIODS0}>=0;对于{WORKERS-in-WORKERS}中的worker,修复NumWorkers[worker,0]=需求[worker、0];设置PERIODS=PERIODS0 diff{0};var NumRecruits{WORKERS中的worker,PERIODS}>=0<=recruit_ub[worker];var NumRedundant{WORKERS,PERIODS}>=0;var NumShortTime{WORKERS中的worker,PERIODS}>=0<=shorttime_ub[worker];var NumExcess{工人,周期}>=0;设置RETRAIN_PAIRS;num retain_ub{retrain_PAIRS};num retrain_cost{RETAIN_PAIRS};将数据retain_data读取到retrain_PAIRS=[worker1 worker2]再培训_次级再培训_成本;var NumRetrain{RETRAIN_PARS,PERIODS}>=0;RETRAIN_PAIRS中的{<i,j>:RETRAIN_ub[i,j]ne.}对于{周期中的周期}NumRetrain[i,j,period].ub=retrain_ub[i,j];设置<str,str>DOWNGRADE_PAIRS;将数据downgrade_data读取到downgrade_PAIRS=[worker1 worker2];var NumDowngrade{DOWNGRADE_PAIRS,PERIODS}>=0;con Demand_con{WORKERS中的worker,period in PERIODS}:工人人数[worker,period]-(1-&shorttime_frac)*NumShortTime[worker,period]-超出数量[worker,period]=需求[工人,周期];con Flow_balance_con{WORKERS中的worker,period in PERIODS}:工人人数[worker,period]=(1-waste_old[worker])*数量Workers[worker,period-1]+(1-wast_new[工人])*招聘人数[工人,周期]+(1-waste_old[worker])*RETRAIN_PAIRS}中的总和{i,(worker)>重试次数[i,worker,period]+(1-&downgrade_leave_frac)*DOWNGRADE_PAIRS}数字降级[i,worker,period]中的sum{<i,(worker)>-RETRAIN_PAIRS}中的sum{<(worker),j>NumRetrain[worker,j,period]-DOWNGRADE_PAIRS}数字降级[worker,j,period]中的总和{<(worker),j>-数字冗余[worker,period];con Semiskill_retrain_con{周期中的周期}:NumRetrain['semiskill','skill',句点]<=&semiskill_retrain_frac_ub*工人数量['skill',period];con Overmanning_con{周期中的周期}:sum{WORKERS中的worker}NumExcess[worker,period]<=&overmanning_ub;最小冗余=sum{WORKERS中的worker,period in PERIODS}NumRedundant[worker,interiod];最小成本=总和{WORKERS中的worker,PERIODS中的period}(redundancy_cost[worker]*NumRedundant[worker,period]+shorttime_cost[worker]*NumShorttime[worker,period]+overmanning_cost[worker]*NumExcess[worker,period])+RETRAIN_PAIRS中的和{<i,j>,PERIODS}中的周期retrain_cost[i,j]*NumRetrain[i,j,period];解决对象冗余;打印冗余成本;打印NumWorkers NumRecruites NumRedundant NumShortTime NumExcess;打印NumRetrain;打印NumDowngrade;从[worker period]创建数据sol_data1NumWorkers NumRecruits NumRedundant NumShortTime NumExcess;从[worker1 worker2 period]NumRetrain NumDowngrade创建数据sol_data2;求解目标成本;打印冗余成本;打印NumWorkers NumRecruits NumRedundant NumShortTime NumExcess;打印NumRetrain;打印NumDowngrade;从[worker period]创建数据sol_data3NumWorkers NumRecruits NumRedundant NumShortTime NumExcess;从[worker1 worker2 period]NumRetrain NumDowngrade创建数据sol_data4;退出;