问题分析
1、随机生成点:直接用rand函数生成点的坐标;
2、点与点随机连成边:用rand函数生成NN矩阵,大于某设定门限值(例如08)则连边;
3、计算任意两点间的最短路径,分两种做法:
(1)随机取两点,计算最短路径,用graphshortestpath函数;
(2)把任意两点间的最短路径全部计算出来,形成一个矩阵,用graphallshortestpaths函数。
4、计算出最小生成树:用graphminspantree函数。
其中,graphshortestpath、graphallshortestpaths、graphminspantree均为生物信息工具箱(Bioinformatics Toolbox)中的函数。
参考代码
匆忙间编写了一段代码,供参考。
% 随机生成点的数量N = 10;
% 生成点的坐标
x = rand(N, 1); y = rand(N, 1);
% 随机生成连接关系(随机数大于门限值为有连接)
L = rand(N, N) > 08;
% 计算各节点距离(保留两位小数)
D = round(squareform(pdist([x y]))100)/100;
% 用稀疏矩阵表示图
DG = sparse(DL);
% 转换为无向图
UG = tril(DG + DG');
% 显示图
view(biograph(UG,[],'ShowArrows','off','ShowWeights','on'));
% 计算最小生成树
ST = graphminspantree(UG);
view(biograph(ST,[],'ShowArrows','off','ShowWeights','on'))
% 计算所有节点间的最小路径(两两对应)
dist = graphallshortestpaths(UG,'directed',false);
disp(num2str(dist,' %2f'))
% 计算任意(随机选择)两个节点间的最小路径
i = ceil(randN); j = ceil(randN);
[dist,path,pred] = graphshortestpath(UG,i,j,'directed',false);
% 突出显示最小路径
h = view(biograph(UG,[],'ShowArrows','off','ShowWeights','on'));
set(hNodes(path),'Color',[1 04 04])
fowEdges = getedgesbynodeid(h,get(hNodes(path),'ID'));
revEdges = getedgesbynodeid(h,get(hNodes(fliplr(path)),'ID'));
edges = [fowEdges;revEdges];
set(edges,'LineColor',[1 0 0])
set(edges,'LineWidth',15)
运行结果
1、随机生成的无向图:
2、最小生成树:
3、随机选择两节点,计算最小路径(节点6和9之间):
4、任意节点间的最小路径:
000 070 138 137 069 075 057 006 014 029070 000 172 152 085 109 085 064 084 044
138 172 000 247 165 063 087 142 142 139
137 152 247 000 149 184 160 131 151 108
069 085 165 149 000 102 078 064 083 041
075 109 063 184 102 000 024 079 079 076
057 085 087 160 078 024 000 055 055 052
006 064 142 131 064 079 055 000 020 023
014 084 142 151 083 079 055 020 000 043
029 044 139 108 041 076 052 023 043 000
“为了公平起见,我们决定做一个随机点名小程序”不是说你们决定做一个小程序吗?为什么不自己做呀?没有必要一个班的学生都没有能力编写一个这种简单程序吧
百度知道并不是一个提交结果的平台,所谓知道就是将知识贡献,让大家获得启发,不是给人当奴隶干活!
适合。
1、首先,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
2、其次,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换
3、最后,链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。
要点到固定一个人,需要使用一些技巧来保证效果:
1 名单输入:将参与者的名字输入电脑或手机,使用随机选择工具来选出一个幸运儿。但是,要保证这个名单已经事先准备好了,里面已经写好了要点到的那个人的名字。
2 重复选择:多次使用随机选择工具来选出幸运儿,并将结果进行记录。保证要点到的那个人每一次都被抽中。这种方法需要使用较为复杂的电脑程序或者工具,需要考虑到概率问题。
3 人工控制:通过人工手动 *** 作,将要点到的那个人设定为每一次点名的第一个人。例如,在班级里点名时,可以先将要点到的那个人放在课桌最前面,然后再开始点名。这种方法需要人工 *** 作,要求点名者具有较高的技巧和灵活性。
a=rand(100,1)500; %生成点的x坐标
b=rand(100,1)500;%生成点的Y坐标
plot(a,b,'') %画点
for i=0:100:400
for j=0:100:400
rectangle('Position',[i,j,100,100],'Curvature',[0,0],'LineWidth',2,'LineStyle','-')
end
end
% 取第 1,2 个点画连接线
a1 = a(1); b1 = b(1);
a2 = a(2); b2 = b(2);
hold on
plot(a1,b1,'ro');
plot(a2,b2,'ro');
line([a1 a2],[b1 b2],'color','r');
Randomize
a = Int(4 Rnd + 1)
Delay a 1000
Select Case a
Case 1: MoveTo 1449,683
Case 2: MoveTo 1614,689
Case 3: MoveTo 1776,678
Case 4: MoveTo 1538,671
End Select
LeftClick 1
以上就是关于matlab课堂作业关于随机点的一些问题全部的内容,包括:matlab课堂作业关于随机点的一些问题、c语言 随机点名、随机点名程序中学生的信息是否适合保存在链表中,为什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)