标签:
任务说明:
l 市场调查,转写设计需求报告
l 设计软件流程,编程软件
l 整理设计资料,撰写软件设计文档
l 编程宣传资料,进行产品展示
软件功能要求:
l 生产中期计划的跨度可为1年,计划时间单位为天、周或旬(十天)可选。考虑生产成本、产能、库存成本和资金占用成本等因素。
l 销售预测数据、产能数据应可以灵活输入,生产计划数据不仅使用数据表格形式输出,最好也能用直方图形式输出。
l 生产成本、库存成本和资金占用成本可以不修改程序进行设置。
l 可以扩充其它功能(如经济批量计算或设定、考虑批生产的准备调整费用)。
条件:
l 在微机上运行,不需要借助网络。
l 编程语言不限。
l 要能够独立安装。
问题分析:
目的是为该公司制定生产和库存计划,使总成本费用(包括解雇员工与新雇员工的费用及库存费用)最小。
考虑如下模型。
某公司生产某种商品,目前公司有员工X个,生产能力是每人每天/周/旬(10天)Y件。现在已经有库存Z件,考虑在最长接下来M个月里(M最大为12),商品将会全部售出(即库存量为0)。
根据市场调查,预测市场接下来的M个月里对该商品的需求量如表1所示:
表1 市场接下来的月份里对商品的需求量
月份 |
1 |
2 |
3 |
4 |
5 |
6 |
…. |
需求量(件) |
A1 |
A2 |
A3 |
A4 |
A5 |
A6 |
…. |
要求根据这份预测数据,对接下来的M个月的生产和库存制定计划,使总费用(包括解雇员工与新雇员工的费用,以及库存费用)达到最小。公司确定接下来制定计划的目标如下:
(1) 正常生产和加班生产
正常生产每人每月P件;而加班生产每人不超过Q件,且每加班生产一件增加费用W美元。
(2) 解雇或新雇员工
每解雇一个员工需要支付H美元,每新雇用一个员工,需要支付G美元的培训费。
(3) 库存
多余的产品可以存放在仓库中,每月每件产品的存储费为V美元。
根据以上所给条件,制定一个以总费用最少为目标的生产库存计划,并且要求在M个月之后的月底无库存。
关于如何制定生产和库存计划,使公司的总费用为最小,是一个整数规划问题。因此我们可以根据已知的数据进行规划约束求解。总费用包括解雇员工与新雇员工的费用,以及库存费用两个方面,并且在解雇员工与新雇员工在每月人数流动问题上进行了优化假设,设定变量,再求变量的约束条件,最后给出了生产和库存计划的模型,并对该模型的结果进行了分析。
【本文原址出自http://blog.csdn.net/u012662688/article/details/51726262,转载请注明】
#include<cstdio> #include<iomanip> #include<cmath> #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<map> #include<vector> #include<windows.h> using namespace std; #define M 15 //避免数组越界 #define clr(a,b) memset(a,b,sizeof a) using namespace std; int month;//计划跨度月份数量 int tot_req;//总共计划全程需要多少产品 int left_req;//剩下的生产计划还需要多少产品 int require[M];//计划每个月的需求量 int pay[M];//每个月公司的总支出 int tmp_req[M];//用来存储当前最小花费的每个月的需求量 //int now_worker;//现在已有员工数量 int worker_num[M];//每个月员工的数量 int up[M];//每个月员工数量上限 int down[M];//每个月员工数量下限 int work_ability;//员工每天、周、旬内生产产品的数量,0表示天,1表示周,2表示旬 int per_kind;//采用的是天/周/旬哪类单位 int wage;//每个员工每个月的工资 int wage_mon[M];//每个月员工工资总费用 int pro_num[M];//每个月普通生产的总量 int over_fee;//每个员工加班生产1件产品的费用 int over_num[M];//每个月加班生产的总量 int over_mon[M];//每个月加班的总费用 int over_max;//每个员工最多加班生产的产品数 int hire;//雇佣1个新员工的费用 int fire;//解雇1个员工的费用 int hfire[M];//每个月雇佣解雇的总费用 int store_fee;//每月每件多余产品存储价格 int store_mon[M];//每个月存储的总费用 int tot_fee=0;//总费用 int store_num[M];//每个月的库存数量 int ans=0x3f3f3f3f;//最少花费 int cal(){ int i; tot_fee=0; for(i=0;i<month;i++){ pay[i]=wage_mon[i]+over_mon[i]+store_mon[i]+hfire[i]; tot_fee+=pay[i];//总费用等于每个月员工工资总额+加班费总额+存储费总额+解雇培训费用总额 } return tot_fee; } int final_req[M]; int final_worker_num[M]; int final_wage_mon[M]; int final_pro_num[M]; int final_over_num[M]; int final_over_mon[M]; int final_store_mon[M]; int final_store_num[M]; int final_hfire[M]; int final_pay[M]; void rec(){ int i=0; for(i=0;i<month;i++){ final_req[i]=tmp_req[i]; final_worker_num[i]=worker_num[i]; final_wage_mon[i]=wage_mon[i]; final_pro_num[i]=pro_num[i]; final_over_num[i]=over_num[i]; final_over_mon[i]=over_mon[i]; final_store_mon[i]=store_mon[i]; final_store_num[i]=store_num[i]; final_hfire[i]=hfire[i]; final_pay[i]=pay[i]; } } void dfs(int now){ //printf("here\n"); if(now==month){ int t_ans=cal(); if(t_ans<ans){ ans=t_ans; rec(); } return; } int cur_require=require[now]-store_num[now]; tmp_req[now]=cur_require; //printf("%d\n",cur_require); int cur_worker_num=worker_num[now];//保存当月初始员工数量 up[now]=(int)ceil(1.0*cur_require/work_ability)*2;//员工上限 down[now]= (int)ceil(1.0*cur_require/(work_ability+over_max)); //printf("%d %d\n",up[now],down[now]); for(worker_num[now]=down[now];worker_num[now]<=up[now];worker_num[now]++){ pro_num[now]=worker_num[now]*work_ability; if(cur_require>pro_num[now]){ over_num[now]=cur_require-pro_num[now]; over_mon[now]=over_num[now]*over_fee; }else{ over_num[now]=0; over_mon[now]=0; } worker_num[now+1]=worker_num[now];//下个月员工起始数量等于这个月员工数量 wage_mon[now]=worker_num[now]*wage;//该月员工总工资费用 if(worker_num[now]>cur_worker_num)hfire[now]=(worker_num[now]-cur_worker_num)*hire;//雇佣员工计算 else hfire[now]=(cur_worker_num-worker_num[now])*fire;//解雇员工计算 store_num[now+1]=(pro_num[now]+over_num[now]-cur_require);//这个月的需求等于这个月的需求-上个月剩余的库存 store_mon[now]=store_num[now+1]*store_fee; if(store_num[now+1]<0)printf("<0%d\n",store_num[now+1]); dfs(now+1); } } int check(char *x){ int sig=isdigit(x[0]); if(!sig){ printf("警告!非法输入!请输入正整数!\n"); Sleep(10000); exit(0); }else if(atoi(x)<0){ printf("警告!非法输入!请输入正整数!\n"); Sleep(10000); exit(0); } return 1; } int main(){ freopen("D:\\in.txt","r",stdin); scanf("%d",&month); //printf("%d\n",ans); int i,j,k; char str[5][10000]; for(i=0;i<month;i++){ scanf("%s",str[0]); check(str[0]); require[i]=atoi(str[0]); tot_req+=require[i]; } for(i=0;i<5;i++){ scanf("%s",str[i]); check(str[i]); } store_num[0]=atoi(str[0]); worker_num[0]=atoi(str[1]); per_kind=atoi(str[2]); wage=atoi(str[3]); work_ability=atoi(str[4]); if(per_kind==0)work_ability*=22;//假设双休,每月30天 else if(per_kind==1)work_ability*=4; else if(per_kind==2)work_ability*=3; for(i=0;i<5;i++){ scanf("%s",str[i]); check(str[i]); } over_fee=atoi(str[0]); over_max=atoi(str[1]); hire=atoi(str[2]); fire=atoi(str[3]); store_fee=atoi(str[4]); dfs(0); printf("每个月初始需求量\n"); for(i=0;i<month;i++){ printf("%d%c",require[i],i==month-1?'\n':'\t'); } freopen("D:\\out.txt","w",stdout); printf("总需求量\n"); printf("%d\n",tot_req); printf("总费用\n"); printf("%d\n",ans); int ttot=0; printf("每个月总支出\n"); for(i=0;i<month;i++){ printf("%d%c",final_pay[i],i==month-1?'\n':'\t'); } printf("每个月实际需求量\n"); for(i=0;i<month;i++){ printf("%d%c",final_req[i],i==month-1?'\n':'\t'); } printf("每个月生产量\n"); for(i=0;i<month;i++){ printf("%d%c",final_pro_num[i],i==month-1?'\n':'\t'); ttot+=final_pro_num[i]; } printf("每个月加班生产量\n"); for(i=0;i<month;i++){ printf("%d%c",final_over_num[i],i==month-1?'\n':'\t'); } printf("每个月员工量\n"); for(i=0;i<month;i++){ printf("%d%c",final_worker_num[i],i==month-1?'\n':'\t'); } printf("每个月解雇培训费\n"); for(i=0;i<month;i++){ printf("%d%c",final_hfire[i],i==month-1?'\n':'\t'); } printf("每个月存储费\n"); for(i=0;i<month;i++){ printf("%d%c",final_store_mon[i],i==month-1?'\n':'\t'); } printf("每个月员工工资\n"); for(i=0;i<month;i++){ printf("%d%c",final_wage_mon[i],i==month-1?'\n':'\t'); } fclose(stdout); return 0; }
标签:
原文地址:http://blog.csdn.net/u012662688/article/details/51726262