规划方案数学大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
规划数学大作业
学院:控制与计算机工程
学号:
姓名:贺焕
目录
1 问题背景描述 ........................................................ 错误!未定义书签。
2 问题建模................................................................. 错误!未定义书签。
3 计算机求解............................................................. 错误!未定义书签。
4 成果分析................................................................. 错误!未定义书签。
5 附录......................................................................... 错误!未定义书签。
1 问题背景描述
从1947年丹捷格(G.B.Dantzig)提出单纯形求解办法以来,线性规划作为运筹学一种重要分支,无论是在理论方面还是在算法方面都日益趋向成熟和完善,并在实践中获得了良好应用效果;特别是随着计算机解决能力不断提高,使其得以更广泛应用。
规划问题往往与资源有限性密切有关,解决是有限资源条件下成本最小或利润最大等问题。
在生产管理和经营活动中经常提出一类问题,即如何合理地运用有限人力、物力、财力等资源,以便得到最佳经济效果。
如下对一种生产管理问题进行分析和研究。
某工厂在某一筹划期内准备生产甲、乙、丙三种产品,生产需要消耗A、B、C三种资源,已知各种产品中A、B、C含量,原料成本,各种原料每月限制用量,三种产品单位加工费及售价如下表1所示。
表1
每月应生产这三种产品各多少公斤,才干使该厂获利最大呢?
对于此问题可以考虑建立线性规划数学模型进行求解,针对此问题建立数学模型。
2 问题建模
针对上面提出问题,用如下数学模型来描述,设x 1、x 2、x 3分别表达每月应生产甲、乙、丙这三种产品公斤数。
由于原料A 、B 、C 限量,可以得到如下不等式:
1200
50.060.020.0250025.025.020.0200025.015.060.0321321321≤++≤++≤++x x x x x x x x x 该厂目的是在不超过所有资源限量条件下,如何拟定产量x 1、x 2、x 3以得到最大利润。
若用z 表达利润,这时
)
50.060.020.0(00.1)25.025.020.0(50.1)25.015.060.0(00.2)30.025.2()40.085.2()50.040.3(321321321321x x x x x x x x x x x x z ++-++-++--+-+-=
综合上述,该筹划问题可用数学模型表达为: 目的函数:
)
50.060.020.0(00.1)25.025.020.0(50.1)25.015.060.0(00.2)30.025.2()40.085.2()50.040.3(max 321321321321x x x x x x x x x x x x z ++-++-++--+-+-=
满足约束条件:
,,120050.060.020.0250025.025.020.0200025.015.060.0321321321321≥≤++≤++≤++x x x x x x x x x x x x
3 计算机求解
单纯形法求解线性规划思路:普通线性规划问题具备线性方程组变量数不不大于方程个数,这时有不定解。
但可以从线性方程组中找出一种个单纯形,每一种单纯形可以求得一组解,然后再判断该解使目的函数值是增大还是变小,决定下一步选取单纯形。
这就是迭代,直到目的函数实现最大值或最小值为止。
这样问题就得到了最优解。
对于上面建立数学模型考虑用单纯形法进行求解。
引入松弛变量x 4、x 5 、x 6。
将目的函数整顿得:
654321000575.0175.12.1m ax x x x x x x z +++++=
约束条件变为:
,,,,,12000050.060.020.025000025.025.020.020000025.015.060.0654321654321654321654321≥≤+++++≤+++++≤+++++x x x x x x x x x x x x x x x x x x x x x x x x
由上述数据即可构造初始单纯形表,如表2所示。
表 2
使用计算机求解得到最优解为:X *=(3090.91,969.697,0,0,1639.39,0)T 目的函数值为:z *=4848.48
4 成果分析
依照以上计算成果可以懂得,每月生产甲产品3090.91公斤,乙产品969.697公斤,不生产丙产品,可使该厂获利最大,达到4848.48元。
讨论线性规划问题时,假定a ij 、b i 、c j 都是常数。
但事实上这些系数往往是预计值和预测值。
如市场条件一变,c j 值就会变化;a ij 往往是因工艺条件变化而变化;b i 是依照资源投入后经济效果决定一种决策选取。
如下将针对上述模型中c j 、b i 变化进行讨论。
当c j 是非基变量x j 系数时,若满足01≤-∆+-j B j j P B C c c ,则原最优解依然为最优解,否则需重新计算。
假设丙产品开始畅销,其售价由本来2.25元/公斤上涨至3元/公斤。
那么重新计算成果为:每月生产甲产品2800公斤,丙产品1280公斤,不生产乙产品,可使该厂获利最大,达到5056元。
若售价由本来2.25元/公斤上涨至2.75元/公斤。
重新计算成果依然为原最优解。
由以上分析中公式01≤-∆+-j B j j P B C c c 可知丙产品售价不大于2.837879元/公斤时,原最优解不变。
以上两组数据验证了这一敏捷度分析。
当cj 是基变量xj 系数时,若满足01≤∆---rj r B j a c A B C c ,j=1,2,…,n ,则原最优解依然为最优解,否则需重新计算。
假设甲产品开始畅销,其售价由本来3.40元/公斤上涨至6元/公斤。
那么重新计算成果依然为原最优解。
若甲产品开始滞销,其售价由本来3.40元/公斤下调至2.5元/公斤。
那么重新计算成果为:每月生产乙产品公斤,不生产甲产品和丙产品,可使该厂获利最大,达到2350元。
由以上分析中公式
01≤∆---rj r B j a c A B C c ,j=1,2,…,n ,可知甲产品售价介于2.59和6.9元/公斤之间时最优解不变。
以上两组数据验证了这一敏捷度分析。
当b r 发生变化时,若满足0)(1≥∆+='
-b b B X B ,则原最优基不变,但最优
解值发生了变化,所觉得'
B X 新最优解。
假设工厂新增了原料B ,每月限制用量上调至3000公斤,那么重新计算成果为:每月生产甲产品3090.91公斤,生产乙产品969.697公斤,不生产丙产品,可使该厂获利最大,达到4848.48元。
若工厂减少了原料B ,每月限制用量下调至500公斤,那么重新计算成果为:每月生产甲产品2500公斤,不生产乙产品和丙产品,可以使该厂获利最大,达到3000元。
由以上分析中公式
0)(1≥∆+='
-b b B X B ,可知当原料B 限制用量不不大于530.303公斤时,可以使得原最优基不变,但最优解值会发生变化。
以上两组数据验证了这一敏捷度分析。
5 附录
计算机求解使用语言是C++,实当代码如下所示:
#include<iostream>
using namespace std;
int main(int argc,_TCHAR* argv[])
{
int M,N,XB[100],human[100],num,i,j,k,l;
float A[100][100],a[100][100],b[100],th[100],C[100],cj_zj[100],CB[100];
//获取初始数据
cout<<"构建初始单纯形表。
"<<endl
<<"输入决策变量个数N=";
cin>>N;
cout<<"输入价值向量C:";
for (i = 0;i < N;i++)
{
cin>>C[i];
}
cout<<"输入约束方程组中方程个数M=";
cin>>M;
cout<<"输入约束方程组增广矩阵:"<<endl;
for (i = 0;i < M;i++)
{
for (int j = 0;j < N;j++)
{
cin>>A[i][j];
}
cin>>b[i];
}
cout<<"输入初始CB:";
for (i = 0;i < M;i++)
{
cin>>CB[i];
}
cout<<"输入初始XB:";
for (i = 0;i <M;i++)
{
cin>>XB[i];
XB[i]--;
}
cout<<"输入人工变量个数:"; cin>>num;
if (num > 0)
{
cout<<"输入人工变量:"<<endl;
for (i = 0;i < num;i++)
{
cin>>human[i];
human[i]--;
}
}
loop:
//计算cj-zj
cout<<"cj-zj为:"<<endl;
for (j = 0;j < N;j++)
{
bool flag = false;
for (i = 0;i < M;i++)
{
if (j == XB[i])
{
flag = true;
break;
}
}
if (flag)
{
cj_zj[j] = 0;
cout<<cj_zj[j]<<" ";
continue;
}
float sum = 0;
for (i = 0;i < M;i++)
{
sum += CB[i]*A[i][j];
}
cj_zj[j] = C[j] - sum;
cout<<cj_zj[j]<<" "; }
cout<<endl<<endl;
//判断与否所有cj-zj<=0 for (j = 0;j < N;j++) {
if (cj_zj[j] > 0)
{
break;
}
}
if (j < N)
{
for (i = 0;i <M;i++)
{
if (A[i][j] > 0)
{
break;
}
}
if (i < M)
{
//拟定换入变量
float maxj = 0;
k = 0;
for (j = 0;j < N;j++)
{
if (cj_zj[j] > maxj)
{
k = j;
maxj = cj_zj[j];
}
}
cout<<"换入变量为:"<<k+1<<endl<<endl; //求旋转变量
cout<<"旋转变量为:";
for (i = 0;i < M;i++)
{
if (A[i][k] > 0)
{
th[i] = b[i]/A[i][k];
}
else
{
th[i] = -1;
}
cout<<th[i]<<" ";
}
cout<<endl<<endl;
//拟定换出变量
float minj = 1000000;
for (i = 0;i < M;i++)
{
if (th[i] < 0)
{
continue;
}
if (th[i] < minj)
{
minj = th[i];
/*l = XB[i];*/
l = i;
}
}
cout<<"换出变量为:"<<XB[l]+1<<endl<<endl; //迭代运算
XB[l] = k;
CB[l] = C[k];
float bb[100];
for (i = 0;i < M;i++)
{
for (j = 0;j < N;j++)
{
a[i][j] = A[i][j];
}
bb[i] = b[i];
}
b[l] = bb[l] / a[l][k];
for (j = 0;j < N;j++)
{
A[l][j] = a[l][j]/a[l][k];
}
for (i = 0;i < M;i++)
{
if (i == l)
{
continue;
}
for (j = 0;j < N;j++)
{
A[i][j] = a[i][j] - A[l][j]*a[i][k];
}
b[i] = bb[i] - b[l]*a[i][k];
}
cout<<"增广矩阵为:"<<endl;
for (i = 0;i < M;i++)
{
for (j = 0;j < N;j++)
{
cout<<A[i][j]<<" ";
}
cout<<b[i]<<endl;
}
cout<<endl;
goto loop;
}
else
{
cout<<"此问题无界!"<<endl;
return 0;
}
}
else
{
for (i = 0;i < M;i++)
{
for (j = 0;j < num;j++)
{
if (XB[i] == human[j] && CB[i] != 0)
{
cout<<"此问题无可行解!"<<endl;
return 0;
}
}
}
for (i = 0;i < N;i++)
{
for (j = 0;j < M;j++)
{
if (i == XB[j])
{
break;
}
}
if (j < M)
{
continue;
}
else
{
if (cj_zj[i] == 0)
{
cout<<"此问题有无穷多最优解!"<<endl;
return 0 ;
}
}
}
cout<<"此问题有唯一解!"<<endl;
cout<<"最优解为:"<<endl;
float X[100];
for (i = 0;i < N;i++)
{
X[i] = 0;
}
for (i = 0;i < M;i++)
{
X[XB[i]] = b[i];
}
for (i = 0;i < N;i++)
{
cout<<X[i]<<" ";
}
cout<<endl<<"目的函数值为:";
float sum = 0;
for (i = 0;i < M;i++)
{
sum += CB[i] * b[i];
}
cout<<sum<<endl;
return 0;
}
}
运营截图如下:。