標籤:
任務說明:
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;}
研製一個生產計劃編製的軟體