python:
import time
import csv
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 配置
CONFIG = {
"driver_path": "./chromedriver", # 确保路径正确
"headless": False,
"base_url": "https://kns.cnki.net/kns8s/search",
"search_keyword": "高温合金",
"output_file": "material_data.csv",
"timeout": 30,
"element_timeout": 10,
}
# 初始化浏览器
def init_driver(config):
try:
driver = webdriver.Safari()
driver.maximize_window()
return driver
except Exception as e:
print(f"浏览器初始化失败: {str(e)}")
return None
# 数据爬取
def scrape_literature_data(driver):
data = []
try:
driver.get(CONFIG["base_url"])
wait = WebDriverWait(driver, CONFIG["element_timeout"])
# 搜索操作
search_box = wait.until(EC.presence_of_element_located((By.ID, 'txt_search')))
search_box.send_keys(CONFIG["search_keyword"])
search_button = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'search-btn')))
search_button.click()
# 等待结果加载
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.result-table-list')))
time.sleep(2) # 必要等待
# 解析结果
results = driver.find_elements(By.CSS_SELECTOR, '.result-table-list tr:not(:first-child)')
print(f"找到 {len(results)} 条结果")
# 采集基础数据
for idx, result in enumerate(results[:5]): # 测试时限制数量
try:
cells = result.find_elements(By.TAG_NAME, 'td')
if len(cells) < 8: continue
title_elem = cells[1].find_element(By.TAG_NAME, 'a')
data.append({
'Title': title_elem.text,
'Link': title_elem.get_attribute('href'),
})
except Exception as e:
print(f"第{idx+1}条数据解析失败: {str(e)}")
# 打印原始数据
print("爬取到的原始数据:")
for item in data:
print(f"文件名: {item['Title']}, 网址: {item['Link']}")
return data
except Exception as e:
print(f"数据爬取失败: {str(e)}")
return []
# 保存数据到CSV文件
def save_to_csv(data, filename):
if not data:
print("没有数据可保存")
return
try:
with open(filename, mode='w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=['Title', 'Link'])
writer.writeheader()
for item in data:
writer.writerow(item)
print(f"数据已成功保存到文件: {filename}")
except Exception as e:
print(f"保存到CSV文件失败: {str(e)}")
# 主程序
def main():
driver = init_driver(CONFIG)
if not driver:
return
try:
# 数据采集
raw_data = scrape_literature_data(driver)
if not raw_data:
raise ValueError("未获取到有效数据")
# 保存数据到CSV文件
save_to_csv(raw_data, CONFIG["output_file"])
except Exception as e:
print(f"主流程错误: {str(e)}")
finally:
driver.quit()
if __name__ == "__main__":
main()
matlab:
function erlangB_exercise()
% Main function for Erlang B exercise with GUI interface
% Create main figure
fig = figure('Name', 'Erlang AAA System Analysis', 'NumberTitle', 'off', ...
'Position', [100, 100, 900, 600]);
% Create tabs
tabgroup = uitabgroup(fig);
tab1 = uitab(tabgroup, 'Title', 'Call Blocking Probability');
tab2 = uitab(tabgroup, 'Title', 'Steady-State Probabilities');
tab3 = uitab(tabgroup, 'Title', 'Traffic Analysis');
% Default parameters
default_m = [5, 10, 25, 50, 75, 100];
default_a_min = 1;
default_a_max = 100;
default_ymin = 1e-3;
default_ymax = 1;
% UI controls for Tab 1
uicontrol(tab1, 'Style', 'text', 'String', 'Number of servers (m):', ...
'Position', [20, 500, 150, 20], 'HorizontalAlignment', 'left');
m_edit = uicontrol(tab1, 'Style', 'edit', 'String', mat2str(default_m), ...
'Position', [180, 500, 200, 20]);
uicontrol(tab1, 'Style', 'text', 'String', 'Offered traffic range (a):', ...
'Position', [20, 470, 150, 20], 'HorizontalAlignment', 'left');
a_min_edit = uicontrol(tab1, 'Style', 'edit', 'String', num2str(default_a_min), ...
'Position', [180, 470, 60, 20]);
uicontrol(tab1, 'Style', 'text', 'String', 'to', ...
'Position', [250, 470, 20, 20], 'HorizontalAlignment', 'center');
a_max_edit = uicontrol(tab1, 'Style', 'edit', 'String', num2str(default_a_max), ...
'Position', [280, 470, 60, 20]);
uicontrol(tab1, 'Style', 'text', 'String', 'Y-axis range:', ...
'Position', [20, 440, 150, 20], 'HorizontalAlignment', 'left');
ymin_edit = uicontrol(tab1, 'Style', 'edit', 'String', num2str(default_ymin), ...
'Position', [180, 440, 60, 20]);
uicontrol(tab1, 'Style', 'text', 'String', 'to', ...
'Position', [250, 440, 20, 20], 'HorizontalAlignment', 'center');
ymax_edit = uicontrol(tab1, 'Style', 'edit', 'String', num2str(default_ymax), ...
'Position', [280, 440, 60, 20]);
plot_button = uicontrol(tab1, 'Style', 'pushbutton', 'String', 'Plot', ...
'Position', [180, 400, 100, 30], ...
'Callback', @plot_blocking_probability);
% Axes for Tab 1
ax1 = axes(tab1, 'Position', [0.1, 0.1, 0.8, 0.3]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Tab 2: Steady-State Probability Distribution
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% UI controls for Tab 2
uicontrol(tab2, 'Style', 'text', 'String', 'Number of servers (m):', ...
'Position', [20, 500, 150, 20], 'HorizontalAlignment', 'left');
m2_edit = uicontrol(tab2, 'Style', 'edit', 'String', '5', ...
'Position', [180, 500, 60, 20]);
uicontrol(tab2, 'Style', 'text', 'String', 'Offered traffic (a):', ...
'Position', [20, 470, 150, 20], 'HorizontalAlignment', 'left');
a2_edit = uicontrol(tab2, 'Style', 'edit', 'String', '3.75', ...
'Position', [180, 470, 60, 20]);
plot2_button = uicontrol(tab2, 'Style', 'pushbutton', 'String', 'Plot Distribution', ...
'Position', [180, 400, 150, 30], ...
'Callback', @plot_steady_state);
% Axes for Tab 2
ax2 = axes(tab2, 'Position', [0.1, 0.1, 0.8, 0.3]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Tab 3: Traffic Analysis
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Analysis type selection
uicontrol(tab3, 'Style', 'text', 'String', 'Analysis Type:', ...
'Position', [20, 500, 100, 20], 'HorizontalAlignment', 'left');
analysis_type = uicontrol(tab3, 'Style', 'popupmenu', ...
'String', {'Max Traffic for m and P_c', ...
'Max Users for m, P_c, λ₀, 1/μ', ...
'Min Servers for a and P_c'}, ...
'Position', [130, 500, 200, 20]);
% Panel for parameters
param_panel = uipanel(tab3, 'Title', 'Parameters', 'Position', [0.05, 0.3, 0.9, 0.2]);
% Result display
result_text = uicontrol(tab3, 'Style', 'text', 'String', 'Result will appear here', ...
'Position', [100, 200, 300, 50], 'FontSize', 12);
calculate_button = uicontrol(tab3, 'Style', 'pushbutton', 'String', 'Calculate', ...
'Position', [200, 150, 100, 30], ...
'Callback', @calculate_traffic);
% Set up parameter controls for each analysis type
setup_parameter_controls();
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Callback Functions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function plot_blocking_probability(~, ~)
% Plot Erlang B call blocking probability curves
try
m = str2num(m_edit.String);
a_min = str2double(a_min_edit.String);
a_max = str2double(a_max_edit.String);
ymin = str2double(ymin_edit.String);
ymax = str2double(ymax_edit.String);
a = a_min:0.1:a_max;
axes(ax1);
cla;
hold on;
colors = lines(length(m));
for i = 1:length(m)
Pc = arrayfun(@(x) erlang_b(x, m(i)), a);
semilogy(a, Pc, 'Color', colors(i,:), 'LineWidth', 2, ...
'DisplayName', sprintf('m = %d', m(i)));
end
set(gca, 'YScale', 'log');
ylim([ymin, ymax]);
xlabel('Offered Traffic (a)');
ylabel('Call Blocking Probability (P_c)');
title('Erlang B Call Blocking Probability');
legend('show', 'Location', 'northeast');
grid on;
hold off;
catch ME
errordlg(sprintf('Error: %s', ME.message), 'Plot Error');
end
end
function plot_steady_state(~, ~)
% Plot steady-state probability distribution
try
m = str2double(m2_edit.String);
a = str2double(a2_edit.String);
% Calculate steady-state probabilities
P0 = 1 / sum(arrayfun(@(k) a^k / factorial(k), 0:m));
Pk = arrayfun(@(k) (a^k / factorial(k)) * P0, 0:m);
axes(ax2);
cla;
bar(0:m, Pk);
% Add text labels
for k = 0:m
text(k, Pk(k+1), sprintf('%.4f', Pk(k+1)), ...
'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom');
end
xlabel('Number of busy servers (k)');
ylabel('Probability P_k');
title(sprintf('Steady-State Probability Distribution (m=%d, a=%.2f)', m, a));
grid on;
catch ME
errordlg(sprintf('Error: %s', ME.message), 'Plot Error');
end
end
function calculate_traffic(~, ~)
% Perform traffic analysis based on selected type
type = analysis_type.Value;
try
switch type
case 1 % Max Traffic for m and P_c
m = str2double(get_param_control(1).String);
Pc = str2double(get_param_control(2).String);
% Find maximum a that satisfies Pc >= ErlangB(a,m)
a_max = fzero(@(a) erlang_b(a, m) - Pc, [0.1, m*10]);
set(result_text, 'String', sprintf('Maximum Traffic (a): %.4f', a_max));
case 2 % Max Users for m, P_c, λ₀, 1/μ
m = str2double(get_param_control(1).String);
Pc = str2double(get_param_control(2).String);
lambda0 = str2double(get_param_control(3).String);
inv_mu = str2double(get_param_control(4).String);
% Find maximum N where a = λ₀*N/μ and Pc >= ErlangB(a,m)
fun = @(N) erlang_b(lambda0 * N * inv_mu, m) - Pc;
N_max = floor(fzero(fun, [0.1, m*10/lambda0/inv_mu]));
set(result_text, 'String', sprintf('Maximum Users (N): %d', N_max));
case 3 % Min Servers for a and P_c
a = str2double(get_param_control(1).String);
Pc = str2double(get_param_control(2).String);
% Find minimum m where Pc >= ErlangB(a,m)
m_min = 1;
while erlang_b(a, m_min) > Pc
m_min = m_min + 1;
end
set(result_text, 'String', sprintf('Minimum Servers (m): %d', m_min));
end
catch ME
errordlg(sprintf('Error: %s', ME.message), 'Calculation Error');
end
end
function setup_parameter_controls()
% Set up parameter controls for each analysis type
% Clear existing controls
delete(get(param_panel, 'Children'));
type = analysis_type.Value;
switch type
case 1 % Max Traffic for m and P_c
uicontrol(param_panel, 'Style', 'text', 'String', 'Number of servers (m):', ...
'Position', [20, 60, 150, 20], 'HorizontalAlignment', 'left');
uicontrol(param_panel, 'Style', 'edit', 'String', '10', ...
'Position', [180, 60, 60, 20], 'Tag', 'param1');
uicontrol(param_panel, 'Style', 'text', 'String', 'Call blocking probability (P_c):', ...
'Position', [20, 30, 150, 20], 'HorizontalAlignment', 'left');
uicontrol(param_panel, 'Style', 'edit', 'String', '0.01', ...
'Position', [180, 30, 60, 20], 'Tag', 'param2');
case 2 % Max Users for m, P_c, λ₀, 1/μ
uicontrol(param_panel, 'Style', 'text', 'String', 'Number of servers (m):', ...
'Position', [20, 90, 150, 20], 'HorizontalAlignment', 'left');
uicontrol(param_panel, 'Style', 'edit', 'String', '10', ...
'Position', [180, 90, 60, 20], 'Tag', 'param1');
uicontrol(param_panel, 'Style', 'text', 'String', 'Call blocking probability (P_c):', ...
'Position', [20, 60, 150, 20], 'HorizontalAlignment', 'left');
uicontrol(param_panel, 'Style', 'edit', 'String', '0.01', ...
'Position', [180, 60, 60, 20], 'Tag', 'param2');
uicontrol(param_panel, 'Style', 'text', 'String', 'Single user arrival rate (λ₀):', ...
'Position', [20, 30, 150, 20], 'HorizontalAlignment', 'left');
uicontrol(param_panel, 'Style', 'edit', 'String', '0.1', ...
'Position', [180, 30, 60, 20], 'Tag', 'param3');
uicontrol(param_panel, 'Style', 'text', 'String', 'Average service time (1/μ):', ...
'Position', [300, 30, 150, 20], 'HorizontalAlignment', 'left');
uicontrol(param_panel, 'Style', 'edit', 'String', '1', ...
'Position', [450, 30, 60, 20], 'Tag', 'param4');
case 3 % Min Servers for a and P_c
uicontrol(param_panel, 'Style', 'text', 'String', 'Offered traffic (a):', ...
'Position', [20, 60, 150, 20], 'HorizontalAlignment', 'left');
uicontrol(param_panel, 'Style', 'edit', 'String', '10', ...
'Position', [180, 60, 60, 20], 'Tag', 'param1');
uicontrol(param_panel, 'Style', 'text', 'String', 'Call blocking probability (P_c):', ...
'Position', [20, 30, 150, 20], 'HorizontalAlignment', 'left');
uicontrol(param_panel, 'Style', 'edit', 'String', '0.01', ...
'Position', [180, 30, 60, 20], 'Tag', 'param2');
end
end
function control = get_param_control(index)
% Helper function to get parameter control by index
children = get(param_panel, 'Children');
tags = get(children, 'Tag');
control = children(strcmp(tags, sprintf('param%d', index)));
end
function Pc = erlang_b(a, m)
% Calculate Erlang B formula (call blocking probability)
% Pc = (a^m / m!) / (sum_{k=0}^m (a^k / k!))
numerator = a^m / factorial(m);
denominator = sum(arrayfun(@(k) a^k / factorial(k), 0:m));
Pc = numerator / denominator;
end
% Set callback for analysis type change
analysis_type.Callback = @(~,~) setup_parameter_controls();
% Initialize parameter controls
setup_parameter_controls();
end