最短路径excel运筹学
时间: 2023-10-03 18:05:17 浏览: 570
最短路径问题在Excel运筹学中是一个常见的问题,可以通过使用Excel中的函数和工具来解决。下面是使用Excel求解最短路径问题的步骤:
1. 首先,你需要将问题转化为一个网络图的形式,其中节点表示路径中的位置,边表示路径之间的连接关系。在Excel中,你可以使用表格来表示这个网络图,每个节点可以用一个单元格来表示。
2. 接下来,你需要对网络图进行编码。可以使用数值来代表节点和边的关系。例如,可以使用数字表示节点和边的编号,使用表格中的数值来表示节点之间的距离或权重。
3. 然后,在Excel中创建一个矩阵来表示节点之间的距离或权重。你可以使用Excel函数(如VLOOKUP、INDEX、MATCH等)来计算节点之间的距离。
4. 在计算矩阵完成后,你可以使用Excel中的最短路径函数来找到最短路径。Excel提供了一些内置函数,如Dijkstra算法、Floyd-Warshall算法等来解决最短路径问题。你可以根据具体情况选择合适的函数来求解最短路径。
5. 最后,根据求解得到的最短路径结果,在Excel中进行可视化展示。你可以使用图表或者条件格式等方式来展示路径和距离。
相关问题
请给出输出所有边被最短路径使用次数的完整代码
完整代码如下:
```
import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
df = pd.read_excel(r"C:\Users\li'yi'jie\Desktop\运筹学网络规划数据.xlsx")
edges = []
for i in range(len(df)):
edge = {
"id": df.loc[i, "边的编号"],
"tail": df.loc[i, "边的尾节点"],
"head": df.loc[i, "边的头节点"],
"length": df.loc[i, "长度"],
"capacity": df.loc[i, "容量"]
}
edges.append(edge)
plt.figure(figsize=(15,15))
G = nx.DiGraph()
for edge in edges:
G.add_edge(edge["tail"], edge["head"], weight=edge["length"])
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True)
labels = nx.get_edge_attributes(G, "weight")
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels, label_pos=0.5)
plt.show()
all_pairs = dict(nx.all_pairs_dijkstra_path_length(G))
rows = []
for start_node, dist_dict in all_pairs.items():
for end_node, dist in dist_dict.items():
rows.append({'起始节点': start_node, '终止节点': end_node, '最短路径长度': dist})
df_result = pd.DataFrame(rows)
df_result.to_excel('all_pairs.xlsx', index=False)
# 计算每个节点到其他节点的平均最短距离
avg_dists = []
for node in G.nodes():
dist_sum = 0
for dist in all_pairs[node].values():
dist_sum += dist
avg_dist = dist_sum / len(G.nodes())
avg_dists.append(avg_dist)
# 画柱状图
plt.figure(figsize=(15,15))
plt.bar(G.nodes(), avg_dists)
plt.title("每个节点到其他节点的平均最短距离")
plt.xlabel("节点")
plt.ylabel("平均最短距离")
plt.show()
# 计算每条边被最短路径使用的次数
all_paths = dict(nx.all_pairs_dijkstra_path(G))
edge_counts = {edge["id"]: 0 for edge in edges}
for start_node in all_paths:
for end_node in all_paths[start_node]:
path = all_paths[start_node][end_node]
for i in range(len(path) - 1):
edge_id = G[path[i]][path[i+1]]["id"]
edge_counts[edge_id] += 1
# 输出每条边被最短路径使用的次数
for edge in edges:
print("边{}被使用了{}次".format(edge["id"], edge_counts[edge["id"]]))
```
这段代码在计算完所有节点对之间的最短路径后,遍历所有路径上的边,统计每条边被使用的次数,并输出每条边被使用的次数。
import pandas as pd import numpy as np import networkx as nx import matplotlib.pyplot as plt df = pd.read_excel(r"C:\Users\li'yi'jie\Desktop\运筹学网络规划数据.xlsx") edges = [] for i in range(len(df)): edge = { "id": df.loc[i, "边的编号"], "tail": df.loc[i, "边的尾节点"], "head": df.loc[i, "边的头节点"], "length": df.loc[i, "长度"], "capacity": df.loc[i, "容量"] } edges.append(edge) plt.figure(figsize=(15,15)) G = nx.DiGraph() for edge in edges: G.add_edge(edge["tail"], edge["head"], weight=edge["length"]) all_pairs = dict(nx.all_pairs_dijkstra_path_length(G)) rows = [] for start_node, dist_dict in all_pairs.items(): for end_node, dist in dist_dict.items(): rows.append({'起始节点': start_node, '终止节点': end_node, '最短路径长度': dist}) df_result = pd.DataFrame(rows) df_result.to_excel('all_pairs.xlsx', index=False)如何在将最短路径长度写入excel时,将其经过的边的编号一起写入excel?
可以在遍历所有起点和终点对的最短路径时,记录下路径上经过的边的编号,然后将其一起写入Excel。可以将以下代码添加到原有代码中:
```
for start_node, path_dict in nx.all_pairs_dijkstra_path(G):
for end_node, path in path_dict.items():
path_edges = []
for i in range(len(path)-1):
tail = path[i]
head = path[i+1]
edge_id = G[tail][head]['id']
path_edges.append(edge_id)
rows.append({'起始节点': start_node, '终止节点': end_node, '最短路径长度': nx.dijkstra_path_length(G, start_node, end_node), '经过的边的编号': path_edges})
```
这段代码将路径上经过的边的编号存储在一个列表中,然后将其作为一个新的列添加到Excel表格中。需要在创建DataFrame对象时将列名加入到rows中:
```
rows.append({'起始节点': start_node, '终止节点': end_node, '最短路径长度': nx.dijkstra_path_length(G, start_node, end_node), '经过的边的编号': path_edges})
```
最后将DataFrame对象写入Excel文件中时,也要将这个新的列加入到Excel表格中:
```
df_result = pd.DataFrame(rows, columns=['起始节点', '终止节点', '最短路径长度', '经过的边的编号'])
df_result.to_excel('all_pairs.xlsx', index=False)
```
阅读全文
相关推荐









