用邻接矩阵创建有向网,求最小生成树,最短路径(c语言)。

大神求解!!!用邻接矩阵法创建一个有向网,将有向边直接视为无向边后,得到对应的无向图,则利用Prim算法求取最小生成树MST;利用Dijkstra算法对无向图求取顶点V1对图中其余各点的最短路径。(c语言)
图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
新手求图的最小生成树,求指点.
#include<stdio.h> #include<stdlib.h> #define Infinity 32768 #define OK 1 #define Error -1 #define True 1 #define False 0 #define MAX_VERTEX_NUM 10 typedef enum{DG,DN,UDG,UDN}GraphKind; /*图的种类分别为有向图,有向网,无向图,无向网*/ typedef char VertexData; typedef struct ArcNode {int adj; }ArcNode; typedef struct {VertexData vertex[MAX_VERTEX_NUM]; ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vexnum,arcnum; /*图的顶点数和弧数*/ GraphKind kind; }AdjMatrix; struct Record{ char adjvex; // U集中的顶点 int lowcost; // 边的权值 }closedge[MAX_VERTEX_NUM]; int LocateVertex(AdjMatrix *G,VertexData v)/*求顶点位置函数*/ {int j=Error,k; for(k=0;k<G->vexnum;k++) if(G->vertex[k]==v) {j=k;break; } return(j); } int CreateDN(AdjMatrix *G) /*创建一个有向网*/ {int i,j,k,weight;VertexData v1,v2; printf("请输入两个数字表示弧数和顶点数\n"); fflush(stdin); /*清空输入缓冲区*/ scanf("%d,%d",&G->arcnum,&G->vexnum); for(i=0;i<G->vexnum;i++) /*初始化邻接矩阵*/ for(j=0;j<G->vexnum;j++) G->arcs[i][j].adj=Infinity; for(i=0;i<G->vexnum;i++) { printf("请输入图的顶点\n"); fflush(stdin); scanf("%c",&G->vertex[i]); } for(k=0;k<G->arcnum;k++) {printf("请输入一条弧的两个顶点及权值\n"); fflush(stdin); scanf("%c,%c,%d",&v1,&v2,&weight); i=LocateVertex(G,v1); j=LocateVertex(G,v2); G->arcs[i][j].adj=weight; /*建立弧*/ } return(OK); } int Minimum (Record closedge[]) {int reserve=Infinity; int min; for(int i=1;i<MAX_VERTEX_NUM;i++) { if(closedge[i].lowcost<reserve&&closedge[i].lowcost>0)//没有访问过但是存路径 { reserve=closedge[i].lowcost; min=i; } } return min; } void Print(AdjMatrix *G,char u,char v) {int start,end; start=LocateVertex(G,u); end=LocateVertex(G,v); printf("%c到%c的权值为%d",u,v,G->arcs[start][end]); } void MiniSpanTree_Prim(AdjMatrix &gn,char u)/*从顶点u出发,按普里姆算法构造连通网gn的最小生成树,并输出生成树的每条边*/ {int i,e; closedge[u].lowcost=0; /*初始化,U={u}*/ for(i=0;i<gn.vexnum;i++) if(i!=u) /*对V-U中的顶点i,初始化closedge[i]*/ {closedge[i].adjvex=u; closedge[i].lowcost=gn.arcs[u][i].adj; } for(e=1;e<=gn.vexnum-1;e++) /*找n-1条边(n=gn.vexnum*/ {int v=Minimum(closedge); /*closedge[v]中存有当前最小边(u,v)的信息*/ u=closedge[v].adjvex; /*u属于U*/ Print(&gn,u,v); /*输出生成树的当前最小边(u,v)*/ closedge[v].lowcost=0; /*将顶点v纳入U的集合*/ for(i=0;i<gn.vexnum;i++) /*在顶点v并入U之后,更新closedge[i]*/ if(gn.arcs[v][i].adj<closedge[i].lowcost) {closedge[i].lowcost=gn.arcs[v][i].adj; closedge[i].adjvex=v; } } } int main() {AdjMatrix G; CreateDN(&G); char first; printf("请输入第一个访问的结点\n"); scanf("%c",&first); MiniSpanTree_Prim(G,first); return 0; } Print函数和那个MiniSpanTree_Prim函数有问题谁帮忙看下。
数据结构关于图的小错误
#include<stdio.h> #include<stdlib.h> #define Infinity 32768 #define OK 1 #define Error -1 #define True 1 #define False 0 #define MAX_VERTEX_NUM 10 typedef enum{DG,DN,UDG,UDN}GraphKind; /*图的种类分别为有向图,有向网,无向图,无向网*/ typedef char VertexData; typedef struct ArcNode {int adj; }ArcNode; typedef struct {VertexData vertex[MAX_VERTEX_NUM]; ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vexnum,arcnum; /*图的顶点数和弧数*/ GraphKind kind; }AdjMatrix; struct Record{ char adjvex; // U集中的顶点 int lowcost; // 边的权值 }closedge[MAX_VERTEX_NUM]; int LocateVertex(AdjMatrix *G,VertexData v)/*求顶点位置函数*/ {int j=Error,k; for(k=0;k<G->vexnum;k++) if(G->vertex[k]==v) {j=k;break; } return(j); } int CreateDN(AdjMatrix *G) /*创建一个有向网*/ {int i,j,k,weight;VertexData v1,v2; printf("请输入两个数字表示弧数和顶点数\n"); fflush(stdin); /*清空输入缓冲区*/ scanf("%d,%d",&G->arcnum,&G->vexnum); for(i=0;i<G->vexnum;i++) /*初始化邻接矩阵*/ for(j=0;j<G->vexnum;j++) G->arcs[i][j].adj=Infinity; for(i=0;i<G->vexnum;i++) printf("请输入图的顶点\n"); fflush(stdin); scanf("%c",&G->vertex[i]); for(k=0;k<G->arcnum;k++) {printf("请输入一条弧的两个顶点及权值\n"); fflush(stdin); scanf("%c,%c,%d",&v1,&v2,&weight); i=LocateVertex(G,v1); j=LocateVertex(G,v2); G->arcs[i][j].adj=weight; /*建立弧*/ } return(OK); } int Minimum (Record closedge[]) {int reserve=Infinity; int min; for(int i=1;i<MAX_VERTEX_NUM;i++) { if(closedge[i].lowcost<reserve&&closedge[i].lowcost>0)//没有访问过但是存路径 { reserve=closedge[i].lowcost; min=i; } } return min; } MiniSpanTree_Prim(AdjMatrix &gn,char u)/*从顶点u出发,按普里姆算法构造连通网gn的最小生成树,并输出生成树的每条边*/ {int i,e; closedge[u].lowcost=0; /*初始化,U={u}*/ for(i=0;i<gn.vexnum;i++) if(i!=u) /*对V-U中的顶点i,初始化closedge[i]*/ {closedge[i].adjvex=u; closedge[i].lowcost=gn.arcs[u][i].adj; } for(e=1;e<=gn.vexnum-1;e++) /*找n-1条边(n=gn.vexnum*/ {int v=Minimum(closedge); /*closedge[v]中存有当前最小边(u,v)的信息*/ u=closedge[v].adjvex; /*u属于U*/ printf("%c,%c",u,v); /*输出生成树的当前最小边(u,v)*/ closedge[v].lowcost=0; /*将顶点v纳入U的集合*/ for(i=0;i<gn.vexnum;i++) /*在顶点v并入U之后,更新closedge[i]*/ if(gn.arcs[v][i].adj<closedge[i].lowcost) {closedge[i].lowcost=gn.arcs[v][i].adj; closedge[i].adjvex=v; } } } int main() {AdjMatrix G; CreateDN(&G); char first=' '; printf("请输入第一个访问的结点\n"); scanf("%c",&first); MiniSpanTree_Prim(G,first) ; return 0; } 出现这个错误\Users\Administrator\Desktop\3.2.cpp 69 C:\Users\Administrator\Desktop\C [Error] ISO C++ forbids declaration of `MiniSpanTree_Prim' with no type
求求。怎么在里面插入拓补排序。
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; int n = 0; int a[100][100]; int menu() { int m; printf(" 求最小生成树\n"); printf(" ________________________________\n\n"); printf(" 1 输入城市之间的信息\n"); printf(" 2 判断是否能构成一个最小生成树\n"); printf(" 3 查询信息\n"); printf(" 4 退出\n"); printf(" ________________________________\n\n"); printf(" 请输入所选功能1--4\n"); scanf("%d",&m); return m; } void xin_input() { printf("1 遍历所有城市的最小生成树\n"); printf("2 查询两个城市之间的距离\n"); printf("3 退出\n"); //printf("________________________________\n\n"); } //以下为克鲁斯卡尔算法 typedef struct node //构造一个结构体,两个城市可以看成起点和终点,之间的路道可以看成一个边 { int st; //起点 int ed; //终点 int dis;//距离 }node; node p[1000]; int pre[1000],rank[1000]; bool cmp(node p1,node p2) { return p1.dis < p2.dis; } //下面三个函数是并查集,其作用是检验当一条边添加进去,是否会产生回路 void set(int x) { pre[x] = x;//初始化 rank[x] = 0; } int find(int x)//找到这个点的祖先 { if(x != pre[x]) pre[x] = find(pre[x]); return pre[x]; } void Union(int x,int y)//将这两个添加到一个集合里去 { x = find(x); y = find(y); if(rank[x] >= rank[y]) { pre[y] = x; rank[x] ++; } else pre[y] = x; } void Kruskal() // { int ans = 0,i,j,k = 0; for(i = 1;i <= n;i ++) set(i); for(i = 1;i <= n;i ++) for(j = i + 1;j <= n;j ++) { p[++k].st = i; p[k].ed = j; p[k].dis = a[i][j]; //先把所有城市之间的路段看成一个边 } sort(p + 1,p + k + 1,cmp);//把所有的边按从小到大进行排序 int count = 0; for(i = 1;i <= k;i ++) { if(find(p[i].st) != find(p[i].ed))//如果这两点连接在一起不构成一个回路,则执行下面操作 { printf("第%d条路段为:%d--%d,权值为%d\n",++ count,p[i].st,p[i].ed,p[i].dis);//将这条边的起点、终点打印出来 ans += p[i].dis; //说明这条路段要用 Union(p[i].st,p[i].ed); } } printf("遍历所有城市的最短路程为: %d\n",ans);//最短遍历的路程 //printf("________________________________\n"); } //普里姆算法 int prim() { int close[100],low[100],i,j,ans = 0;//close[j]表示离j最近的顶点,low[j]表示离j最短的距离 bool use[100]; use[1] = 1; for(i = 2;i <= n;i ++) { low[i] = a[1][i]; //初始化 close[i] = 1; use[i] = 0; } for(i = 1;i < n;i ++) { int min = 100000000,k = 0; for(j = 2;j <= n;j ++) { if(use[j] == 0 && min > low[j])//找到最小的low[]值,并记录 { min = low[j]; k = j; } } //printf("%d %d\n",close[k],k); for(j = 2;j <= n;j ++) { if(use[j] == 0 && low[j] > a[k][j]) { low[j] = a[k][j]; //修改low[]值和close[]值 close[j] = k; } } ans += a[close[k]][k]; } return ans; } //求最短路径-单源点到其余点的最短路径(Dijkstra算法) void ShortestPath_DIJ(int x,int y) //X指单源点,y指目标点 { int i,d[100],j; bool use[100]; for(i = 1;i <= n;i ++) { use[i] = 0; //初始化 d[i] = a[x][i]; } use[x] = 1;//这个点肯定用过 d[x] = 0; for(i = 1;i < n;i ++)//执行n-1次操作 { int min = 100000000,v; for(j = 1;j <= n;j ++) { if(use[j] == 0 && min > d[j])//找出最短距离的 { min = d[j]; v = j; } } use[v] = 1; for(j = 1;j <= n;j ++) { if(use[j] == 0 && d[j] > min + a[v][j])//修改d[]的值 { d[j] = min + a[v][j]; } } } printf("%d城市到城市%d的最短距离为: %d\n",x,y,d[y]); } //求每一对顶点之间的最短路径(Floyd算法) int b[100][100]; void ShortestPath_FLOYD() //这个算法耗时多(n^3),不过容易理解 { int i,j,k; for(i = 1;i <= n;i ++) for(j = 1;j <= n;j ++) b[i][j] = a[i][j]; //先b[][]进行保存,避免a[][]的值发生变化 for(k = 1;k <= n;k ++) for(i = 1;i <= n;i ++) for(j = 1;j <= n;j ++) if(b[i][j] > b[i][k] + b[k][j]) b[i][j] = b[i][k] + b[k][j]; while(1) { int st,ed; printf("请输入两个城市的编号:\n");//对此进行多次操作 scanf("%d%d",&st,&ed); printf("%d 城市到 %d 城市的最短距离为: %d\n",st,ed,b[st][ed]); //printf("________________________________\n"); char str[100]; printf("是否要继续? yes or no\n"); scanf("%s",str); if(strcmp(str,"no") == 0) { //printf("________________________________\n"); break; } } } void shuru()//输入城市信息 { int i,j; if(n != 0) { char str[100]; printf("是否要确定输入新的城市之间的信息? yes or no ?\n"); scanf("%s",str); if(strcmp(str,"no") == 0) { return ; } } printf("请输入城市的个数:\n"); scanf("%d",&n); printf("输入%d个城市的邻接矩阵:\n",n); for(i = 1;i <= n;i ++) { for(j = 1;j <= n;j ++) scanf("%d",&a[i][j]); } //printf("________________________________\n"); } void chaxun() //一个查徇两个城市最短径的操作 { while(1) { int t1,t2; printf("输入第一个城市的编号:\n"); scanf("%d",&t1); printf("输入第二个城市的编号:\n"); scanf("%d",&t2); ShortestPath_DIJ(t1,t2);//调用 char str[100]; printf("是否要继续? yes or no\n"); scanf("%s",str); if(strcmp(str,"no") == 0) { //printf("________________________________\n"); break; } } } void chaxun_func() { if(n == 0) { printf("这里没有城市之间的信息\n"); return; } xin_input(); printf("请选择以上功能:1-3\n"); int m1; scanf("%d",&m1); printf("\n"); if(m1 == 1) Kruskal(); else if(m1 == 2) { chaxun(); } //else // break; } void judge() { int ans; ans = prim(); if(ans >= 100000000) printf("不能构成最小生成树\n"); else printf("能构成最小生成树\n"); } int main() { while(1) { switch(menu()) { case 1:shuru();break; case 2:judge();break; case 3: chaxun_func();break; case 4:goto loop; } } loop:; return 0; }
旅游管理系统小软件的bug求找一下
创建景点后,检测效果图 路径全替换为最大值,游客界面也无法查询线路,求指导一下谢谢 源代码 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define MaxSize 100 #define Max 32767 //////////////////////邻接表 typedef struct ArcNode { int adjvex; int info; ///////标志是否被访问过 int weight; struct ArcNode *nextarc; }ANode; typedef struct { int info; ///////标志是否被访问过 char name[50]; ANode *firstarc; }VNode, AdjList[MaxSize]; typedef struct { AdjList vertices; int vexnum, arcnum; }ALGraph; ////////////////////////邻接矩阵 typedef struct { int weight; int info; ///////0,表示无路径,1表示有路径 } AdjMatrix[MaxSize][MaxSize]; typedef struct { char names[MaxSize][50]; AdjMatrix arcs; int vexnum, arcnum; }MGrph; //////////////////////////////最短路径结点 typedef struct { int info; int weight; }MinW; ///////////////////////////拓扑排序用栈 typedef struct { VNode *Topo[MaxSize]; int top; }TP; //////////////////深度遍历生成树 typedef struct csnode { int num; struct csnode *firstchild, *nextsibling; }csnode, *cstree; int visited[MaxSize]; ////////////////////////函数部分 void Create(ALGraph *tu)//建立邻接链表 { int i; int shi, zhong, weight; ANode *p; printf("请输入景点数:"); scanf("%d", &tu->vexnum); printf("请输入道路数:"); scanf("%d", &tu->arcnum); for (i = 0; i<tu->vexnum; i++) { printf("请输入第个%d景点名:", i + 1); scanf("%s", tu->vertices[i].name); tu->vertices[i].firstarc = NULL; } for (i = 0; i<tu->arcnum; i++) { printf("请选择输入路径,形如(1 3)(从景点一到景点三):");//一条路径的起点和终点 scanf("%d%d", &shi, &zhong); printf("请输入该条路径的长度:"); scanf("%d", &weight); p = (ANode *)malloc(sizeof(ANode)); p->adjvex = zhong; p->weight = weight; p->nextarc = tu->vertices[shi].firstarc; tu->vertices[shi].firstarc = p; p = (ANode *)malloc(sizeof(ANode)); p->adjvex = shi; p->weight = weight; p->nextarc = tu->vertices[zhong].firstarc; tu->vertices[zhong].firstarc = p; } printf("创建完成!\n"); } void Rclear(MGrph *Ttu)//初始化邻接矩阵,(路径数与景点数已知)将矩阵路径长度初始化为Max,标志位初始化为0 { int i, j; for (i = 0; i<Ttu->vexnum; i++) for (j = 0; j<Ttu->vexnum; j++) { Ttu->arcs[i][j].weight = Max; Ttu->arcs[i][j].info = 0; } } void Turn(ALGraph *tu, MGrph *Ttu)//将邻接链表转换成邻接矩阵 { int i, j; ANode *p; Ttu->arcnum = tu->arcnum; Ttu->vexnum = tu->vexnum; Rclear(Ttu); for (i = 0; i<Ttu->vexnum; i++) strcpy(Ttu->names[i], tu->vertices[i].name); for (j = 0; j<tu->vexnum; j++) { p = tu->vertices[j].firstarc; while (p != NULL) { Ttu->arcs[j][p->adjvex].weight = p->weight; Ttu->arcs[j][p->adjvex].info = 1; p = p->nextarc; } } /* for(i=0;i<tu->vexnum;i++) { for(j=0;j<tu->vexnum;j++) printf("%d\t",Ttu->arcs[i][j].weight); printf("\n"); }*/ for (i = 0; i <= tu->vexnum; i++) { for (j = 0; j <= tu->vexnum; j++) { if (i == 0 && j == 0) { printf("\t"); } if (i == 0) { if (j != 0) { printf("景点%s\t", tu->vertices[j - 1].name); } } else { if (j == 0) { printf("景点%s\t", tu->vertices[i - 1].name); } else printf("%d\t", Ttu->arcs[i - 1][j - 1].weight); } }printf("\n"); } } void Rset(ALGraph *tu)//将邻接表中结点的标志以及边的标志初始化为0(路径数与景点数已知) { int i, j; ANode *p; for (i = 0; i<tu->vexnum; i++) tu->vertices[i].info = 0; for (j = 0; j<tu->vexnum; j++) { p = tu->vertices[j].firstarc; while (p != NULL) { p->info = 0; p = p->nextarc; } } } void Rbuild(ALGraph *tu)//景点规划(最小生成树) { int n, i, j, Min; ANode *p, *qin; MGrph GG; GG.arcnum = 0; GG.vexnum = 0; int min[MaxSize]; ALGraph *MinTree; MinTree = (ALGraph *)malloc(sizeof(ALGraph)); MinTree->vexnum = tu->vexnum; MinTree->arcnum = tu->vexnum - 1; Rset(tu); for (i = 0; i<tu->vexnum; i++) { min[i] = Max; strcpy(MinTree->vertices[i].name, tu->vertices[i].name); MinTree->vertices[i].firstarc = NULL; } printf("请选择做为入口的景点标号(1— %d):", tu->vexnum); scanf("%d", &n); for (i = 0; i<tu->vexnum; i++) { tu->vertices[n - 1].info = 1; Min = Max; p = tu->vertices[n - 1].firstarc; while (p != NULL) { if (min[p->adjvex]>p->weight) { min[p->adjvex] = p->weight; qin = (ANode *)malloc(sizeof(ANode)); qin->adjvex = n - 1; qin->weight = p->weight; qin->nextarc = NULL; MinTree->vertices[p->adjvex].firstarc = qin; } p = p->nextarc; } for (j = 0; j<tu->vexnum; j++) if (Min>min[j] && (tu->vertices[j].info != 1)) { Min = min[j]; n = j + 1; } } Turn(MinTree, &GG); } void DFSTree(ALGraph *tu, int v, cstree &T) { int first, w = -1; ANode *d; d = NULL; cstree p, q; visited[v] = 1; first = 1; T->num = v; if (tu->vertices[v].firstarc) d = tu->vertices[v].firstarc; for (; d; d = d->nextarc) { w = d->adjvex; if (!visited[w]) { p = (cstree)malloc(sizeof(csnode)); p->num = w; p->firstchild = NULL; p->nextsibling = NULL; if (first) { T->firstchild = p; first = 0; } else q->nextsibling = p; q = p; DFSTree(tu, w, q); } } } int Gshow(cstree T, int &f) { if (T) { printf("%d\n", T->num); if (T->nextsibling) { printf("有回路,下面进入人工选择!"); f = 1; return 0; } else if (T->firstchild) Gshow(T->firstchild, f); } return 1; } void minway(MGrph *Ttu) { MinW min[MaxSize]; int flags[MaxSize]; int i, mi, n, j, pre; printf("请输入您当前所在景点位置标号:\n"); scanf("%d", &n); for (i = 0; i<Ttu->vexnum; i++) { flags[i] = 0; min[i].info = n; min[i].weight = Ttu->arcs[n][i].weight; } flags[n] = 1; int k = n; for (i = 1; i<Ttu->vexnum; i++) { mi = Max; for (j = 0; j<Ttu->vexnum; j++) if (flags[j] == 0 && mi>min[j].weight) { mi = min[j].weight; pre = j; } min[pre].info = k; flags[pre] = 1; k = pre; for (j = 0; j<Ttu->vexnum; j++) if (flags[j] == 0 && (min[pre].weight + Ttu->arcs[pre][j].weight<min[j].weight)) { min[j].weight = min[pre].weight + Ttu->arcs[pre][j].weight; min[j].info = pre; } } printf("请输入目标位置:\n"); scanf("%d", &n); printf("您距离目标%d,您将由%d位置走向目标。\n", min[n].weight, min[n].info); } void Guide(ALGraph *tu, MGrph *Ttu) { int n; int f = 0; cstree T; T = (cstree)malloc(sizeof(csnode)); T->firstchild = NULL; T->nextsibling = NULL; Rset(tu); printf("请选择您所在景点(1 — %d):", tu->vexnum); scanf("%d", &n); DFSTree(tu, n - 1, T); Gshow(T, f); if (f == 1) minway(Ttu); } void main() { ALGraph G; MGrph TG; int f = 0; int key = 0; int ch; G.arcnum = 0; G.vexnum = 0; TG.arcnum = 0; TG.vexnum = 0; while (key != 3) { f = 0; printf("→→→欢迎进入旅游管理系统\n"); printf(" ↓↓↓ 请确认身份\n"); printf("1 → 管理员\n"); printf("2 → 游客\n"); printf("3 → 退出\n"); scanf("%d", &key); if (key>3 || key<1) { printf("错误选项!\n"); continue; } while (f == 0 && key == 1) { printf(" 管理系统为您服务!\n"); printf(" ☆ 请选择(1-4):\n"); printf("1 创建景点分布图\n"); printf("2 检测创建效果图\n"); printf("3 最低造价路线图\n"); printf("4 退出→管理系统\n"); scanf("%d", &ch); switch (ch) { case 1:Create(&G); break; case 2:Turn(&G, &TG); break; case 3:Rbuild(&G); break; case 4:f = 1; break; default:printf("错误选项!请重新选择!\n"); break; } } while (f == 0 && key == 2) { printf("机器人乐乐为您服务:\n"); printf(" ^ ^\n"); printf("1线路 0 0 导游\n"); printf(" 6\n"); printf("2捷径 + + 引领\n"); printf("3→退出导游系统\n"); scanf("%d", &ch); switch (ch) { case 1:Guide(&G, &TG); break; case 2:minway(&TG); break; case 3:f = 1; break; default:printf("错误选项!请重新选择!\n"); break; } } } } ```
matlab 蚁群算法报错 小白求助
function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q) %%------------------------------------------------------------------------- %% 主要符号说明 %% C n个城市的坐标,n×2的矩阵 load C.mat % 39个城市问题 %% NC_max 最大迭代次数 NC_max = 30; %% m 蚂蚁个数 m = 20; %% Alpha 表征信息素重要程度的参数 Alpha = 0.3; %% Beta 表征启发式因子重要程度的参数 Beta = 0.4; %% Rho 信息素蒸发系数 Rho = 0.5; %% Q 信息素增加强度系数 Q = 0.4; %% R_best 各代最佳路线 %% L_best 各代最佳路线的长度 %%========================================================================= %%第一步:变量初始化 n=size(C,1);%n表示问题的规模(城市个数) D=zeros(n,n);%D表示完全图的赋权邻接矩阵 for i=1:n for j=1:n if i~=j D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5; else D(i,j)=eps; %i=j时不计算,应该为0,但后面的启发因子要取倒数,用eps(浮点相对精度)表示 end D(j,i)=D(i,j); %对称矩阵 end end Eta=1./D; %Eta为启发因子,这里设为距离的倒数 Tau=ones(n,n); %Tau为信息素矩阵 Tabu=zeros(m,n); %存储并记录路径的生成 NC=1; %迭代计数器,记录迭代次数 R_best=zeros(NC_max,n); %各代最佳路线 L_best=inf.*ones(NC_max,1); %各代最佳路线的长度 L_ave=zeros(NC_max,1); %各代路线的平均长度 while NC <=NC_max %停止条件之一:达到最大迭代次数,停止 %%第二步:将m只蚂蚁放到n个城市上 Randpos=[]; %随即存取 for i=1:(ceil(m/n)) Randpos=[Randpos,randperm(n)]; end Tabu(:,1)=(Randpos(1,1:m))'; %此句不太理解? %%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游 for j=2:n %所在城市不计算 for i=1:m visited=Tabu(i,1:(j-1)); %记录已访问的城市,避免重复访问 J=zeros(1,(n-j+1)); %待访问的城市 P=J; %待访问城市的选择概率分布 Jc=1; for k=1:n if length(find(visited==k))==0 %开始时置0 J(Jc)=k; Jc=Jc+1; %访问的城市个数自加1 end end %下面计算待选城市的概率分布 for k=1:length(J) P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta); end P=P/(sum(P)); %按概率原则选取下一个城市 Pcum=cumsum(P); %cumsum,元素累加即求和 Select=find(Pcum>=rand) %若计算的概率大于原来的就选择这条路线 to_visit=J(Select(1)) Tabu(i,j)=to_visit; end end if NC>=2 Tabu(1,:)=R_best(NC-1,:); end %%第四步:记录本次迭代最佳路线 L=zeros(m,1); %开始距离为0,m*1的列向量 for i=1:m R=Tabu(i,:); for j=1:(n-1) L(i)=L(i)+D(R(j),R(j+1)); %原距离加上第j个城市到第j+1个城市的距离 end L(i)=L(i)+D(R(1),R(n)); %一轮下来后走过的距离 end L_best(NC)=min(L); %最佳距离取最小 pos=find(L==L_best(NC)); R_best(NC,:)=Tabu(pos(1),:); %此轮迭代后的最佳路线 L_ave(NC)=mean(L); %此轮迭代后的平均距离 NC=NC+1 ; %迭代继续 %%第五步:更新信息素 Delta_Tau=zeros(n,n); %开始时信息素为n*n的0矩阵 for i=1:m for j=1:(n-1) Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i); %此次循环在路径(i,j)上的信息素增量 end Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i); %此次循环在整个路径上的信息素增量 end Tau=(1-Rho).*Tau+Delta_Tau; %考虑信息素挥发,更新后的信息素 %%第六步:禁忌表清零 Tabu=zeros(m,n); %%直到最大迭代次数 end %%第七步:输出结果 Pos=find(L_best==min(L_best)); %找到最佳路径(非0为真) Shortest_Route=R_best(Pos(1),:) %最大迭代次数后最佳路径 Shortest_Length=L_best(Pos(1)) %最大迭代次数后最短距离 subplot(1,2,1) %绘制第一个子图形 DrawRoute(C,Shortest_Route) %画路线图的子函数 subplot(1,2,2) %绘制第二个子图形 plot(L_best) hold on %保持图形 plot(L_ave,'r') title('平均距离和最短距离') %标题 function DrawRoute(C,R) %%========================================================================= %% DrawRoute.m %% 画路线图的子函数 %%------------------------------------------------------------------------- %% C Coordinate 节点坐标,由一个N×2的矩阵存储 %% R Route 路线 %%========================================================================= N=length(R); scatter(C(:,1),C(:,2)); hold on plot([C(R(1),1),C(R(N),1)],[C(R(1),2),C(R(N),2)],'g') hold on for ii=2:N plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)],'g') hold on end 最后报错。。。。 Index exceeds matrix dimensions. Error in ACATSP (line 127) to_visit=J(Select(1)); 求解答
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
本篇文章主要讲解 token、session 等用户认证方案的区别并分析常见误区,以及如何通过前后端的配合实现完善的访问拦截,为下一步权限控制的实现打下基础。
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
漫话:什么是平衡(AVL)树?这应该是把AVL树讲的最好的文章了
这篇文章通过对话的形式,由浅入深带你读懂 AVL 树,看完让你保证理解 AVL 树的各种操作,如果觉得不错,别吝啬你的赞哦。 1、若它的左子树不为空,则左子树上所有的节点值都小于它的根节点值。 2、若它的右子树不为空,则右子树上所有的节点值均大于它的根节点值。 3、它的左右子树也分别可以充当为二叉查找树。 例如: 例如,我现在想要查找数值为14的节点。由于二叉查找树的特性,我们可...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
开源并不是你认为的那些事
点击上方蓝字 关注我们开源之道导读所以 ————想要理清开源是什么?先要厘清开源不是什么,名正言顺是句中国的古代成语,概念本身的理解非常之重要。大部分生物多样性的起源,...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
《C++ Primer》学习笔记(六):C++模块设计——函数
专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 https://blog.csdn.net/TeFuirnever/article/details/100700212 —————————————————————————————————————————————————————— 《C++ Primer》习题参考答案:第6章 - C++模块设计——函数 文章目录专栏C+...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车?某胡同口的煎饼摊一年能卖出多少个煎饼?深圳有多少个产品经理?一辆公交车里能装下多少个乒乓球?一个正常成年人有多少根头发?这类估算问题,被称为费米问题,是以科学家费米命名的。为什么面试会问这种问题呢?这类问题能把两类人清楚地区分出来。一类是具有文科思维的人,擅长赞叹和模糊想象,它主要依靠的是人的第一反应和直觉,比如小孩...
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。 背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法 不过,当我看了源代码之后 这程序不到50行 尽管我有多年的Python经验,但我竟然一时也没有看懂 当然啦,原作者也说了,这个代码也是在无聊中诞生的,平时撸码是不写中文变量名的, 中文...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
MySQL数据库总结
一、数据库简介 数据库(Database,DB)是按照数据结构来组织,存储和管理数据的仓库。 典型特征:数据的结构化、数据间的共享、减少数据的冗余度,数据的独立性。 关系型数据库:使用关系模型把数据组织到数据表(table)中。现实世界可以用数据来描述。 主流的关系型数据库产品:Oracle(Oracle)、DB2(IBM)、SQL Server(MS)、MySQL(Oracle)。 数据表:数...
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片...
中年危机,35 岁定律,见鬼去吧!
中年危机,35 岁定律,相信你都听说过,每次触及还会让你感到丝丝焦虑,毕竟时间这把杀猪刀不会放过任何一个人。中年危机或 35 岁定律是客观存在的,你迟早都会遭遇的,那你是否有信心战胜它呢? 中年危机之所以让人害怕,一则是你没有把握打赢这场遭遇战,再则中年是一个输不起的阶段。古人云:知己知彼,百战不殆。恐惧,主要源自对敌人和自己的不了解,不知道敌人的优劣势,也不清楚自己的长短板,常常以己之所短攻彼...
张小龙-年薪近3亿的微信之父,他是如何做到的?
张小龙生于湖南邵东魏家桥镇, 家庭主要特点:穷。 不仅自己穷,亲戚也都很穷,可以说穷以类聚。爷爷做过铜匠,总的来说,标准的劳动阶级出身。 家有兄弟两人, 一个小龙,一个小虎。 小虎好动,与邻里打成一片, 小龙好静,喜好读书。 “文静的像个妹子。”张小龙的表哥如是说。 穷文富武,做个读书郎是个不错的选择。 87年至94年, 华中科技大学本硕连读。 本科就读电信系, 不喜欢上课...
阿里靠什么武功秘籍渡过“双十一“的天量冲击
双十一大概会产生多大的数据量呢,可能大家没概念,举个例子央视拍了这么多年电视新闻节目,几十年下来他存了大概80P的数据。而今年双11一天,阿里要处理970P的数据,做为一个IT人,笔者认为今年”双十一“阿里最大的技术看点有有以下两个: 阿里的数据库,也就是刚刚拿下TPC冠军的OcceanBase,处理峰值也达到了骇人听闻的6100万次/秒, 阿里核心系统百分百上云了。 如果把信息系统比做一个武...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给袈...
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
Zookeeper的基本命令大全
1、列出节点 ls path ls -s path //包含该节点的详细信息,如子节点总数等 2、查看节点状态 stat path cZxid = 0x14f //创建节点的ID ctime = Thu Nov 07 01:02:53 CST 2019 //节点的创建时间 mZxid = 0x14f //修改节点ID mtime = Thu Nov 07 01:02:53 CST 2019 ...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
(经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
今年正式步入了大四,离毕业也只剩半年多的时间,回想一下大学四年,感觉自己走了不少弯路,今天就来分享一下自己大学的学习经历,也希望其他人能不要走我走错的路。 (一)初进校园 刚进入大学的时候自己完全就相信了高中老师的话:“进入大学你们就轻松了”。因此在大一的时候自己学习的激情早就被抛地一干二净,每天不是在寝室里玩游戏就是出门游玩,不过好在自己大学时买的第一台笔记本性能并不是很好,也没让我彻底沉...
如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手、代码自动提示、代码重构、代码版本管理(Git、SVN、Maven)、单元测试、代码分析等方面有着亮眼的发挥。IDEA 产于捷克,开发人员以严谨著称的东欧程序员为主。IDEA 分为社区版和付费版两个版本。 我呢,一直是 Eclipse 的忠实粉丝,差不多十年的老用户了。很早就接触到了 IDEA...
听说了吗?阿里双11作战室竟1根网线都没有
双11不光是购物狂欢节,更是对技术的一次“大考”,对于阿里巴巴企业内部运营的基础保障技术而言,亦是如此。 回溯双11历史,这背后也经历过“小米加步枪”的阶段:作战室从随处是网线,交换机放地上的“一地狼藉”;到如今媲美5G的wifi网速,到现场却看不到一根网线;从当年使用商用AP(无线路由器),让光明顶双11当天断网一分钟,到全部使用阿里自研AP……阿里巴巴企业智能事业部工程师们提供的基础保障...
相关热词 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片 c# 图片颜色调整 最快 c#多张图片上传 c#密封类与密封方法
立即提问