网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月26日漏签0天
mathematica吧 关注:19,925贴子:74,213
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 4回复贴,共1页
<<返回mathematica吧
>0< 加载中...

怎么改下面的程序使其运行时间更快

  • 只看楼主
  • 收藏

  • 回复
  • shineTencole
  • ()[]区别
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我写了一个程序,虽然能运行出来,但是需要将近12小时的时间,有没有大佬看下怎么改能使其运行时间更少一些
J = {{26.`, 31.`}, {5.`, 33.`}, {8.`, 9.`}, {10.`, 24.`}, {13.`,
34.`}, {17.`, 23.`}, {20.`, 10.`}, {25.`, 47.`}, {31.`,
18.`}, {35.`, 42.`}, {36.`, 25.`}, {41.`, 31.`}, {45.`,
38.`}, {41.`, 35.`}, {40.`, 34.`}, {38.`, 35.`}, {38.`,
37.`}, {33.`, 37.`}, {31.`, 36.`}, {33.`, 35.`}, {28.`,
32.`}, {24.`, 30.`}, {21.`, 31.`}, {22.`, 27.`}, {28.`,
29.`}, {43.`, 37.`}, {44.`, 39.`}, {25.`, 27.`}, {21.`,
29.`}, {22.`, 30.`}, {24.`, 32.`}, {37.`, 33.`}, {38.`,
33.`}, {37.`, 36.`}, {14.`, 13.`}, {16.`, 9.`}, {14.`, 7.`}, {18.`,
14.`}, {12.`, 6.`}, {15.`, 14.`}, {20.`, 13.`}, {13.`,
46.`}, {16.`, 39.`}, {21.`, 39.`}, {26.`, 44.`}, {28.`,
40.`}, {27.`, 42.`}, {29.`, 38.`}, {29.`, 44.`}, {36.`,
44.`}, {41.`, 40.`}, {39.`, 52.`}, {27.`, 49.`}, {23.`,
46.`}, {20.`, 46.`}, {16.`, 46.`}, {22.`, 44.`}, {40.`,
44.`}, {42.`, 40.`}, {37.`, 42.`}, {35.`, 49.`}, {35.`,
51.`}, {35.`, 52.`}, {34.`, 55.`}, {26.`, 53.`}, {27.`,
51.`}, {31.`, 51.`}, {31.`, 45.`}, {31.`, 41.`}, {28.`,
45.`}, {27.`, 35.`}, {24.`, 38.`}, {26.`, 39.`}, {13.`,
37.`}, {17.`, 36.`}, {21.`, 41.`}, {18.`, 41.`}, {21.`,
43.`}, {13.`, 39.`}, {14.`, 43.`}, {12.`, 43.`}, {10.`,
44.`}, {16.`, 44.`}, {18.`, 44.`}, {24.`, 44.`}, {25.`,
49.`}, {24.`, 49.`}, {24.`, 51.`}, {21.`, 48.`}, {17.`,
51.`}, {10.`, 34.`}, {9.`, 35.`}, {7.`, 37.`}, {4.`, 37.`}, {5.`,
42.`}, {2.`, 44.`}, {7.`, 32.`}, {7.`, 30.`}, {1.`, 24.`}, {2.`,
16.`}, {3.`, 18.`}, {2.`, 20.`}, {4.`, 24.`}, {5.`, 28.`}, {6.`,
24.`}, {9.`, 29.`}, {2.`, 33.`}, {7.`, 34.`}, {3.`, 30.`}, {3.`,
41.`}, {10.`, 36.`}, {17.`, 34.`}, {20.`, 22.`}, {24.`,
21.`}, {22.`, 17.`}, {21.`, 16.`}, {27.`, 19.`}, {26.`,
16.`}, {9.`, 16.`}, {12.`, 17.`}, {14.`, 15.`}, {19.`,
26.`}, {14.`, 28.`}, {13.`, 25.`}, {9.`, 19.`}, {2.`, 1.`}, {6.`,
6.`}, {7.`, 8.`}, {6.`, 14.`}, {5.`, 17.`}, {5.`, 16.`}, {16.`,
19.`}, {26.`, 13.`}, {29.`, 11.`}, {31.`, 14.`}, {28.`,
17.`}, {20.`, 19.`}, {17.`, 22.`}, {15.`, 23.`}, {21.`,
23.`}, {24.`, 23.`}, {26.`, 23.`}, {25.`, 25.`}, {15.`,
31.`}, {15.`, 29.`}, {10.`, 28.`}, {38.`, 26.`}, {37.`,
25.`}, {33.`, 21.`}, {40.`, 24.`}, {44.`, 44.`}, {41.`,
31.`}, {33.`, 24.`}, {32.`, 27.`}, {40.`, 14.`}, {42.`,
26.`}, {45.`, 33.`}, {29.`, 23.`}, {31.`, 30.`}, {30.`,
25.`}, {31.`, 23.`}, {35.`, 15.`}, {40.`, 16.`}, {40.`,
20.`}, {37.`, 20.`}, {35.`, 24.`}, {43.`, 23.`}, {45.`,
26.`}, {37.`, 28.`}, {35.`, 28.`}, {33.`, 29.`}, {37.`,
30.`}, {39.`, 30.`}, {41.`, 29.`}, {43.`, 31.`}, {47.`,
34.`}, {46.`, 43.`}, {42.`, 43.`}, {48.`, 45.`}, {42.`,
44.`}, {43.`, 50.`}}
y = {};
Table[shaixuan = {};
Do[If[m == e || m == a, Continue[]];
shaixuan = Append[shaixuan, J[[m]]], {m, 1, 181}];
patr = Partition[Flatten[{J[[e]], J[[a]], shaixuan}], 2];
V = Table[patr[[n]], {n, 1, 15}];
s = {};
Table[
di = Sqrt[(V[[i, 1]] - V[[j, 1]])^2 + (V[[i, 2]] - V[[j, 2]])^2];
s = Append[s, {i, j, di}],
{i, 1, 15}, {j, i + 1, 15}];
P = Sort[s, #1[[3]] < #2[[3]] &];
gi = P[[1, 1]] <-> P[[1, 2]];
ki = {1};
Do[we = Flatten[{gi, P[[o, 1]] <-> P[[o, 2]]}];
If[AcyclicGraphQ[Graph[we]] == False, Continue[]];
ki = Append[ki, o]; gi = we, {o, 2, Dimensions[P][[1]]}];
sumdist1 = 0;
Table[sumdist1 = P[[ki[[r]], 3]] + sumdist1, {r, 1, Length[ki]}];
panding[tp_] = If[tp == 1, 1, If[tp <= 15, 2, 3]];
juzheng[tp_] = If[panding[tp] == 1, ( {
{1},
{0},
{0}
} ), If[panding[tp] == 2, ( {
{1},
{0},
{1}
} ), ( {
{0},
{1},
{1}
} )]];
se = {};
Do[If[Flatten[Transpose[juzheng[T]].juzheng[Y]] == {0}, Continue[]];
dist = Sqrt[(patr[[T, 1]] - patr[[Y, 1]])^2 + (patr[[T, 2]] -
patr[[Y, 2]])^2]; se = Append[se, {T, Y, dist}],
{T, 1, 181}, {Y, T + 1, 181}];
pai = Sort[se, #1[[3]] < #2[[3]] &];
gra = gi;
shulie = {};
Do[grah = Flatten[{gra, pai[[t, 1]] <-> pai[[t, 2]]}];
If[AcyclicGraphQ[Graph[grah]] == False, Continue[]]; gra = grah;
shulie = Append[shulie, t], {t, 1, Dimensions[pai][[1]]}];
sumdist2 = 0;
Table[sumdist2 = pai[[shulie[[u]], 3]] + sumdist2, {u, 1,
Length[shulie]}];
y = Append[y, {sumdist1, sumdist2}],
{e, 14, 30}, {a, e + 1, 30}]; y


  • cvgmt
  • 大写小写
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
把代码改为 C++


2025-12-26 22:10:39
广告
不感兴趣
开通SVIP免广告
  • 无影东瓜
  • 小吧主
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
改动的大概思路就是把一些不那么mma的写法改写得比较mma,比如用Table代替Do+Append,用EuclideanDistance算距离等等,顺便给需要用很多次但实际就不到9种情况的juzhengfun做了个记忆化存储,避免每次都要重新算矩阵乘法。不过在这个例子里这些改动只能提速20%左右,因为原程序主要的时间消耗是在AcyclicGraphQ,其他地方再怎么改也影响有限。
看下AcyclicGraphQ对应的部分,是判断一个图新加入点后是否还是无圈图。因为这个图每次最多只会改变一条边,所以完全没必要当成一张新图用AcyclicGraphQ判断,只需要考虑变化的部分就可以了。
考虑连通性矩阵M,M[[i, j]]=1表示节点i与j连通,0表示不连通。那么每次新加入一条边i<->j之前,只需要考虑是否有节点同时与i、j连通即可。若有,加入后图不再是无圈图,跳过;若没有,加入这条边,然后更新图的连通性。
按这个思路改一下,得到3楼的代码,在我这里40s就跑完了。进一步优化大概就要考虑Compile了,不过我觉得这种问题用Compile会很麻烦,还不如直接去写C++


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 4回复贴,共1页
<<返回mathematica吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示