From 11378380b4312e40d1119d9b195f82c2817378f7 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Sat, 22 Mar 2025 18:17:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=8D=E5=8F=AF=E8=BE=BE=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E6=83=A9=E7=BD=9A=20&=20=E5=90=88=E5=B9=B6=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/package.json | 1 + data/src/merge.ts | 15 +++++++++++++++ data/src/minamo.ts | 19 +++++++++++++------ data/src/topology/similarity.ts | 5 ++++- data/src/utils.ts | 2 +- 5 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 data/src/merge.ts diff --git a/data/package.json b/data/package.json index 5b428c0..429cd1d 100644 --- a/data/package.json +++ b/data/package.json @@ -6,6 +6,7 @@ "scripts": { "ginka": "tsx ./src/ginka.ts", "minamo": "tsx ./src/minamo.ts", + "merge": "tsx ./src/merge.ts", "test:topo": "tsx ./src/topology/test.ts", "test:vision": "tsx ./src/vision/test.ts" }, diff --git a/data/src/merge.ts b/data/src/merge.ts new file mode 100644 index 0000000..b9f649c --- /dev/null +++ b/data/src/merge.ts @@ -0,0 +1,15 @@ +import { readFile, writeFile } from 'fs-extra'; +import { DatasetMergable, mergeDataset } from './utils'; + +const [output, ...datasets] = process.argv.slice(2); + +(async () => { + const data = await Promise.all( + datasets.map(async v => { + const file = await readFile(v, 'utf-8'); + return JSON.parse(file) as DatasetMergable; + }) + ); + const merged = mergeDataset(...data); + await writeFile(output, JSON.stringify(merged), 'utf-8'); +})(); diff --git a/data/src/minamo.ts b/data/src/minamo.ts index 7933b63..d96bc52 100644 --- a/data/src/minamo.ts +++ b/data/src/minamo.ts @@ -6,7 +6,6 @@ import { directions, tileType } from './topology/graph'; import { calculateVisualSimilarity } from './vision/similarity'; import { BaseConfig } from './types'; import { Presets, SingleBar } from 'cli-progress'; -import { log } from 'console'; interface MinamoConfig extends BaseConfig {} @@ -25,9 +24,16 @@ interface MinamoDataset { const [output, ...list] = process.argv.slice(2); // 判断 assigned 模式,此模式下只会对前两个塔处理,会在这两个塔之间对比,而单个塔的地图不会对比 -const assigned = list.at(-1) === 'assigned'; +const assigned = list.at(-1)?.startsWith('assigned'); +const assignedCount = parseAssigned(list.at(-1)!); if (assigned) list.pop(); +function parseAssigned(arg: string): [number, number] { + const p = arg.slice(9); + const [a, b] = p.split(':'); + return [parseInt(a) || 100, parseInt(b) || 100]; +} + function chooseFrom(arr: T[], n: number): T[] { const copy = arr.slice(); for (let i = copy.length - 1; i > 0; i--) { @@ -323,12 +329,13 @@ function parseAllData(data: Map): MinamoDataset { function generateAssignedData( data1: Map, - data2: Map + data2: Map, + count: [number, number] ): MinamoDataset { const length = data1.size + data2.size; const totalCount = data1.size * data2.size; - const count1 = Math.min(100, data1.size); - const count2 = Math.min(100, data2.size); + const count1 = Math.min(count[0], data1.size); + const count2 = Math.min(count[1], data2.size); const keys1 = [...data1.keys()]; const keys2 = [...data2.keys()]; const choose1 = chooseFrom(keys1, count1); @@ -388,7 +395,7 @@ function generateAssignedData( } const data1 = await readOne(tower1); const data2 = await readOne(tower2); - const results = generateAssignedData(data1, data2); + const results = generateAssignedData(data1, data2, assignedCount); await writeFile(output, JSON.stringify(results, void 0), 'utf-8'); const size = Object.keys(results.data).length; console.log(`✅ 已处理 ${list.length} 个塔,共 ${size} 个组合`); diff --git a/data/src/topology/similarity.ts b/data/src/topology/similarity.ts index 94c2c84..83f943d 100644 --- a/data/src/topology/similarity.ts +++ b/data/src/topology/similarity.ts @@ -166,6 +166,9 @@ export function overallSimilarity( if (maxGraph) comparedGraph.add(maxGraph); }); + // 不可达区域惩罚 + const reduction = + 1 / (1 + Math.abs(a.unreachable.size - b.unreachable.size)); // 取根号使结果更接近线性 - return Math.sqrt(totalSimilarity / graphsA.length); + return Math.sqrt(totalSimilarity / graphsA.length) * reduction; } diff --git a/data/src/utils.ts b/data/src/utils.ts index 9d70db9..9aa6276 100644 --- a/data/src/utils.ts +++ b/data/src/utils.ts @@ -3,7 +3,7 @@ import { join } from 'path'; import { BaseConfig, TowerInfo } from './types'; import { convertApeiriaMap, convertFloor } from './floor'; -interface DatasetMergable { +export interface DatasetMergable { datasetId: number; data: Record; }