首页 > 编程语言 >python数学建模习题六

python数学建模习题六

时间:2024-10-27 22:44:57浏览次数:7  
标签:node draw plt python 建模 pos nx np 习题

学号后四位3026,1班
6.1
import networkx as nx
import matplotlib.pyplot as plt

L1 = [(1, 2), (1, 3), (1, 4), (2, 3), (2, 6), (3, 4), (4, 5), (5, 6)]
G1 = nx.Graph();
G1.add_nodes_from(range(1, 7))
G1.add_edges_from(L1);
posl = nx.shell_layout(G1)
plt.subplot(131)
nx.draw(G1, posl, with_labels=True, font_weight='bold')

L2 = [(1, 2, 2.7), (1, 3, 3.0), (1, 4, 12.0), (2, 3, 1.0), (2, 6, 1.0), (3, 4, 8.0), (4, 5, 9.0), (5, 6, 3.0)]
G2 = nx.Graph();
G2.add_nodes_from(range(1, 7))
G2.add_weighted_edges_from(L2);
pos2 = nx.shell_layout(G2)
plt.subplot(132)
nx.draw(G2, pos2, with_labels=True, font_weight='bold')
w2 = nx.get_edge_attributes(G2, 'weight')
nx.draw_networkx_edge_labels(G2, pos2, edge_labels=w2)

L3 = [(1, 3, 3), (2, 1, 7), (2, 3, 1), (3, 4, 8), (4, 1, 12), (5, 4, 9), (5, 6, 3), (6, 2, 1)]
G3 = nx.DiGraph();
G3.add_nodes_from(range(1, 7))
G3.add_weighted_edges_from(L3);
pos3 = nx.shell_layout(G3)
plt.subplot(133)
nx.draw(G3, pos3, with_labels=True, font_weight='bold')
w3 = nx.get_edge_attributes(G3, 'weight')
nx.draw_networkx_edge_labels(G3, pos3, edge_labels=w3)
plt.show()

6.3
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

L = [(1,2,20),(1,5,15),(2,3,20),(2,4,60),(2,5,25),(3,4,30),(3,5,18),(4,5,35),(4,6,10),(5,6,15)]
G = nx.Graph(); G.add_nodes_from(range(1,7))
G.add_weighted_edges_from(L)
T = nx.minimum_spanning_tree(G)
w = nx.get_edge_attributes(T,'weight')
TL = sum(w.values())
print('最小生成树的长度为:',TL)
pos = nx.shell_layout(G)
s = ['v'+str(i) for i in range(1,7)]
s = dict(zip(range(1,7),s));nx.draw(T,pos,labels=s)
nx.draw_networkx_edge_labels(T,pos,edge_labels=w)
plt.show()

6.4

定义初始数据

initial_costs = [2.5, 2.6, 2.8, 3.1] # 年初购置新机器的价格
salvage_values = [0.0, 2.0, 1.6, 1.3, 1.1] # 使用了j年的机器年末的处理价
maintenance_costs = [0.3, 0.8, 1.5, 2.0] # 使用j年的机器每年的运行及维修费用

定义策略函数,计算每种策略的总费用

def calculate_cost(strategy):
total_cost = 0
current_year = 0
machine_age = 0 # 机器当前已使用的年数(从0开始计数)

# 遍历四年的每一年
for _ in range(4):  # 使用for循环代替while循环,因为我们已经知道要遍历四年
    if current_year < len(strategy) and strategy[current_year] == 'new':
        # 如果当前年份有决策且决策是买新机器
        total_cost += initial_costs[current_year]  # 加上新机器的价格
        machine_age = 0  # 重置机器年龄
    else:
        # 否则,继续使用旧机器(或没有机器可用时的特殊情况)
        if machine_age > 0:  # 如果不是第一年(即有机器可用)
            total_cost += salvage_values[machine_age]  # 加上卖掉旧机器的处理价(但注意这里的逻辑可能需要根据实际情况调整)
            # 注意:通常我们不会在继续使用机器的同时卖掉它,这里的处理可能是基于特定假设的

    # 加上当前机器的维修费
    # 注意:我们需要确保machine_age不会超出maintenance_costs的范围,但由于我们已经知道machine_age最大为3(因为只买了三次新机器或从未买过),所以这里不需要额外检查
    total_cost += maintenance_costs[min(machine_age, 3)]

    # 更新机器年龄和年份
    machine_age += 1 if current_year < len(strategy) and strategy[current_year] != 'new' else 0
    current_year += 1

    # 注意:由于我们的策略只定义了前三年的决策,第四年的成本完全基于前三年的决策(特别是机器的年龄)
# 因此,不需要在第四年做额外的决策或计算

return total_cost

定义所有可能的策略(这里只定义了部分策略作为示例)

strategies = [
['new', 'new', 'new'],
['new', 'continue', 'new'],
['new', 'continue', 'continue'],
# 可以添加更多策略...
]

计算每种策略的总费用,并找出最小费用对应的策略

min_cost = float('inf')
best_strategy = None
for strategy in strategies:
cost = calculate_cost(strategy)
if cost < min_cost:
min_cost = cost
best_strategy = strategy

# 输出结果

print(f"最小总费用为:{min_cost} 万元")
print(f"最优更新策略为:{best_strategy}(其中'new'表示买新机器,'continue'表示继续使用上一年的机器到年末)")

6.5
import numpy as np

distance_matrix = np.array([
[0, 10, 20, 30, 40, 50],
[10, 0, 15, 25, 35, 45],
[20, 15, 0, 10, 20, 30],
[30, 25, 10, 0, 15, 25],
[40, 35, 20, 15, 0, 10],
[50, 45, 30, 25, 10, 0]
])

student_counts = np.array([50, 40, 60, 20, 70, 90])

max_distances = np.max(distance_matrix, axis=1)
hospital_location = np.argmin(max_distances) + 1 # 加1是因为村庄编号从1开始
print(f"医院应建在村庄 {hospital_location} 以使最远村庄的人到医院看病所走的路最短。")

total_distances = np.dot(distance_matrix, student_counts)
school_location = np.argmin(total_distances) + 1 # 加1是因为村庄编号从1开始
print(f"小学应建在村庄 {school_location} 以使所有学生上学走的总路程最短。")

6.7
import pandas as pd
import matplotlib.pyplot as plt
import networkx as nx
import numpy as np

读取 Excel 文件

file_path = 'datn4_6.xlsx'
df = pd.read_excel(file_path, header=None)

提取数据

nodes = []
edges = []
for index, row in df.iterrows():
node_id = row[0]
x, y = row[1], row[2]
importance = row[3]
connections = row[4:].dropna().tolist()

nodes.append({'id': node_id, 'x': x, 'y': y, 'importance': importance})  
  
for conn in connections:  
    edges.append((node_id, conn))  

创建 NetworkX 图

G = nx.Graph()

添加节点和属性

for node in nodes:
importance_symbol = '☆' if node['importance'] == '1' else ('*' if node['importance'] == '2' else ',')
G.add_node(node['id'], pos=(node['x'], node['y']), importance=importance_symbol)

添加边

G.add_edges_from(edges)

绘制无向图

pos = nx.get_node_attributes(G, 'pos')
plt.figure(figsize=(12, 8))
nx.draw_networkx_nodes(G, pos, node_size=500, node_color='skyblue', cmap=plt.cm.RdYlBu, node_shape='o', labels={k: f"{v['importance']}\n{k}" for k, v in G.nodes(data=True)})
nx.draw_networkx_edges(G, pos, alpha=0.5)
nx.draw_networkx_labels(G, pos, font_size=10, font_family="sans-serif")

设置坐标轴范围和刻度

plt.xlim(-1600, 600)
plt.ylim(200, 1200)
plt.xticks(np.arange(-1600, 601, 200))
plt.yticks(np.arange(200, 1201, 200))
plt.grid(True)
plt.gca().set_aspect('equal', adjustable='box')
plt.title('无向图')
plt.xlabel('X 坐标')
plt.ylabel('Y 坐标')
plt.show()

计算最小生成树(权重为距离)

T = nx.minimum_spanning_tree(G, weight=lambda u, v, d: np.sqrt((pos[u][0] - pos[v][0])2 + (pos[u][1] - pos[v][1])2))

绘制最小生成树

plt.figure(figsize=(12, 8))
nx.draw_networkx_nodes(T, pos, node_size=500, node_color='lightgreen', cmap=plt.cm.RdYlBu, node_shape='o', labels={k: f"{v['importance']}\n{k}" for k, v in T.nodes(data=True)})
nx.draw_networkx_edges(T, pos, alpha=0.5, edge_color='red', width=2)
nx.draw_networkx_labels(T, pos, font_size=10, font_family="sans-serif")

设置坐标轴范围和刻度

plt.xlim(-1600, 600)
plt.ylim(200, 1200)
plt.xticks(np.arange(-1600, 601, 200))
plt.yticks(np.arange(200, 1201, 200))
plt.grid(True)
plt.gca().set_aspect('equal', adjustable='box')
plt.title('最小生成树')
plt.xlabel('X 坐标')
plt.ylabel('Y 坐标')
plt.show()

计算顶点 L 到顶点 R3 的最短路径和距离

try:
path = nx.shortest_path(G, source='L', target='R3', weight=lambda u, v, d: np.sqrt((pos[u][0] - pos[v][0])2 + (pos[u][1] - pos[v][1])2))
distance = nx.shortest_path_length(G, source='L', target='R3', weight=lambda u, v, d: np.sqrt((pos[u][0] - pos[v][0])2 + (pos[u][1] - pos[v][1])2))
print(f"顶点 L 到顶点 R3 的最短路径: {path}")
print(f"顶点 L 到顶点 R3 的最短距离: {distance}")

# 绘制最短路径  
plt.figure(figsize=(12, 8))  
nx.draw_networkx_nodes(G, pos, node_size=500, node_color='skyblue', cmap=plt.cm.RdYlBu, node_shape='o', labels={k: f"{v['importance']}\n{k}" for k, v in G.nodes(data=True)})  
nx.draw_networkx_edges(G, pos, alpha=0.5)  
nx.draw_networkx_edges(G, pos, edgelist=list(zip(path, path[1:] + [path[0]])), edge_color='blue', width=3)  
nx.draw_networkx_labels(G, pos, font_size=10, font_family="sans-serif")  

# 设置坐标轴范围和刻度  
plt.xlim(-1600, 600)  
plt.ylim(200, 1200)  
plt.xticks(np.arange(-1600, 601, 200))  
plt.yticks(np.arange(200, 1201, 200))  
plt.grid(True)  
plt.gca().set_aspect('equal', adjustable='box')  
plt.title('最短路径')  
plt.xlabel('X 坐标')  
plt.ylabel('Y 坐标')  
plt.show()  

except nx.NetworkXNoPath:
print("顶点 L 到顶点 R3 之间没有路径")

标签:node,draw,plt,python,建模,pos,nx,np,习题
From: https://www.cnblogs.com/050114hsy/p/18493556

相关文章

  • Python 函数的返回值定义语法
    什么是函数返回值?函数在执行完成后,返回给调用者的结果返回值的应用语法:使用关键字:return来返回结果def函数(参数...):函数体return返回值变量=函数(参数)注意:函数体在遇到return后就结束了,所以写在return后的代码不会执行练习:#定义一个函数,完成两......
  • python可以对excel进行那些操作
    根据标题“Python可以对Excel进行哪些操作”,Python对Excel的操作能力强大,涵盖数据读写、格式设置、图表创建、数据分析和自动化处理等功能。例如,1、读取和写入数据:Python可以读取Excel文件中的数据,并将数据写入到Excel中;2、格式设置:Python能够调整字体、颜色、单元格的大小和排列;3......
  • 中值滤波python代码
    文章目录一、中值滤波二、代码实现一、中值滤波中值滤波使用了局部邻域(窗口)里的中值来代替上述局部平均法中的局部平均值。即将以该点为中心的某个窗口框住的各像素的中间值作为处理后图象中该点像素的值。能有效处理椒盐噪声。二、代码实现下图代码实现了中值滤波对......
  • 刷c语言练习题13(牛客网)
    1、有以下程序12345678#include<iostream>#include<cstdio>usingnamespacestd;intmain(){  intm=0123,n=123;  printf("%o%o\n",m,n);  return0;}程序运行后的输出结果是()A、01230173B、0123173C、123173D、173173答案:C解析:......
  • 100种算法【Python版】第14篇——Pollard‘s Rho 质因数分解算法
    本文目录1基本原理2算法步骤3数学示例4python代码1基本原理Pollard’sRho算法是由约翰·波拉德(JohnPollard)于1975年提出的一种用于整数因数分解的概率算法。它以高效性和实现简洁著称。核心原理伪随机序列生成:利用一个简单的迭代函数生成一个伪随机......
  • python系列【亲测有效-只到了图形化连接桌面】:Python 调用windows系统远程桌面应用
    Python调用windows系统远程桌面应用Python调用windows系统远程桌面应用使用pyautogui模块实现远程桌面应用的调用总结参考链接Python调用windows系统远程桌面应用远程桌面应用是一种方便用户在远程设备上访问和控制本地桌面的技术,对于远程办公、远程......
  • 机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
    1.基础算法常见面试篇1.1过拟合和欠拟合常见面试篇一、过拟合和欠拟合是什么?二、过拟合/高方差(overfiting/highvariance)篇2.1过拟合是什么及检验方法?2.2导致过拟合的原因是什么?2.3过拟合的解决方法是什么?三、欠拟合/高偏差(underfiting/highbias)篇3.......
  • 【MySQL】实战篇—应用开发:使用MySQL与编程语言(如Python、Java、PHP等)进行交互
    MySQL是存储和管理数据的强大工具,而编程语言(如Python、Java、PHP等)则用于开发应用程序和处理业务逻辑。将这两者结合起来,可以实现数据的存储、查询、更新和管理,进而构建功能强大的应用程序。2.重要性和实际应用场景在软件开发中,数据库与编程语言的交互至关重要,以下是一些常......
  • Linux练习题(四)
    1、 修改系统的主机名为(姓名首字母+学号后两位:如张三学号01,则主机名为zs01)、在VMware虚拟网络配置中设计仅主机模式的网段为192.168.X.0/24网段(X为学号后两位取整),并关闭DHCP。更改虚拟机名称为server01,克隆一台redhat7虚拟机并命名为client01.两台主机的网络模式皆设置为仅主机......
  • Python酷库之旅-第三方库Pandas(161)
    目录一、用法精讲736、pandas.Period.freq属性736-1、语法736-2、参数736-3、功能736-4、返回值736-5、说明736-6、用法736-6-1、数据准备736-6-2、代码示例736-6-3、结果输出737、pandas.Period.freqstr属性737-1、语法737-2、参数737-3、功能737-4、返回值7......