From 3060c77529b79ceb28101b08c5680734d540f0e6 Mon Sep 17 00:00:00 2001 From: mno <718135749@qq.com> Date: Thu, 26 Feb 2026 18:22:50 +0800 Subject: [PATCH] =?UTF-8?q?js=EF=BC=9A=E9=94=84=E5=9C=B0=E4=B8=80=E6=9D=A1?= =?UTF-8?q?=E9=BE=992.5.0=20(#2934)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Create 搜索成功点击.png 补充模板图片 * 微调路线选择算法 修改后只有一个参数,且对结果影响更加平滑可控 --- repo/js/AutoHoeingOneDragon/README.md | 5 +- .../assets/搜索成功点击.png | Bin 0 -> 2628 bytes repo/js/AutoHoeingOneDragon/main.js | 102 +++++++++--------- repo/js/AutoHoeingOneDragon/manifest.json | 2 +- repo/js/AutoHoeingOneDragon/settings.json | 12 +-- 5 files changed, 54 insertions(+), 67 deletions(-) create mode 100644 repo/js/AutoHoeingOneDragon/assets/搜索成功点击.png diff --git a/repo/js/AutoHoeingOneDragon/README.md b/repo/js/AutoHoeingOneDragon/README.md index a4ffc0630..bca22ce7a 100644 --- a/repo/js/AutoHoeingOneDragon/README.md +++ b/repo/js/AutoHoeingOneDragon/README.md @@ -24,7 +24,7 @@ ### 一、**快速使用指南 ✅** 1. 添加脚本 -在 BGI 配置组中点击 +添加 → 选择 “锄地一条龙”脚本。不要直接运行js。 +在 BGI 配置组中点击 +添加 → 选择 “锄地一条龙”脚本。不要直接在调度器外运行。 2. 配置组设置(⚙️) - ⚠️ 关键设置,请务必检查! @@ -160,8 +160,7 @@ - - 环境伤害 :路线处于雪山或挪德卡莱苦壑崖区域,环境伤害会持续扣血 - - 分组逻辑:不含路径组1排除标签和任何其他组标签的路径会进入路径组1,剩余路径若含有路径组x的标签之一,则会进入路径组x - - 新增支持自定义标签,将会尝试将未知的标签通过文件路径,description匹配,含有对应关键词的路线即视为含有这些标签 - - **路线效率计算权重:** 影响js评估路线价值,计算公式如下,权重越大越看重总收益 - - $$ 怪均^k \times 秒均 $$ + - **摩拉/耗时权衡因数:** 影响js评估路线价值,含义为为了多赚1摩拉愿意多花多少秒 - **自动优化:** js将根据运行记录调整每条路线的预期运行时间,具体逻辑为,至多7条记录,去除一个最大值、一个最小值后,每条记录占据20%的权重,剩余权重由默认数据填充。如果你不想要这个功能,请禁用。 - **目标数量:** 选取路线目标达到的精英怪数量,默认为400,同理小怪数量默认为2000 - **优先关键词:** 含有关键词的路线会被视为拥有最高效率,例如填写600来让所有600怪物优先考虑,填写骗骗花来优先考虑骗骗花 diff --git a/repo/js/AutoHoeingOneDragon/assets/搜索成功点击.png b/repo/js/AutoHoeingOneDragon/assets/搜索成功点击.png new file mode 100644 index 0000000000000000000000000000000000000000..89ba2bc86ccb64be3293603e9ebdd38d52be88e5 GIT binary patch literal 2628 zcmV-K3cK}*P) ziBl747QpA9kw`*-bcb*$>CQnS_a#Ci0|*2buh$z~5jU_BK*$CPk!Z}coRU9o-!Yj? z>+9xBrOJN0 z&1SP!Ez`)}s1_%c((${uuMZ6Ll~;YnPZO}i4+k?NU6CEK?gwFZG=J>LGrM1!j7FnD ztzLdLJ2iUu*7c@S%?H@gL@MM7(A_25W+i|yiN?yxFMsuV#$x-J&E{3TTB~^bdh)?v zFAQf0j)TD*ckwyu*)}VQ#uOA(yq=jw@4InrO`}*;Elu6~*Uy5SB3kevBH&J2y2Q$k z=FiT}qtj@8-KowiP{g&Le?vhH2EA4>Klkckbxj>5h)dW_b8ef}1Axwo`t=3_ zf*{twq?9V9<27~lWPdh+0{>sJ(&PAo=M$5*#A(rMmGXrNu~6&3MOqF@nqQD^c&c{g(f!|(Qv_syfz3(;Ay)X2oPvszjcu)+J;I(rao_N{p24=R z-umW_{L-4R*rQ|`!%0w2fR4|)j}jv69YR6PW|LAnJ~$wu1mal5CxDflmRsN4A?h9K z?jLzy#FF9WHc@VIHQ;pOz+okTuy*6_`#82b zc0`h}djK6iCg~W7ic@w4F{04U=X!_u$8eP6_<*>7#AsVc8FVW7!bC(Y51TbKDp@4i z2&m3X7w`ZVW$o@CNzE$6R*u8kKk@~-G&Qbj!k&TTv|McEPO}=+@`Z^2C>&c|2q&)bbQd~&PC+FlC=|OtFFgDAq)%nxIi!18T;X6hBbWS`*9PkNXS#z5$1J^XRLEHpv zd=s}FAlFA0LWFv)E*PjUqjRk@^WEz7+g}wY>-@wp= z?AU^`llDHRT7{e_oLP$>Uyo)L$`wikK~yTGa%uYf`9WM(5*3b2NNqYJv==U&qW-@W zR>me}aAWw9hf|N`l(e*q>}R|CM_SrN(TV9k0qiaBfPF+9yTai|q>Ib865FVj&pjT! zW&bBe!`q*gn38>}RcJ3z(0h&X-E>BnCMb$XNCkpE_-p}()zgo8Z*&Z;U6iuLmA5ar zQ8<|py#{Z8X5``2(#nRecd20$sHk_Sy8cXAb))0&ZC$-7nFYRqRs+9pV;oij05!D= zQC5vwDVv+TaDE8GqK>CXR5*wc70=5mJW<=!D(tkyU19gYsa9c0WkYgWF2qeZz=|oZ zsCUF|?~;6)RY;~WN$)*h!ea&DAXYS*W)TEYF3&s}y%`c3NWZ1)s9 zGRcbTus&;P7j07F6e|IQa!Wp2k;yF z!!IhYEv;&ZKC;D9*;!Ts2y^37q>D=kf>oZ4$=| zCQ(25+-V!E1OPf-c2cXgmInxe81x#|($uXRS7HvQc!D@}s-4x9hO?~b>l*|BI^Ef$ zR$EtKD6U5K`t~1xPZt~~`!R^1+qMR_yrk{1dH@jRz#&oJFdD+v*Vk7KI<0*6)%abp zSQNtEMvmB$2K&ctvwHe5frDWezPyCuqK^(#D(mCeJ2$UpWM=vXhVBO#1PZ(#fIUH* zxM>Gr+pMTF_ylvs{pXigWcEEHty->C%qkZre!P4!zxV_vDwz_*AyOGu-2W}B2LKUi z%$%aC(MM0v4H;W-&}-FlonlV0Ffn@P#`%$flXdlJnYm%HyaTK#ASl$!&suBmSaxVv z55T%#ydQ+<+{0ggdl_Aqqv6bKHm{paI<;K2^lJI-(}n3rGm{UdC+@v`c4zY6f4U+& zXMOi#7u|zG&nv09H#(+p*z80D#oC%dqmrrQ3o6;1T0X0FOzd6jDEHV%P0000 { p.selected = false; - const G1 = p.mora_e + p.mora_m, G2 = p.mora_m; - p.G1 = G1; p.G2 = G2; - /* 收益 */ - const eliteGain = p.e === 0 ? 200 : (G1 - G2) / p.e; - const normalGain = p.m === 0 ? 40.5 : G2 / p.m; + if (p.e !== 0) { + p.E1 = (efficiencyIndex * p.mora_e - p.t) / p.e; + } else { + p.E1 = null; + } - p.E1 = (eliteGain ** k1) * (G1 / p.t); - if (p.e === 0) p.E1 = 0; + if (p.m !== 0) { + p.E2 = (efficiencyIndex * p.mora_m - p.t) / p.m; + } else { + p.E2 = null; + } - p.E2 = (normalGain ** k2) * (G2 / p.t); - - maxE1 = Math.max(maxE1, p.E1); - maxE2 = Math.max(maxE2, p.E2); + if (p.e !== 0) maxE1 = Math.max(maxE1, p.E1); + if (p.m !== 0) maxE2 = Math.max(maxE2, p.E2); + if (p.e !== 0) minE1 = Math.min(minE1, p.E1 ?? Infinity); + if (p.m !== 0) minE2 = Math.min(minE2, p.E2 ?? Infinity); }); pathings.forEach(p => { - if (p.prioritized) { p.E1 += maxE1; p.E2 += maxE2; } + if (p.e === 0) { + p.E1 = minE1 - 1; + } + if (p.m === 0) { + p.E2 = minE2 - 1; + } + if (p.prioritized) { + p.E1 += (maxE1 - minE1 + 2); + p.E2 += (maxE2 - minE2 + 2); + } }); /* ========== 1. 原两轮选择逻辑照搬,只是去掉“提前 break” ========== */ @@ -529,12 +538,12 @@ async function findBestRouteGroups(pathings, k1, k2, targetEliteNum, targetMonst pathings.sort((a, b) => b.E1 - a.E1); for (const p of pathings) { - if (p.E1 > 0 && p.available && + if (p.e > 0 && p.available && (totalSelectedElites + p.e <= targetEliteNum + 2)) { // 留一点余量 p.selected = true; totalSelectedElites += p.e; totalSelectedMonsters += p.m; - totalGainCombined += p.G1; + totalGainCombined += p.mora_e + p.mora_m; totalTimeCombined += p.t; } } @@ -544,12 +553,12 @@ async function findBestRouteGroups(pathings, k1, k2, targetEliteNum, targetMonst monsterRouteElite = 0; pathings.sort((a, b) => b.E2 - a.E2); for (const p of pathings) { - if (p.E2 > 0 && p.available && !p.selected && + if (p.m > 0 && p.available && !p.selected && (totalSelectedMonsters + p.m < targetMonsterNum + 5)) { p.selected = true; totalSelectedElites += p.e; monsterRouteElite += p.e; totalSelectedMonsters += p.m; - totalGainCombined += p.G2; + totalGainCombined += p.mora_m; totalTimeCombined += p.t; } } @@ -576,22 +585,14 @@ async function findBestRouteGroups(pathings, k1, k2, targetEliteNum, targetMonst } /* ========== 3. 最小不可再减集合(贪心逆筛,不碰优先路线) ========== */ - // 1. 只留非优先的已选路线,按性价比升序排 + // 1. 只留非优先的已选路线,按E1升序、E2升序排(差的先删) const selectedList = pathings .filter(p => p.selected && !p.prioritized && !p.tags.includes('精英高收益') ) - .sort((a, b) => { - const score = p => { - const eliteGain = p.e === 0 ? 200 : (p.G1 - p.G2) / p.e; - const normalGain = p.m === 0 ? 40.5 : p.G2 / p.m; - const perSec = p.t === 0 ? 0 : p.G1 / p.t; - return ((eliteGain / 200) ** k1 + (normalGain / 40.5) ** k2) * perSec; - }; - return score(a) - score(b); // 升序:差的先删 - }); + .sort((a, b) => a.E1 - b.E1 || a.E2 - b.E2); // 2. 试删 for (const p of selectedList) { @@ -602,7 +603,7 @@ async function findBestRouteGroups(pathings, k1, k2, targetEliteNum, targetMonst p.selected = false; totalSelectedElites = newE; totalSelectedMonsters = newM; - totalGainCombined -= p.G1; + totalGainCombined -= p.mora_e + p.mora_m; totalTimeCombined -= p.t; } } @@ -802,7 +803,7 @@ async function validateTeamAndConfig() { /** * 调试-分组汇总打印 - * 仅统计 group=1..10 且 selected 的路线,累加精英数、小怪数、总收益(G1)与总时长 + * 仅统计 group=1..10 且 selected 的路线,累加精英数、小怪数、总收益与总时长 * 输出每组的路线条数、精英/小怪数量、预计收益(摩拉)与预计用时(时:分:秒) * 用于“调试路线分配”模式快速核对各组工作量 * 将汇总结果写入 调试结果/路线分配结果.txt 文件 @@ -833,7 +834,7 @@ async function printGroupSummary() { for (const p of groupPath) { elites += p.e || 0; monsters += p.m || 0; - gain += p.G1 || 0; + gain += p.mora_e + p.mora_m || 0; time += p.t || 0; ignoredElites += (p.original_e || 0) - (p.e || 0); } @@ -896,8 +897,7 @@ async function printGroupSummary() { // 其他配置信息 resultText += "配置参数:\n"; - resultText += ` 精英效率指数: ${settings.eEfficiencyIndex || 2.5}\n`; - resultText += ` 小怪效率指数: ${settings.mEfficiencyIndex || 0.5}\n`; + resultText += ` 摩拉/耗时权衡因数: ${settings.efficiencyIndex || 2.5}\n`; resultText += ` 好奇系数: ${settings.curiosityFactor || 0}\n`; resultText += ` 忽略比例: ${settings.ignoreRate || 0}\n`; resultText += ` 目标精英数: ${settings.targetEliteNum || 400}\n`; @@ -1616,7 +1616,7 @@ async function processPathingsByGroup(pathings, accountName) { if (pathing.group === targetGroup) { totalElites += pathing.e || 0; // 精英怪数量 totalMonsters += pathing.m || 0; // 小怪数量 - totalGain += pathing.G1 || 0; // 收益 + totalGain += pathing.mora_e + pathing.mora_m || 0; // 收益 totalEstimatedTime += pathing.t || 0; // 预计时间 } } @@ -1638,13 +1638,7 @@ async function processPathingsByGroup(pathings, accountName) { const groupStartTime = new Date(); let remainingEstimatedTime = totalEstimatedTime; let skippedTime = 0; - //移除不必要的属性 - { - const keysToDelete = ['monsterInfo', 'mora_m', 'mora_e', 'available', 'prioritized', 'G1', 'G2', 'index', 'folderPathArray', 'E1', 'E2']; // 删除的字段列表 - pathings.forEach(p => { - keysToDelete.forEach(k => delete p[k]); - }); - } + // 遍历 pathings 数组 for (const pathing of pathings) { // 检查路径是否属于指定的组 diff --git a/repo/js/AutoHoeingOneDragon/manifest.json b/repo/js/AutoHoeingOneDragon/manifest.json index 81801c78b..78ffa00b8 100644 --- a/repo/js/AutoHoeingOneDragon/manifest.json +++ b/repo/js/AutoHoeingOneDragon/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "锄地一条龙", - "version": "2.4.0", + "version": "2.5.0", "description": "一站式解决自动化锄地,支持只拾取狗粮,请仔细阅读README.md后使用", "authors": [ { diff --git a/repo/js/AutoHoeingOneDragon/settings.json b/repo/js/AutoHoeingOneDragon/settings.json index eaa71391d..f34353c8a 100644 --- a/repo/js/AutoHoeingOneDragon/settings.json +++ b/repo/js/AutoHoeingOneDragon/settings.json @@ -149,16 +149,10 @@ "label": "勾选后禁用根据运行记录优化路线选择的功能\n完全使用路线原有信息\n【注意】启用该选项将导致无法根据个人运行清空自动优化路线选择" }, { - "name": "eEfficiencyIndex", + "name": "efficiencyIndex", "type": "input-text", - "label": "精英计算权重,填0以上的数字\n越大越倾向于花费较多时间提高总收益", - "default": "2.5" - }, - { - "name": "mEfficiencyIndex", - "type": "input-text", - "label": "小怪计算权重,填0以上的数字\n越大越倾向于花费较多时间提高总收益", - "default": "0.5" + "label": "摩拉/耗时权衡因数,填0及以上的数字\n越大越倾向于花费较多时间提高总收益\n含义为愿意为1摩拉多花多少秒", + "default": "0.25" }, { "name": "curiosityFactor",