您的位置:首页 > 其它

研制一个生产计划编制的软件

2016-06-21 12:00 316 查看
任务说明:
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息