我使用networkx库来获取给定图形中的所有最短路径,试图模拟等价多路径(就像OSPF那样):
所以,例如,我想得到(如下图所示):
H.add_edge('R1','R2',weight=5)
H.add_edge('R1','R3',weight=5)
H.add_edge('R4','R2',weight=5)
H.add_edge('R4','R3',weight=5)
此输出:
[['R1', 'R2', 'R4'], ['R1', 'R3', 'R4']]
这可能做到:
[p for p in nx.all_shortest_paths(H,source='R1',target='R4')]
但是,如果我将边缘R4-R3中的权重更改为10,则all_shortest_paths函数将保持显示所有路径。我的问题是:是否有任何功能显示所有最短路径或只有最短路径取决于重量?
问候。
答案 0 :(得分:0)
public function add_user(Request $request){
$this->validate($request, [
'name' => 'required|min:3',
'email' => 'required|email|unique:users,email',
'mobile' => 'required|regex:/^[789]\d{9}+$/|unique:users,mobile',
'pass' => 'required|min:6',
'cpass' => 'required|same:pass'
]);
$user = new Myuser;
$user->name = $request->input('name');
$user->email = $request->input('email');
$user->mobile = $request->input('mobile');
$user->pass = md5("EEE".$request->input('pass'));
$user->register_on = date('Y-m-d');
$user->user_type = 'Free';
$user->last_login = date('Y-m-d H:i:s');
$user->status = 'Active';
$user->save();
$insertedId = $user->sno;
$uid = "UID".$insertedId;
Myuser::where('sno', $insertedId)
->update(['uid' => $uid]);
//echo $insertedId;
return redirect('')->with('message', 'Registered Successfully');
}
函数不考虑权重。但是,在这种情况下,可以通过将每条最短路径中的边的权重相加并选择最大值来获得预期结果。
初始化图表:
all_shortest_paths
使用列表推导计算路径中每条边的权重:
import networkx as nx
G = nx.Graph()
G.add_weighted_edges_from([('R1', 'R2', 5), ('R1', 'R3', 5), ('R4', 'R2', 5), ('R4', 'R3', 10)])
shortest_paths = np.array(list(nx.all_shortest_paths(G, source='R1', target='R4')))
然后从path_weights = np.array([sum([G.get_edge_data(path[edge], path[edge + 1])['weight'] for edge in range(len(path) - 1)]) for path in shortest_paths])
中选择最大总重量的路径:
shortest_paths
答案 1 :(得分:0)
由于您可以指定多个不同的属性用作权重,all_shortest_paths
不知道您要使用的标签。因此,默认情况下,它只会查看边数并忽略您创建的任何权重。它有一个可选参数,允许您提供权重。看看documentation。它由all_shortest_paths(G, source, target, weight=None)
调用。所以你需要定义重量。
在你的情况下:
[p for p in nx.all_shortest_paths(H,source='R1',target='R4', weight = 'weight')]
将提供您想要的输出。