最优控制大作业Word文档下载推荐.docx

上传人:b****5 文档编号:19928256 上传时间:2023-01-12 格式:DOCX 页数:34 大小:140.93KB
下载 相关 举报
最优控制大作业Word文档下载推荐.docx_第1页
第1页 / 共34页
最优控制大作业Word文档下载推荐.docx_第2页
第2页 / 共34页
最优控制大作业Word文档下载推荐.docx_第3页
第3页 / 共34页
最优控制大作业Word文档下载推荐.docx_第4页
第4页 / 共34页
最优控制大作业Word文档下载推荐.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

最优控制大作业Word文档下载推荐.docx

《最优控制大作业Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最优控制大作业Word文档下载推荐.docx(34页珍藏版)》请在冰豆网上搜索。

最优控制大作业Word文档下载推荐.docx

{

doublemax=0;

//最高产值

doubledelta[5]={-7,-12,0,0,0};

//判别数

doubleb[3]={360,200,300};

//基可行解

doublea[3][5]={9,4,1,0,0,//系数矩阵A

4,5,0,1,0,

3,10,0,0,1};

doublesita[3];

//出基变量判别数

intin;

//进入基变量位置

intout;

//出入基变量位置

intflag=0;

//判别数是否全部非负的标志

while(!

flag)

{

in=varIn(delta);

out=varOut(sita,a,b,delta);

cal(sita,a,b,delta);

flag=1;

for(inti=0;

i<

5;

i++)

{

if(delta[i]<

0)//是否所有的判别数都大于0

flag=0;

}

}

cout<

<

"

生产A和B产品的产量和最大产值:

endl;

*****************************"

max=7*(*A)+12*(*B);

产值最大时A产品的产量:

x="

*A<

"

产值最大时B产品的产量:

y="

*B<

最大产值为:

optimal="

max<

return0;

}

intvarIn(doubledelta[5])

{

intk=0;

doublemindelta=delta[0];

for(inti=1;

i<

i++)

if(delta[i]<

mindelta)

mindelta=delta[i];

k=i;

returnk;

}

intvarOut(doublesita[3],doublea[3][5],doubleb[3],doubledelta[5])

intl=0;

doubleminsita=1000;

3;

if(a[i][varIn(delta)]>

0)

sita[i]=b[i]/a[i][varIn(delta)];

if(sita[i]<

minsita)

{

minsita=sita[i];

l=i;

}

returnl;

voidcal(doublesita[3],doublea[3][5],doubleb[3],doubledelta[5])

{

inti,j,k,l;

doublea1[3][5];

doubleb1[3];

doubledelta1[5];

k=varIn(delta);

l=varOut(sita,a,b,delta);

for(i=0;

{

b1[i]=b[i];

for(j=0;

j<

j++)

a1[i][j]=a[i][j];

delta1[j]=delta[j];

if(i!

=l)

{

a[i][j]=a1[i][j]-a1[l][j]*a1[i][k]/a1[l][k];

b[i]=b1[i]-b1[l]*a1[i][k]/a1[l][k];

}

else

a[i][j]=a1[l][j]/a1[l][k];

b[i]=b1[l]/a1[l][k];

delta[j]=delta1[j]-a1[l][j]*delta1[k]/a1[l][k];

if(k==0)

A=&

b[l];

elseif(k==1)

B=&

程序运行结果为:

2某车间有一批长度为180公分的钢管(数量充分多)。

为制造零件的需要,要将其截成3种不同长度的管料:

70公分、52公分、35公分。

经过试算,可以由以下8种截法:

(一)

(二)

(三)

(四)

(五)

(六)

(七)

(八)

70公分

2

1

52公分

3

35公分

5

边料

5cm

6cm

23cm

24cm

问应如何同时采取若干种截法配合起来,既满足下列情况的配套要求,而又使总的边料为最少。

(a)要求:

70公分长的管料不少于100根,52公分长的管料不少于100根,35公分长的管料不多于100根。

(b)要求:

70公分、52公分、35公分长的管料均不少于100根。

(c)要求:

70公分长的管料不少于100根,52公分长的管料不多于150根,35公分长的管料不少于100根。

试分别写出上述3种要求下的约束条件和目标函数。

利用单纯形法由计算机分别求解3个线性规划问题。

(a)设八种截法各截出的管料数为:

和人为变量

使不等式约束变为等式约束

(b)设八种截法各截出的管料数为:

(c)设八种截法各截出的管料数为:

#include<

stdio.h>

math.h>

iostream.h>

doubleM=10000000;

staticdoubleA[20][20];

doublefunction(doublex1,doublex2,doublex3,doublex4,doublex5,

doublex6,doublex7,doublex8)

doubleval;

val=5*x1+6*x2+23*x3+5*x4+24*x5+6*x6+23*x7+5*x8;

returnval;

voidinit_Array(intsign)

switch(sign)

case1:

A[0][1]=5;

A[0][2]=6;

A[0][3]=23;

A[0][4]=5;

A[0][5]=24;

A[0][6]=6;

A[0][7]=23;

A[0][8]=5;

A[1][0]=100;

A[1][1]=2;

A[1][2]=1;

A[1][3]=1;

A[1][4]=1;

A[1][5]=0;

A[1][6]=0;

A[1][7]=0;

A[1][8]=0;

A[1][9]=-1;

A[1][10]=0;

A[1][11]=0;

A[2][0]=100;

A[2][1]=0;

A[2][2]=2;

A[2][3]=1;

A[2][4]=0;

A[2][5]=3;

A[2][6]=2;

A[2][7]=1;

A[2][8]=0;

A[2][9]=0;

A[2][10]=-1;

A[2][11]=0;

A[3][0]=100;

A[3][1]=1;

A[3][2]=0;

A[3][3]=1;

A[3][4]=3;

A[3][5]=0;

A[3][6]=2;

A[3][7]=3;

A[3][8]=5;

A[3][9]=0;

A[3][10]=0;

A[3][11]=1;

break;

case2:

A[3][11]=-1;

case3:

A[1][8]=0;

A[2][0]=150;

A[2][10]=1;

default:

题号输入错误"

;

intmain()

intm,n,num,rk,rv,l,p;

inti,j,k,L[15];

doublev_min,mid,b,min,sum;

staticdoublex[10];

请输入结构变量的个数:

endl<

m="

cin>

>

m;

请输入约束条件的个数:

n="

n;

请选择目标函数的极值(极大:

-1,极小:

1):

p="

p;

请输入需求解问题的题号(1,2,3):

num;

rk=0;

init_Array(num);

for(i=0;

=m;

i++)

A[0][i]=A[0][i]*p;

for(i=1;

=n;

if(A[i][m+i]==1)

L[i]=m+i;

else

L[i]=m+n+i;

A[0][m+n+i]=M;

A[i][m+n+i]=1;

rk++;

if(rk!

=0)

for(j=1;

=m+n+rk;

j++)

A[n+1][j]=A[0][j];

sum=0;

sum=sum+A[n+1][L[i]]*A[i][j];

A[0][j]=A[n+1][j]-sum;

//重求目标函数的系数

while

(1)

k++;

v_min=A[0][1];

l=1;

for(j=2;

=m+n;

if(A[0][j]<

v_min)

v_min=A[0][j];

l=j;

}//求进基变量

rv=0;

if(L[i]>

m+n)

if(A[i][0]!

rv=1;

break;

if(v_min>

=0)

if(rv==0)

x[L[i]]=A[i][0];

min=function(x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8]);

}//若目标函数中各变量的系数均为正,且该顶点中的人为变量等于0,则该顶点为最优解

else

cout<

noanswer"

return;

//若目标函数中各变量的系数均为正,且该顶点中的人为变量不等于0,则无解

b=A[1][l];

mid=A[j][l];

if(mid>

b)

b=mid;

if(b<

0)

//若约束条件中各式中换入元的系数均为负,则不存在最优解

return;

if((A[i][0]/A[i][l])>

b=A[i][0]/A[i][l];

k=i;

}//必须为正才可以

mid=A[i][0]/A[i][l];

if((mid<

b)&

&

(mid>

0))

{

}//确定出基变量

L[k]=l;

A[i+n+1][j]=A[i][j];

for(i=1;

if(i==k)

for(j=0;

=n+m+rk;

A[k][j]=A[k+n+1][j]/A[k+n+1][l];

{

for(j=0;

A[i][j]=A[i+n+1][j]-A[k+n+1][j]*A[i+n+1][l]/A[k+n+1][l];

}//进行线性变换

sum=0;

{

sum=sum+A[n+1][L[i]]*A[i][j];

}

}//重新求线性方程组的系数

********************************"

=8;

按截法"

截的钢管根数:

x["

]="

x[i]<

总的边料最少为:

ObjectiveFunction="

min<

运行结果如下:

(a)题:

(b)题:

(c)题:

动态规划法

第三题采用的动态规划法,动态规划从本质上讲是一种非线性规划方法,其核心是贝尔曼最优性原理,这些原理可以归结为一个基本的递推关系式,从而使决策过程连续的转移,并将一个多步最优控制问题化为多个一步最优控制问题,从而简化求解过程,动态规划的基本模型如下:

1.确定问题的决策对象。

2.对决策过程划分阶段。

3.对各阶段确定状态变量。

4.根据状态变量确定费用函数和目标函数。

5.建立各阶段状态变量的转移过程,确定状态转移方程。

多极决策过程的最优策略具有这样的性质,不论初始状态和初始决策如何,当把其中的任何一级和状态再作为初始级和初始状态时,其余决策对此必定也是一个最优决策。

3要求从城市1到12建立一条客运线。

各段路所能获得的利润如下表,注意:

从一个给定的城市出发只能直接到达某些城市。

问从城市1到12应走怎样的路线,才能获得最大利润。

到达城市

4

6

7

8

9

10

11

12

利润

出发城市

map>

vector>

constintN=11;

constintM=12;

staticintA[N][M];

A[1][2]=5;

A[1][3]=4;

A[1][4]=2;

A[2][5]=8;

A[2][6]=10;

A[2][7]=5;

A[2][8]=7;

A[3][5]=6;

A[3][6]=3;

A[3][7]=8;

A[3][8]=10;

A[4][5]=8;

A[4][6]=9;

A[4][7]=6;

A[4][8]=4;

A[5][9]=8;

A[5][10]=4;

A[5][11]=3;

A[6][9]=5;

A[6][10]=2;

A[6][11]=7;

A[7][9]=4;

A[7][10]=10;

A[7][11]=6;

A[8][9]=12;

A[8][10]=5;

A[8][11]=2;

A[9][12]=7;

A[10][12]=3;

A[11][12]=6;

//出发城市到到达城市的利润值

inttotal_0[3],total_1[4];

map<

int,int>

m;

//城市号作为关联容器的键,下一站的的城市号为关联容器的值

vector<

int>

distant;

//最优路径存放的向量

inti=0,j=0;

for(i=2;

=4;

i++)//第1站到第2站的利润值

total_0[i-2]=A[1][i];

m.insert(map<

:

value_type(i,1));

for(i=5;

i++)//第2站到第3站的利润值

intmax=0,k;

for(j=2;

if(total_0[j-2]+A[j][i]>

max)

max=total_0[j-2]+A[j][i];

k=j;

total_1[i-5]=max;

m.insert(map<

value_type(i,k));

for(i=9;

=11;

i++)//第3站到第4站的利润值

intmax=0,k;

for(j=5;

if(total_1[j-5]+A[j][i]>

ma

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1