#include<iostream>
#include<iomanip>
#define inf 1000000
using namespace std;
typedef struct vex
{
int x,y,z;
int total;
int a,b,c;
}Vex;
void init(Vex V[][9]) //初始化顶点信息
{
int a=10,b=14,c=19;
int u[6];
u[0]=6;u[1]=1;u[2]=7;u[3]=5;u[4]=9;u[5]=6;
for(int i=0;i<3;i++)
for(int j=0;j<9;j++)
{
V[i][j].x=j%3; //x表示左右表面被切割的次数;
V[i][j].y=j/3; //y表示前后表面被切割的次数;
V[i][j].z=i; //z表示上下表面被切割的次数;
V[i][j].total=V[i][j].x+V[i][j].y+V[i][j].z;
V[i][j].a=a; V[i][j].b=b; V[i][j].c=c;
for(int p=0;p<V[i][j].x;p++)
V[i][j].a=V[i][j].a-u[p];
for(p=0;p<V[i][j].y;p++)
V[i][j].b=V[i][j].b-u[p+2];
for(p=0;p<V[i][j].z;p++)
V[i][j].c=V[i][j].c-u[p+4];
}
}
void initweightH1(int weight[][27],Vex V[][9],int e,int r) //初始化各条边的权值
{
for(int i=0;i<27;i++)
for(int j=0;j<27;j++)
{
weight[i][j]=inf;
}
for (i=0;i<3;i++)
for(int j=0;j<9;j++)
{
if(V[i][j].total<V[i][j+1].total&&j+1<9)
{
weight[i*9+j][i*9+j+1]=(V[i][j+1].x-V[i][j].x)*V[i][j].b*V[i][j].c;
if(j==7||j==3)
weight[i*9+j][i*9+j+1]=weight[i*9+j][i*9+j+1]+e;
}
if(V[i][j].total<V[i][j+3].total&&j+3<9)
{
weight[i*9+j][i*9+j+3]=(V[i][j+3].y-V[i][j].y)*V[i][j].a*V[i][j].c;
if(j==4)
weight[i*9+j][(i+1)*9+j]=weight[i*9+j][(i+1)*9+j]+e;
}
if(V[i][j].total<V[i+1][j].total&&i+1<3)
weight[i*9+j][(i+1)*9+j]=(V[i+1][j].z-V[i][j].z)*V[i][j].a*V[i][j].b*r;
}
for (i=0;i<3;i++)
{
weight[i*9+1][i*9+2]=inf;
weight[i*9+4][i*9+5]=inf;
weight[i*9+2][i*9+5]=inf;
weight[i*9+5][i*9+8]=inf;
}
}
void initweightH2(int weight[][27],Vex V[][9],int e,int r) //初始化各条边的权值
{
for(int i=0;i<27;i++)
for(int j=0;j<27;j++)
{
weight[i][j]=inf;
}
for (i=0;i<3;i++)
for(int j=0;j<9;j++)
{
if(V[i][j].total<V[i][j+1].total&&j+1<9)
{
weight[i*9+j][i*9+j+1]=(V[i][j+1].x-V[i][j].x)*V[i][j].b*V[i][j].c;
if(j==4)
weight[i*9+j][i*9+j+1]=weight[i*9+j][i*9+j+1]+e;
}
if(V[i][j].total<V[i][j+3].total&&j+3<9)
{
weight[i*9+j][i*9+j+3]=(V[i][j+3].y-V[i][j].y)*V[i][j].a*V[i][j].c;
if(j==2||j==5)
weight[i*9+j][(i+1)*9+j]=weight[i*9+j][(i+1)*9+j]+e;
}
if(V[i][j].total<V[i+1][j].total&&i+1<3)
weight[i*9+j][(i+1)*9+j]=(V[i+1][j].z-V[i][j].z)*V[i][j].a*V[i][j].b*r;
}
for (i=0;i<3;i++)
{
weight[i*9+3][i*9+6]=inf;
weight[i*9+4][i*9+7]=inf;
weight[i*9+6][i*9+7]=inf;
weight[i*9+7][i*9+8]=inf;
}
}
int GetEdgeValue(int v0,int v2,int weight[][27]) //返回各条边的权值
{
return weight[v0][v2];
}
void Dijkstra(int v0,int path[],int weight[][27]) //最短路径dijkstra算法
{
bool *S=new bool[27];
int *dist=new int[27];
int k;
for(int i=0;i<27;i++)
{
dist[i]=GetEdgeValue(0,i,weight);
S[i]=0;
if(dist[i]<inf)
path[i]=0;
else path[i]=-1;
}
S[0]=1;
dist[0]=0;
for(int v=1;v<27;v++)
{
int min=inf;
for (int j=0;j<27;j++) //找到权值最小的一条边
if(min>dist[j]&&S[j]==0)
{
k=j;
min=dist[j];
}
S[k]=1; //将该顶点加入
for(int w=0;w<27;w++) //更新集合V-S中各顶点的当前最短路径
{
if(S[w]==0&&dist[k]+GetEdgeValue(k,w,weight)<dist[w])
{
dist[w]=dist[k]+GetEdgeValue(k,w,weight);
path[w]=k;
}
}
}
}
void main()
{
Vex V[3][9];
int i=0;
init(V);
int path[2][27]={0};
int weight[27][27];
int e=2;
int r=15;
initweightH1(weight,V,e,r);
/* for(i=0;i<27;i++)
{
for(int j=0;j<27;j++)
cout<<setw(10)<<weight[i][j];
cout<<endl;
} */
Dijkstra(0,path[0],weight);
cout<<"最短路径path数组:"<<endl;
for(i=0;i<27;i++)
cout<<setw(10)<<path[0][i];
//求费用
int behind=26;
int before=path[0][behind];
int sum=0;
while(before!=-1)
{
sum=sum+weight[before][behind];
behind=before;
before=path[0][behind];
}
cout<<endl<<"H1最小总费用:";
cout<<sum<<"(元)"<<endl;
initweightH2(weight,V,e,r);
Dijkstra(0,path[1],weight);
cout<<"最短路径path数组:"<<endl;
for(i=0;i<27;i++)
cout<<setw(10)<<path[1][i];
behind=26;
before=path[1][behind];
int sum1=0;
while(before!=-1)
{
sum1=sum1+weight[before][behind];
behind=before;
before=path[1][behind];
}
cout<<endl<<"H2最小总费用:";
cout<<sum1<<"(元)"<<endl;
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
在数学建模中,钢材切割问题是一个典型的优化问题,它涉及到如何有效地利用有限长度的钢材来满足各种不同长度的需求,从而最大化利用率或收益。在这个问题中,C++被用作编程语言来解决这个问题,体现了C++在算法实现和计算效率上的优势。 "最优截断切割问题.doc"可能是对钢材切割问题的详细描述,包括问题背景、目标函数、约束条件等。在数学建模中,通常会先对问题进行建模,比如定义决策变量(如每段钢材的长度)、目标函数(如最小化浪费的钢材长度)和约束条件(如钢材总长度固定,需求长度多种多样)。Word文档可能还包含了问题的解决方案思路和算法设计。 C++作为编程语言,它支持面向对象编程,拥有丰富的标准库,能够方便地处理数据结构和算法。在解决钢材切割问题时,可能会用到数组或者链表来存储钢材信息,用排序算法优化切割顺序,以及动态规划或贪心策略来求解最优化问题。动态规划是解决这类问题的经典方法,通过构建一个表格,存储前i段钢材能产生的最大收益,逐步求出全局最优解。贪心策略则是在每一步选择当前看起来最好的决策,但不保证全局最优。 "steel"和"steel_2"可能分别代表两份不同的数据集,用于测试程序的性能和通用性。数据集可能包含了钢材的原始长度和不同客户的需求长度,这些数据用于模拟实际情况并验证程序的正确性和效率。 这个压缩包提供的资料涵盖了数学建模的全过程,从问题理解、模型建立到C++代码实现和数据验证。学习者可以通过分析这个案例,了解如何将抽象的数学模型转化为具体的计算机程序,并掌握如何运用C++解决实际问题。同时,这也反映了数学建模在工程优化中的应用,以及C++在解决复杂计算问题时的能力。
资源推荐
资源详情
资源评论
收起资源包目录
钢管切割问题.rar (28个子文件)
steel
main.cpp 3KB
steel.plg 1KB
steel.dsw 535B
steel.dsp 4KB
steel.opt 48KB
Debug
vc60.pdb 108KB
vc60.idb 65KB
steel.pch 1.92MB
steel.ilk 751KB
main.obj 148KB
steel.exe 504KB
steel.pdb 1.02MB
steel.ncb 49KB
steel.h 254B
最优截断切割问题.doc 1.68MB
steel_2
main.cpp 5KB
steel_2.dsp 4KB
steel_2.ncb 41KB
steel_2.plg 1KB
Debug
steel_2.exe 508KB
vc60.pdb 108KB
vc60.idb 65KB
steel_2.pch 1.91MB
main.obj 152KB
steel_2.pdb 1.02MB
steel_2.ilk 752KB
steel_2.opt 48KB
steel_2.dsw 539B
共 28 条
- 1
资源评论
- SamG95272019-01-04看文档是三维切割的资料。
- 大志若愚2013-02-02嗯,很好的资料,可以运行,还有文档。
midnightdream
- 粉丝: 12
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功