工作区智能体动作降序容量分箱规划器:边界规则、可运行源码与验收
项目编号:20261022-007。公开热点仅提供需求方向;代码、测试和合成示例均独立编写。
目标与实际范围
用first-fit decreasing启发式将整数工作量放入容量箱,报告剩余容量和超限条目,不宣称最优解。这个项目解决一个明确的本地导出预检问题,不连接任何热点产品账户,也不将演示输入包装成真实生产记录。规划工具最容易被误解为执行工具:输出一个排布或名单,不代表真实任务已经开始、请求已经发送或部署已经完成。本文把这种边界写在返回结果、README和页面中,使使用者能从同一套输入得到同一份可复核报告。
输入契约
工作量为非负安全整数,capacity为正安全整数。先按工作量降序、id升序处理;超大项单独列出,0仍是合法条目。单位见字段名,不能混用KiB和MiB。
{"id":"string","effortUnits":"number"}每条记录需要唯一且非空的id。数字只接受非负安全整数,不把文本数字偷偷转换为数值;数组字段也会检查元素类型和重复项。输入上限1000条,是浏览器交互的保护边界,不是经过生产压测的性能承诺。实际使用时应先脱敏并最小化字段,不要将密钥、账号、联系方式或完整生产日志粘入示例工具。
可复现示例
{"capacity":10,"records":[{"id":"a","effortUnits":6},{"id":"b","effortUnits":4},{"id":"c","effortUnits":4}]}实际运行结果如下,样本刻意保留可手工计算的小数字,便于复核而不是制造复杂度:
{"algorithm":"first-fit-decreasing","capacity":10,"bins":[{"ids":["a","b"],"used":10,"remaining":0},{"ids":["c"],"used":4,"remaining":6}],"oversize":[],"note":"启发式规划,不保证箱数最优;没有执行实际部署。"}实现原理
工作量为非负安全整数,capacity为正安全整数。先按工作量降序、id升序处理;超大项单独列出,0仍是合法条目。单位见字段名,不能混用KiB和MiB。 validate阶段先建立输入契约,analyze阶段只实现本项目的一种算法,页面和Node.js报告脚本共用同一个ES模块。记录会复制后按id排序,不修改调用者数组;需要工作量或余数排序时也显式定义并列规则。因此输入记录换序不会改变结论,便于审阅版本差异和复现测试。下面给出实际包内核心实现,而不是与功能描述无关的占位代码。
exportconstMETA={"id":"20261022-007","title":"工作区智能体动作降序容量分箱规划器","focus":"用first-fit decreasing启发式将整数工作量放入容量箱,报告剩余容量和超限条目,不宣称最优解"};exportconstCFG={"kind":"bins","amount":"effortUnits","deps":"requiresActions","weight":"priorityWeight","label":"actionLabel"};exportconstSCHEMA={"id":"string","effortUnits":"number"};exportconstSAMPLE={"capacity":10,"records":[{"id":"a","effortUnits":6},{"id":"b","effortUnits":4},{"id":"c","effortUnits":4}]};functionvalidated(input){if(!input||typeofinput!=='object'||Array.isArray(input)||!Array.isArray(input.records)||input.records.length>1000)thrownewTypeError('必须提供records数组,最多1000条');constseen=newSet();returninput.records.map(r=>{if(!r||typeofr!=='object'||Array.isArray(r))thrownewTypeError('记录必须为对象');for(const[key,type]ofObject.entries(SCHEMA)){constv=r[key];if(type==='strings'){if(!Array.isArray(v)||v.some(x=>typeofx!=='string'||!x.trim())||newSet(v).size!==v.length)thrownewTypeError('唯一字符串数组字段错误:'+key);}elseif(typeofv!==type||(type==='string'&&!v.trim())||(type==='number'&&(!Number.isSafeInteger(v)||v<0)))thrownewTypeError('字段错误:'+key);}if(seen.has(r.id))thrownewRangeError('重复id:'+r.id);seen.add(r.id);returnr;}).slice().sort((a,b)=>a.id.localeCompare(b.id));}exportfunctionanalyze(input){constrows=validated(input);if(!Number.isSafeInteger(input.capacity)||input.capacity<=0)thrownewRangeError('capacity必须为正安全整数');constordered=rows.slice().sort((a,b)=>b[CFG.amount]-a[CFG.amount]||a.id.localeCompare(b.id)),bins=[],oversize=[];for(constrofordered){constsize=r[CFG.amount];if(size>input.capacity){oversize.push(r.id);continue;}letb=bins.find(x=>x.remaining>=size);if(!b){b={ids:[],used:0,remaining:input.capacity};bins.push(b);}b.ids.push(r.id);b.used+=size;b.remaining-=size;}return{algorithm:'first-fit-decreasing',capacity:input.capacity,bins,oversize:oversize.sort(),note:'启发式规划,不保证箱数最优;没有执行实际部署。'};}运行方法与真实测试
环境为Node.js 18+,没有第三方运行依赖。进入project目录后运行npm test,测试实际由node --test执行;npm run report会生成dist/report.json与dist/report.html。使用python3 -m http.server 8080启动本地静态服务,然后在浏览器访问http://localhost:8080并点击“运行分析”。不建议直接双击HTML,因为file协议下的ES模块可能受到浏览器限制。
本次实际执行8项测试通过,覆盖具体结果与边界、错误顶层、缺失字段、字段类型、重复标识、输入不可变和记录换序后结果一致。边界测试针对当前算法而写:不是只检查函数能否返回对象。docs/测试输出.txt保存真实命令输出,test/保存断言源码;测试通过仅代表这些合成场景被验证,不能声称所有生产输入都已验收。
浏览器截图与核验
浏览器打开本地项目并点击“运行分析”后,结果与Node.js报告逐项比对,再保存screenshots/运行效果.jpg。画面包含项目编号、输入和实际结果,不是绘制的摘要图,也不使用第三方官方截图。browser-evidence.json保存捕获时刻、源码SHA-256和截图SHA-256;源码或样本改变后必须重新执行并捕获,不能继续使用旧图为新版本背书。
限制和扩展方向
本工具只是脱敏JSON的离线规划或核验,不会联网、发消息、执行支付、控制账号、修改实验分配或部署生产服务。依赖分层不能把所有剩余项都误报为环;启发式分箱不保证最少箱数;重试时间轴不含网络耗时且不带随机抖动;名额分配取决于调用者给出的人工权重;稳定哈希抽样不是密码学随机、匿名化或安全隔离。不同用途不能把结果直接套成官方标准。
输入规模最多1000条,算法和排序都在内存中执行,未提供流式处理或并行执行。公开部署前仍需要设计访问控制、数据保留和资源配额。界面用textContent显示分析结果,离线HTML报告会转义特殊字符,但这并非完整安全审计。扩展CSV导入、可配置字段或新的算法时,应先补一个会失败的反例,再增加实现,保证文档与真实代码同步。
配套资源与授权
原创源码资源正在独立提交或审核;通过后核验官方公开URL再回填,当前不虚构下载地址。资源包含README、MIT LICENSE、原创授权声明、合成样本、8项自动化测试、离线报告和真实浏览器截图。未复制热点产品源码、模型权重、品牌素材或官方截图。
标签:JavaScript、JSON、容量规划