离散数学课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京科技大学
《离散数学》课程设计报告
2016年 1 月18 日
《离散数学》课程设计报告
课程题目:
以最短的时间(代价)把水送给所有的用户,其中送水车从水厂出发,送完水后不用返回水厂。
一个水厂(北京卧佛寺水厂, 北纬40.00°,东经116.12°)
十个用户:
(1) 清华科技广场(需4t水), 东经116.33°,北纬40.00°
(2) 北科大天工大厦(需2t水),东经116.36°,北纬40.00°
(3) 北京市海淀区长远天地大厦(2t),东经116.31°, 北纬39.98°
(4) 北京林业大学A大厦(1t),东经116.35°,北纬40.00°
(5) 北京邮电大学B大厦(2t),东经116.36°,北纬39.98°
(6) 北京市海淀区翠宫饭店(2t),东经116.34°,北纬39.98°
(7) 北京师范大学C座(2t),东经116.38°,北纬39.97°
(8) 北京师范大学D座(1t),东经116.38°,北纬39.97°
(9) 北京市盘古七星大厦(2t), 东经116.39°,北纬40.00°
(10) 北医三院(2t) , 东经116.36°,北纬40.00°
送水车:共2量,每辆载货10t
一、设计思路
首先,要从实际问题抽象出一个数学模型。
我们通过百度地图查找了每个点对应的位置和每两点之间的距离,写出对应的矩阵。
其次,为了简化计算,我们抽象模型时采用了无向图,即两点之间需要的时间与方向无关,这样由于掉头等原因产生的时间差就被忽略掉了,并且只画出了较近两点的边(减少不必要的计算量)。
再者,因为有两辆运水车,我们对整个图进行了人为的分割,如图:
分割成两部分。
第一部分:水厂、清华科技园、林业大学、科大盘古酒店、北京师范大学C座。
水厂科大盘古清华林大北师
水厂{0,40,44,37,40,49},
科大{40,0,6,2,2,11},
盘古{44,6,0,7,4,5},
清华{37,2,7,0,3,12},
林大{40,2,4,3,0,9},
北师{49,11,5,12,9,0} ;
第二部分:水厂、长远天地、翠宫饭店、北医三院、北京邮电大学、北京师范大学B座。
水厂长远,翠宫,三院,北邮,北师
水厂{0,35,37,41,42,44},
长远{35,0,3,7,8,11},
翠宫{37,3,0,4,5,8},
三院{41,7,4,0,4,3},
北邮{42,8,5,4,03},
北师{44,11,8,3,30}
这样我们就得到了两个图和对应的邻接矩阵。
我们分别用0~5代表不同的地点,使用穷举法对两个图分别进行遍历并求出时间最少的路径。
二、代码:
#include <iostream>
using namespace std;
int main () {
int a1[6][6]=
{{0,40,44,37,40,49},{40,0,6,2,2,11},{44,6,0,7,4,5},{37,2,7,0,3,12},{40,2,4,3,0,9},{49,11,5,12,9,0}} ;
int d1=500;
int N=200;
long b1[N];
int c1=0;
int i=0,j,k,m,n,p;
cout<<"第一辆车经过科大,盘古,清华,林大,北师"<<endl;
for(j=1; j<=5; j++)
{
if(j!=i)
for(k=1; k<=5; k++)
{
if(k!=i && k!=j)
for(m=1; m<=5; m++)
{
if(m!=i && m!=j && m!=k)
for(n=1; n<=5; n++)
{
if(n!=i && n!=j && n!=k && n!=m)
for(p=1; p<=5; p++)
{
if(p!=i && p!=j && p!=k && p!=m && p!=n)
{
c1=c1+1;
b1[c1]=a1[i][j]+a1[j][k]+a1[k][m]+a1[m][n]+a1[n][p];
if(d1>=b1[c1])
{
d1=b1[c1];
cout<<"最短路径为
"<<i<<j<<k<<m<<n<<p<<endl;
}
}
}
}
}
}
}
cout<<"此时最短距离为"<<d1<<"km"<<endl;
cout<<endl;
int a2[6][6]=
{{0,35,37,41,42,44},{35,0,3,7,8,11},{37,3,0,4,5,8},{41,7,4,0,4,3},{42,8,5,4,0,3},{44,11,8,3,3,0}};
int d2=500;
int M=200;
long b2[M];
int c2=0;
int z=0,x,c,v,b,f;
cout<<"第二辆车经过长远,翠宫,三院,北邮,北师"<<endl;
for(x=1; x<=5; x++)
{
if(x!=z)
for(c=1; c<=5; c++)
{
if(c!=z && c!=x)
for(v=1; v<=5; v++)
{
if(v!=z && v!=x && v!=c)
for(b=1; b<=5; b++)
{
if(b!=z && b!=x && b!=c && b!=v)
for(f=1; f<=5; f++)
{
if(f!=z && f!=x && f!=c && f!=v && f!=b)
{
c2=c2+1;
b2[c2]=a2[z][x]+a2[x][c]+a2[c][v]+a2[v][b]+a2[b][f];
if(d2>=b2[c2]) {
d2=b2[c2];
cout<<"最短路径为
"<<z<<x<<c<<v<<b<<f<<endl;
}
}
}
}
}
}
}
cout<<"此时最短距离为"<<d2<<"km"<<endl;
}
两辆车同时出发,其中一辆车走水厂->清华->科大->林大->盘古->北师(一吨),最短距离为50千米,另外一辆车走水厂->长远天地->翠宫饭店->北邮->北师(两吨)->三院,最短距离为48千米。
三、总结
本学期通过《离散数学》课程的学习,我们收获了关于集合、逻辑、图
论等方面的知识,并在实际问题中应用了图论的知识进行分析和解答,用程
序的方式展现在大家面前。
在本次离散大作业中,我们小组成员齐心协力,
明确分工,共同完成了这次的课程设计。
俗话说“一分耕耘,一分收获”,
设计过程中我们遇到了一些困难,但是我们没有放弃,从中学到了很多书本
上学不到的知识。
这门课程是一门非常实用的课程,给我们以后的课程打下
了坚实的基础。