Browse Source

yangshi

small-tupu
菅振宇 6 months ago
parent
commit
7bc99fd1ba
  1. 8
      gyxtp/src/api/api/graph.js
  2. 112
      gyxtp/src/view/small.vue
  3. 168
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ZhyPointController.java
  4. 13
      ruoyi-api/src/main/java/com/ruoyi/api/controller/TestXiaoTuPuController.java
  5. 95
      ruoyi-api/src/main/java/com/ruoyi/api/service/impl/PointService.java
  6. 38
      ruoyi-ui/src/views/system/SysPoint/index.vue
  7. 2
      test3.csv

8
gyxtp/src/api/api/graph.js

@ -99,8 +99,12 @@ export const getPointInfoByUUID = (param) => {
export const getReInfoByNameAndType = (name,type) => {
return request({
url: '/api/test/getReInfoByNameAndType/'+name+"/"+type,
method: 'get',
url: '/api/test/getReInfoByNameAndType',
method: 'post',
data:{
name:name,
type:type
}
});
};
export const getDocInfoBylinkIds = (param) => {

112
gyxtp/src/view/small.vue

@ -198,7 +198,7 @@ export default {
toolBarPositionV: 'bottom',
// 使线
defaultLineShape: 2, // 2 = 线Bezier3 = 线
defaultLineShape: 1, // 2 = 线Bezier3 = 线
layout: {
layoutName: 'force',
@ -407,58 +407,93 @@ export default {
getColor(type){
let res = "rgb(227,203,0)"
if (type=="author"){
res = "rgb(255,203,0)"
res = "#ff8c00"
}
if (type=="agency"){
res = "rgb(0,255,0)"
res = "rgb(64, 158, 255)"
}
if (type=="keyword"){
res = "rgb(0,0,255)"
res = "#ffd602"
}
return res
},
getPointData(){
getpoinByName(this.getpoinName).then((res) => {
let nodes = []
let links = []
for (let i = 0;i<res.nodes.length;i++){
if (res.nodes[i].type=="keyword" && res.nodes[i].text!=this.getpoinName){
continue
}
let t_data ={}
if (res.nodes[i].type=="keyword"){
t_data = {
id:res.nodes[i].id,
text:res.nodes[i].text,
color:this.getColor(res.nodes[i].type),
fontColor:'#fff'
}
}else{
t_data = {
id:res.nodes[i].id,
text:res.nodes[i].text,
color:this.getColor(res.nodes[i].type),
fontColor:'#000'
}
let nodes = [];
let links = [];
// Step 1: totalNum data.num
const totalNumMap = {}; // { nodeId: totalNum }
console.log(res.links)
res.links.forEach(link => {
const from = link.from;
const to = link.to;
const num = link.num || 0; //
console.log(num)
// from to num
totalNumMap[from] = (totalNumMap[from] || 0) + num;
totalNumMap[to] = (totalNumMap[to] || 0) + num;
});
// undefined
res.nodes.forEach(node => {
if (!totalNumMap[node.id]) {
totalNumMap[node.id] = 0;
}
});
// Step 2: totalNum
for (let i = 0; i < res.nodes.length; i++) {
const node = res.nodes[i];
nodes.push(t_data)
// text
if (node.type === "keyword" && node.text !== this.getpoinName) {
continue;
}
// console.log(res.links)
for (let i = 0;i<res.links.length;i++){
let t_data = {
from:res.links[i].from,
to:res.links[i].to,
text:res.links[i].text,
data:{
uuids:res.links[i].uuids,
num:res.links[i].num
// num
const totalNum = totalNumMap[node.id];
// totalNum
const baseSize = 120; //
const sizePerNum = 40; // num
const maxSize = 300; //
let width = baseSize + sizePerNum * totalNum;
width = Math.min(width, maxSize); //
const height = width; //
const t_data = {
id: node.id,
text: node.text,
width: width,
height: height,
color: this.getColor(node.type),
fontColor: '#fff',
styleClass:"nodeClass"
};
nodes.push(t_data);
}
// Step 3:
for (let i = 0; i < res.links.length; i++) {
const link = res.links[i];
const t_line = {
from: link.from,
to: link.to,
text: link.text,
data: {
uuids: link.uuids,
num: link.num
}
console.log(t_data)
links.push(t_data)
};
links.push(t_line);
}
var data = {
nodes:nodes,
links:links
@ -488,6 +523,9 @@ export default {
</script>
<style>
.nodeClass{
font-size: 30px;
}
/*****页面主要布局样式定义******/
.graph-nav {
height: 80px;

168
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ZhyPointController.java

@ -1,8 +1,12 @@
package com.ruoyi.web.controller.system;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@ -69,14 +73,172 @@ public class ZhyPointController extends BaseController
if (fileName == null || !fileName.toLowerCase().endsWith(".csv")) {
return AjaxResult.error("仅支持上传 CSV 格式的文件");
}
// 3. 自动检测编码并读取 CSV 文件(支持 GBK / UTF-8)
List<Map<String, String>> dataList = new ArrayList<>();
String[] headers = null;
InputStream inputStream = null;
BufferedReader reader = null;
try {
inputStream = file.getInputStream();
// 🔍 第一步:探测编码
String encoding = detectCsvEncoding(inputStream);
System.out.println("自动检测到编码: " + encoding);
// 重新打开流(因为探测时已读取部分数据)
inputStream.close();
inputStream = file.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, encoding));
String line;
int lineNumber = 0;
while ((line = reader.readLine()) != null) {
lineNumber++;
// 去除 BOM(如果存在)
if (lineNumber == 1 && line.startsWith("\uFEFF")) {
line = line.substring(1);
}
// ✅ 替换 split(",") 为能处理引号内逗号的解析方法
String[] row = parseCsvLine(line);
for (int i = 0; i < row.length; i++) {
row[i] = row[i].trim(); // 去空格
}
if (lineNumber == 1) {
// 第一行是表头
headers = row;
continue; // 跳过第一行,不加入数据
}
// 将每一行转为 Map<String, String>
Map<String, String> rowMap = new HashMap<>();
for (int i = 0; i < headers.length && i < row.length; i++) {
String key = headers[i].trim();
// 只保留你需要的字段
if (Arrays.asList("ck", "main_keyword", "sub_keyword", "title", "authors", "keywords", "abstract", "url", "urls").contains(key)) {
rowMap.put(key, row[i]);
}
}
dataList.add(rowMap);
}
} catch (IOException e) {
return AjaxResult.error("读取文件时发生错误:" + e.getMessage());
} finally {
try {
if (reader != null) reader.close();
if (inputStream != null) inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
pointService.buildPoint(dataList);
return AjaxResult.success();
}
private String[] parseCsvLine(String line) {
List<String> result = new ArrayList<>();
StringBuilder current = new StringBuilder();
boolean inQuotes = false;
char[] chars = line.toCharArray();
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
if (c == '"') {
// 处理转义引号:"" -> "
if (i + 1 < chars.length && chars[i + 1] == '"') {
current.append('"');
i++; // 跳过下一个引号
} else {
inQuotes = !inQuotes;
}
} else if (c == ',' && !inQuotes) {
// 只有不在引号内时,逗号才是分隔符
result.add(current.toString());
current.setLength(0); // 清空
} else {
current.append(c);
}
}
// 添加最后一列
result.add(current.toString());
return result.toArray(new String[0]);
}
/**
* 查询知识点管理列表
*/
private String detectCsvEncoding(InputStream inputStream) throws IOException {
byte[] buf = new byte[4096];
int readSize = inputStream.read(buf);
// 如果文件很小,只读一部分也够了
int size = readSize > 0 ? readSize : buf.length;
// 1. 检查是否以 UTF-8 BOM 开头
if (size >= 3 && buf[0] == (byte)0xEF && buf[1] == (byte)0xBB && buf[2] == (byte)0xBF) {
return "UTF-8";
}
// 2. 使用简单的启发式判断 GBK vs UTF-8
boolean isDefinitelyUtf8 = false;
boolean isProbablyGbk = false;
int i = 0;
while (i < size) {
byte b = buf[i];
if (b >= 0) {
// ASCII 字符,两种编码都一样
i++;
continue;
}
// 存在负数 -> 多字节字符
if ((b & 0xE0) == 0xC0 && i + 1 < size) {
// 2字节 UTF-8
i += 2;
} else if ((b & 0xF0) == 0xE0 && i + 2 < size) {
// 3字节 UTF-8
i += 3;
} else if ((b & 0xF8) == 0xF0 && i + 3 < size) {
// 4字节 UTF-8
i += 4;
} else {
// 不符合 UTF-8 规则,很可能是 GBK
isProbablyGbk = true;
break;
}
}
// 如果符合 UTF-8 编码规则,并且包含中文(常见于 UTF-8 文件),优先认为是 UTF-8
String sampleStr = new String(buf, 0, size, StandardCharsets.UTF_8);
if (!isProbablyGbk && sampleStr.matches(".*[\\u4e00-\\u9fa5]+.*")) {
isDefinitelyUtf8 = true;
}
// 启发式判断:如果字符串用 UTF-8 解出来是乱码,而用 GBK 解出来正常,则是 GBK
String utf8Str = new String(buf, 0, size, StandardCharsets.UTF_8);
String gbkStr = new String(buf, 0, size, Charset.forName("GBK"));
// 简单判断:GBK 解码后是否出现 (替换字符)
if (utf8Str.contains("") || utf8Str.length() != gbkStr.length()) {
// UTF-8 出现乱码,说明更可能是 GBK
return "GBK";
}
// 默认 fallback
return isDefinitelyUtf8 ? "UTF-8" : "GBK";
}
@GetMapping("/list")
public TableDataInfo list(ZhyPoint zhyPoint)
{

13
ruoyi-api/src/main/java/com/ruoyi/api/controller/TestXiaoTuPuController.java

@ -7,11 +7,9 @@ import com.ruoyi.api.mapper.ZhyPointMapper;
import com.ruoyi.api.service.impl.PointService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.utils.Neo4jUtil;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.lang.reflect.Type;
@ -170,8 +168,11 @@ public class TestXiaoTuPuController extends BaseController {
List<Map> a = zhyPointMapper.selectPointResByNeo4jId(id);
return a;
}
@GetMapping("getReInfoByNameAndType/{name}/{type}")
public List<Map<String, List<Map<String, Object>>>> selectPointRelationshipByName(@PathVariable("name")String name,@PathVariable("type")String type) throws IOException {
@PostMapping("getReInfoByNameAndType")
public List<Map<String, List<Map<String, Object>>>> selectPointRelationshipByName(@RequestBody Map map1) throws IOException {
String name = String.valueOf(map1.get("name"));
String type = String.valueOf(map1.get("type"));
String author = "";
String keyword = "";
String agency = "";

95
ruoyi-api/src/main/java/com/ruoyi/api/service/impl/PointService.java

@ -127,6 +127,101 @@ public class PointService {
}
}
public void buildPoint(List<Map<String, String>> dataList) throws IOException {
Map<String,Integer> nameToId = new HashMap<>();
for (Map<String, String> record : dataList) {
List<Map<String, String>> relationshipList = new ArrayList<>();
Map<String, List<String>> parsed = parseRecord(record);
//去重
List<String> authors = new ArrayList<>(new LinkedHashSet<>(parsed.get("author")));
List<String> agency = new ArrayList<>(new LinkedHashSet<>(parsed.get("agency")));
List<String> keywords = new ArrayList<>(new LinkedHashSet<>(parsed.get("keyword")));
String title = record.get("title");
String urls = record.get("urls");
relationshipList.addAll(cartesianProduct(authors, keywords, "author", "keyword"));
relationshipList.addAll(cartesianProduct(authors, agency, "author", "agency"));
relationshipList.addAll(cartesianProduct(keywords, agency, "keyword", "agency"));
// 处理 authors
for (int i = 0; i < authors.size(); i++) {
String rawName = authors.get(i);
String cleanName = removeTrailingDigits(rawName);
int neo4jId = getOrCreateNodeId(rawName, "author");
nameToId.put(cleanName, neo4jId); // ✅ put 在外面
}
// 处理 agency
for (int i = 0; i < agency.size(); i++) {
String rawName = agency.get(i);
String cleanName = removeTrailingDigits(rawName);
int neo4jId = getOrCreateNodeId(rawName, "agency");
nameToId.put(cleanName, neo4jId); // ✅ put 在外面
}
// 处理 keywords
for (int i = 0; i < keywords.size(); i++) {
String rawName = keywords.get(i);
String cleanName = removeTrailingDigits(rawName);
int neo4jId = getOrCreateNodeId(rawName, "keyword"); // 推荐用单数 keyword
nameToId.put(cleanName, neo4jId); // ✅ put 在外面
}
for(int i =0;i<relationshipList.size();i++){
Map<String, String> rel = relationshipList.get(i);
String authorStr = rel.get("author"); // 不存在则为 null
String keywordStr = rel.get("keyword"); // 不存在则为 null
String agencyStr = rel.get("agency"); // 不存在则为 null
String start = "";
String end = "";
String relType = "";
// 判断是哪种关系,并设置起点和终点
if (authorStr != null && !authorStr.trim().isEmpty() &&
keywordStr != null && !keywordStr.trim().isEmpty()) {
start = authorStr;
end = keywordStr;
relType = "相关作者";
} else if (authorStr != null && !authorStr.trim().isEmpty() &&
agencyStr != null && !agencyStr.trim().isEmpty()) {
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaa");
start = authorStr;
end = agencyStr;
relType = "相关机构";
} else if (keywordStr != null && !keywordStr.trim().isEmpty() &&
agencyStr != null && !agencyStr.trim().isEmpty()) {
start = keywordStr;
end = agencyStr;
relType = "相关";
}
authorStr = removeTrailingDigits(authorStr);
start = removeTrailingDigits(start);
end = removeTrailingDigits(end);
List<Map> a = zhyPointMapper.selectPointRelationshipByName(authorStr,keywordStr,agencyStr,title);
if (a.size()==0){
int startNodeId = nameToId.get(start);
int endNodeId = nameToId.get(end);
Map data = new HashMap();
data.put("relType",relType);
int reshipId = createReletionship(startNodeId,endNodeId,relType,data);
try {
zhyPointMapper.insertPointReship(authorStr,keywordStr,agencyStr,reshipId,title,urls);
}catch (Exception e){
System.out.println("并发导致重复数据");
}
}
}
}
}
/**
* 生成两个列表的笛卡尔积并标记关系类型
*/

38
ruoyi-ui/src/views/system/SysPoint/index.vue

@ -130,9 +130,6 @@
<el-form-item label="知识点名称" prop="pointName">
<el-input v-model="form.pointName" placeholder="请输入知识点名称" />
</el-form-item>
<!-- <el-form-item label="neo4j ID" prop="uuid">-->
<!-- <el-input v-model="form.uuid" placeholder="请输入neo4j ID" />-->
<!-- </el-form-item>-->
<el-form-item label="类型" prop="type1">
<el-select
v-model="form.type1"
@ -154,6 +151,24 @@
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :title="upload1.title" :visible.sync="upload1.open" width="400px" append-to-body>
<el-upload ref="upload1" :limit="1" accept=".csv" :headers="upload1.headers" :action="upload1.url"
:disabled="upload1.isUploading" :on-progress="handleFileUploadProgressRelation"
:on-success="handleFileSuccess1"
:auto-upload="false" drag>
<i class="el-icon-upload"></i>
<div class="el-upload__text"> CSV 文件拖到此处 <em>点击上传</em></div>
<div class="el-upload__tip text-center" slot="tip">
<span style="color: #999;">仅允许导入 .csv 格式文件逗号分隔文本</span>
<br/>
</div>
</el-upload>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitFileFormR"> </el-button>
<el-button @click="upload1.open = false"> </el-button>
</div>
</el-dialog>
</div>
</template>
@ -171,9 +186,7 @@ export default {
oprnIno: false,
isUploading: false,
updateSupport: 0,
headers: {Authorization: "Bearer " + getToken()},
url: "http://localhost:10031/system/SysPoint/insertPoint"
// url: "http://127.0.0.1:10031/system/fileManage/addFile"
},
typeOptions: [
{ label: '作者', value: 'author' },
@ -217,6 +230,21 @@ export default {
this.getList();
},
methods: {
handleFileSuccess1(response, file, fileList) {
this.upload1.open = false;
this.upload1.isUploading = false;
this.$refs.upload1.clearFiles();
this.$message.success('导入补充文件成功');
this.getList()
},
handleFileUploadProgressRelation(event, file, fileList) {
this.upload1.isUploading = true;
this.upload1.oprnIno = true;
},
submitFileFormR() {
this.$refs.upload1.submit();
},
handleImportRelation() {
this.upload1.title = "导入文献";
this.upload1.open = true;

2
test3.csv

@ -1,4 +1,4 @@
序号,searchword1,searchword2,type,title,authors,degree,source,keywords,abstract,urls,HTML,CNKI(包库)
序号,main_keyword,sub_keyword,type,title,authors,degree,source,keywords,abstract,urls,HTML,CNKI(包库)
1,演化博弈推演决策模型,,[期刊] ,冷战早期美以核领域演化博弈分析,韩睿鼎(上海外国语大学),,情报杂志2023第42卷第7期P45-541002-1965,情报分析;演化博弈;核模糊策略;核计划;美国;以色列,...,尝试利用演化博弈方法对美国与以色列当时围绕以色列核计划所进行的博弈建立模型。通过建立演化博弈模型,讨论博弈的各种结局所需要的参数条件,说明以色列拥核的决策过程和方法路径。[研究结论]通过模型推演美以之间围绕以色列推进核计划所进行的互动博弈过程...,"[{'name': 'HTML', 'url': '/jour/detail_38502727e7500f26d27a6b5b84bbe6ec4a2a3346bb16b2531921b0a3ea255101fc1cf1fbb4666ae68f815271923e9d3cd3a6ecba9cb135f7a0eaa9e2785685673214444d68f9065f3211d6973862b019'}, {'name': 'PDF', 'url': '/goread?aid=51&dxid=100422017191&pkey=0&datatype=1&sid=43&ssid=&d=3aa235c6a83dcb194b26e048fea51c26f17116229ba5efcd0c970636fb62ed75a4149c91b1be13fe5d8ac889bc85a35d010401e17907d2575243079e5787b82a051ec08d49337bac9ba89988e21e2dce&sort=0&isjx=&magid=320910028670&date=2023&title=&sqnum=&flid=161&apistrclassfy=0_6_5'}, {'name': 'CNKI(包库)', 'url': '/goread?aid=51&dxid=100422017191&pkey=184454530&datatype=1&sid=24&ssid=&d=3aa235c6a83dcb194b26e048fea51c26f17116229ba5efcd0c970636fb62ed75a4149c91b1be13fe5d8ac889bc85a35da79424a086e7e86e865e22f1e192a5c2051ec08d49337bac9ba89988e21e2dce&sort=5&isjx=&magid=320910028670&date=2023&title=&sqnum=&flid=0&apistrclassfy=0_6_5'}, {'name': '维普', 'url': '/goread?aid=51&dxid=100422017191&pkey=184454530&datatype=1&sid=4&ssid=&d=3aa235c6a83dcb194b26e048fea51c26f17116229ba5efcd0c970636fb62ed75a4149c91b1be13fe5d8ac889bc85a35d010401e17907d25733682ed2721a5241082d4e5cee32e5e52605e31d74534edf&sort=0&isjx=&magid=320910028670&date=2023&title=&sqnum=&flid=0&apistrclassfy=0_6_5'}, {'name': '万方(包库)', 'url': '/goread?aid=51&dxid=100422017191&pkey=184454530&datatype=1&sid=3&ssid=&d=3aa235c6a83dcb194b26e048fea51c26f17116229ba5efcd0c970636fb62ed75a4149c91b1be13fe5d8ac889bc85a35da406837cdddcae7f33682ed2721a5241082d4e5cee32e5e52605e31d74534edf&sort=0&isjx=&magid=320910028670&date=2023&title=&sqnum=&flid=0&apistrclassfy=0_6_5'}, {'name': '国家哲学社会科学文献中心(包库)', 'url': '/goread?aid=51&dxid=100422017191&pkey=184454530&datatype=1&sid=82&ssid=&d=3aa235c6a83dcb194b26e048fea51c26f17116229ba5efcd0c970636fb62ed75a4149c91b1be13fe5d8ac889bc85a35d363ffb389c59116412d1af3abd7c6fb0051ec08d49337bac9ba89988e21e2dce&sort=0&isjx=&magid=320910028670&date=2023&title=&sqnum=&flid=0&apistrclassfy=0_6_5'}, {'name': '文献传递', 'url': '/gofirst?dxid=100422017191&datatype=1&d=3aa235c6a83dcb194b26e048fea51c26f17116229ba5efcd3684d4e6cef8e3c1795e9888e6f75c5ffad86a0672aedbac08a6b0d98637ba3d56ec78826dade8b3&magid=320910028670&year=2023&apistrclassfy=0_6_5'}]",https://fx.gfkd.chaoxing.com//jour/detail_38502727e7500f26d27a6b5b84bbe6ec4a2a3346bb16b2531921b0a3ea255101fc1cf1fbb4666ae68f815271923e9d3cd3a6ecba9cb135f7a0eaa9e2785685673214444d68f9065f3211d6973862b019,https://fx.gfkd.chaoxing.com//goread?aid=51&dxid=100422017191&pkey=184454530&datatype=1&sid=24&ssid=&d=3aa235c6a83dcb194b26e048fea51c26f17116229ba5efcd0c970636fb62ed75a4149c91b1be13fe5d8ac889bc85a35da79424a086e7e86e865e22f1e192a5c2051ec08d49337bac9ba89988e21e2dce&sort=5&isjx=&magid=320910028670&date=2023&title=&sqnum=&flid=0&apistrclassfy=0_6_5
2,演化博弈推演决策模型,,[期刊] ,有为政府监督助力企业债务纾困的演化博弈分析——基于中国式债委会帮扶视角,新夫,董萱,高闻婧(河海大学商学院),,金融经济学研究2025第40卷第4期P56-712097-1346,有为政府;债务纾困;中国式债委会;演化博弈;仿真分析,...,构建企业债务纾困的三方演化博弈模型,对不同条件下参与方的博弈行为进行情境推演,并就关键参数进行数值仿真分析......。研究表明:从制度环境来看,政商关系水平提高对政府和债委会决策的影响显著,但对企业策略选择的影响较小...,"[{'name': 'CNKI(包库)', 'url': '/goread?aid=51&dxid=100445648588&pkey=208085926&datatype=1&sid=24&ssid=&d=3aa235c6a83dcb19a750074062163750d89cf746904063450c970636fb62ed75a4149c91b1be13fe5d8ac889bc85a35da79424a086e7e86e865e22f1e192a5c2051ec08d49337bac9ba89988e21e2dce&sort=5&isjx=&magid=320910059698&date=2025&title=&sqnum=&flid=0&apistrclassfy=0_4_7'}, {'name': '文献传递', 'url': '/gofirst?dxid=100445648588&datatype=1&d=3aa235c6a83dcb19a750074062163750d89cf746904063453684d4e6cef8e3c1795e9888e6f75c5ffad86a0672aedbac08a6b0d98637ba3d56ec78826dade8b3&magid=320910059698&year=2025&apistrclassfy=0_4_7'}]",,https://fx.gfkd.chaoxing.com//goread?aid=51&dxid=100445648588&pkey=208085926&datatype=1&sid=24&ssid=&d=3aa235c6a83dcb19a750074062163750d89cf746904063450c970636fb62ed75a4149c91b1be13fe5d8ac889bc85a35da79424a086e7e86e865e22f1e192a5c2051ec08d49337bac9ba89988e21e2dce&sort=5&isjx=&magid=320910059698&date=2025&title=&sqnum=&flid=0&apistrclassfy=0_4_7
3,演化博弈推演决策模型,,[期刊] ,基于Markov演化博弈的网络防御策略选取方法,"张恒巍1,2,黄健明1(信息工程大学三院;信息保障技术重点实验室)",,电子学报2018第46卷第6期P1503-15090372-2112,网络安全;网络攻防;博弈论;有限理性;演化博弈;网络防御;Markov决策;多阶段最优防御,"...,从有限理性约束出发,将演化博弈模型与Markov决策相结合,构建多阶段Markov攻防演化博弈模型,实现对多阶段、多状态攻防对抗的动态分析推演;依据博弈的折扣总收益设计目标函数...","[{'name': 'HTML', 'url': '/jour/detail_38502727e7500f26af6fdc8275d20ef38931cda98c9499561921b0a3ea255101fc1cf1fbb4666ae68dc3bd464054ba9c3c14b05776ad024dc0eff657e821a65e1855bf5d2790c1dcfc9c087a243abfa3'}, {'name': 'PDF', 'url': '/goread?aid=51&dxid=100256548279&pkey=0&datatype=1&sid=43&ssid=&d=3aa235c6a83dcb19ed3eb585bfe9fd4933e06d1529986d880c970636fb62ed75a4149c91b1be13fe5d8ac889bc85a35d010401e17907d2575243079e5787b82a051ec08d49337bac9ba89988e21e2dce&sort=0&isjx=&magid=320910026429&date=2018&title=&sqnum=&flid=161&apistrclassfy=0_18_17'}, {'name': 'CNKI(包库)', 'url': '/goread?aid=51&dxid=100256548279&pkey=119164140&datatype=1&sid=24&ssid=&d=3aa235c6a83dcb19ed3eb585bfe9fd4933e06d1529986d880c970636fb62ed75a4149c91b1be13fe5d8ac889bc85a35da79424a086e7e86e865e22f1e192a5c2051ec08d49337bac9ba89988e21e2dce&sort=5&isjx=&magid=320910026429&date=2018&title=&sqnum=&flid=0&apistrclassfy=0_18_17'}, {'name': '维普', 'url': '/goread?aid=51&dxid=100256548279&pkey=119164140&datatype=1&sid=4&ssid=&d=3aa235c6a83dcb19ed3eb585bfe9fd4933e06d1529986d880c970636fb62ed75a4149c91b1be13fe5d8ac889bc85a35d010401e17907d25733682ed2721a5241082d4e5cee32e5e52605e31d74534edf&sort=0&isjx=&magid=320910026429&date=2018&title=&sqnum=&flid=0&apistrclassfy=0_18_17'}, {'name': '万方(包库)', 'url': '/goread?aid=51&dxid=100256548279&pkey=119164140&datatype=1&sid=3&ssid=&d=3aa235c6a83dcb19ed3eb585bfe9fd4933e06d1529986d880c970636fb62ed75a4149c91b1be13fe5d8ac889bc85a35da406837cdddcae7f33682ed2721a5241082d4e5cee32e5e52605e31d74534edf&sort=0&isjx=&magid=320910026429&date=2018&title=&sqnum=&flid=0&apistrclassfy=0_18_17'}, {'name': '文献传递', 'url': '/gofirst?dxid=100256548279&datatype=1&d=3aa235c6a83dcb19ed3eb585bfe9fd4933e06d1529986d883684d4e6cef8e3c1795e9888e6f75c5ffad86a0672aedbac08a6b0d98637ba3d56ec78826dade8b3&magid=320910026429&year=2018&apistrclassfy=0_18_17'}]",https://fx.gfkd.chaoxing.com//jour/detail_38502727e7500f26af6fdc8275d20ef38931cda98c9499561921b0a3ea255101fc1cf1fbb4666ae68dc3bd464054ba9c3c14b05776ad024dc0eff657e821a65e1855bf5d2790c1dcfc9c087a243abfa3,https://fx.gfkd.chaoxing.com//goread?aid=51&dxid=100256548279&pkey=119164140&datatype=1&sid=24&ssid=&d=3aa235c6a83dcb19ed3eb585bfe9fd4933e06d1529986d880c970636fb62ed75a4149c91b1be13fe5d8ac889bc85a35da79424a086e7e86e865e22f1e192a5c2051ec08d49337bac9ba89988e21e2dce&sort=5&isjx=&magid=320910026429&date=2018&title=&sqnum=&flid=0&apistrclassfy=0_18_17

Can't render this file because it is too large.
Loading…
Cancel
Save