码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-06-24 16:09:09      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:

任务说明:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!