编程艺术之美,代码也玩穿越

在印刷行业信息化实践中,总是能遇到各种极富挑战性的需求,将我们推向疯癫的边缘。

最近要求实现版位预估算法,按照实际的组版规则进行计算。接过分析建模,抽象出如下的算法模型:

   /*

    *计算是否存在值X1,X2,...,Xm,使等式成立 m*X1+(m-1)*X2+(m-3)*X3+...+Xm=E

    *如果可解,取解集中各X的值,要求X1尽可能大,其次是X2,...Xm,X确定情况下存在多解,则E取最大

    *已知条件:

    *1)其中E为36,32,23,18中的一个数字

    *2)m,X1,X2,...,Xm为零或正整数

    *3)m的值已知

    *4)X1,X2,...,Xm的最大值已知

    *

    * 求解思路:

    * 将以上算法抽象成m*X1=E-Y1,Y1=(m-1)*X2+(m-3)*X3+...+Xm,

    * 然后对X1和Y1进行求解,对Y1的求解转化为(m-1)*X2=Y1-Y2,Y2=(m-3)*X3+...+Xm,以此类推

    * 最终在Yn为0时,得出解

    * 如果不存在Yn=0,则解不存在

*/

 代码如下:

/// <summary>
/// 基于不同盒数组合的版位预估算法
/// </summary>
/// <param name="templist">盒数以及个数的组合链表,存放m以及对应的X的最大值</param>
/// <param name="retInfo">符合组版条件的求解结果,格式如 |m_index,m,x</param>
/// <param name="E">版面要求的位置数</param>
/// <param name="m_index">templist的当前索引</param>
/// <param name="xmax_index">templist中X最大值存放的位置索引</param>
/// <param name="info">解的传递传递过程信息。格式如 |m_index,m,x</param>
/// <returns>如果返回值为true则取得解,返回false,则中止本次循环</returns>
private bool PB_Through(ArrayList templist, ref StringBuilder retInfo, int E, int m_index, int xmax_index, string info)
{
//先计算是否存在X=(E-Y)/m,即Y=E-m*X
//实际中不会存在m>E的情况,因为在m=E的时候就已经被解决掉了
//以下算法带着templist,retlist 在算法梦境中玩穿越,看仔细了
//write by chenrl 2011.5.23

int m = ((int[])templist[m_index])[0];
int xmax = ((int[])templist[m_index])[xmax_index];
//允许中间的Xn等于0
for (int x = E / m; (x >= 0) && (x <= xmax); x--) //for语句中 用到2个判断条件,还真是第一次-_-
{
//提取各梦境x的值?或者考虑如何将本次梦境的X值带入到下个梦境?
// 该x的存储以及传递必须是值传递,在求解后能对templist中的X最大值进行更改
// 此处考虑用字符串,每次穿越后,追加 "|"+"m_index"+","+m+","+x

StringBuilder sinfo
= new StringBuilder();//如果需要变动,则将变动的X值以及当前位置索引写入到info
sinfo.Append(info);
sinfo.Append(
"|");
sinfo.Append(m_index);
sinfo.Append(
",");
sinfo.Append(m);
sinfo.Append(
",");
sinfo.Append(x);

int y = E - (m * x);
if (y == 0)//梦境中解决问题,处理后返回现实
{
//各m,X的值都已经在sinfo中,完成穿越
#region 以下代码丰收穿越结果,操作templist,将解带回到现实
//将组合结果写入到retInfo
retInfo = sinfo; //StringBuilder类似属于引用传递
//更新更新templist中的X最大值
string[] infos = sinfo.ToString().TrimStart('|').Split('|');
foreach (string str in infos)
{
((
int[])templist[int.Parse(str[0].ToString())])[xmax_index] -= int.Parse(str[2].ToString());
}
#endregion 以下代码丰收穿越结果,操作templist,将解带回到现实
return true;
}
else //当前梦境中无法解决问题,继续产生新的梦境,进行穿越
{
//穿越前判断是否是最后一个梦境
if(m_index<(templist.Count-1))
{
return PB_Through(templist,ref retInfo, E, m_index + 1, xmax_index, info);
}
}
}
return false;
}

不过这区区50行代码,却默默体现了代码算法之美。

回顾设计,从组版算法分析->流程图描述->算法建模->算法实现,我觉一路走来不容易。循环计算的问题,最终还是要回到递归中来。每个递归其实就是一个梦境,程序员设计的梦境,每个程序员都是造梦师。

【SCI复现】含可再生能源与储能的区域微电网最优运行:应对不确定性的解鲁棒性与非预见性研究(Matlab代码实现)内容概要:本文围绕含可再生能源与储能的区域微电网最优运行展开研究,重点探讨应对不确定性的解鲁棒性与非预见性策略,通过Matlab代码实现SCI论文复现。研究涵盖多阶段鲁棒调度模型、机会约束规划、需求响应机制及储能系统优化配置,结合风电、光伏等可再生能源出力的不确定性建模,提出兼顾系统经济性与鲁棒性的优化运行方案。文中详细展示了模型构建、算法设计(如C&CG算法、大M法)及仿真验证全过程,适用于微电网能量管理、电力系统优化调度等领域的科研与工程实践。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事微电网、能源管理相关工作的工程技术人员。; 使用场景及目标:①复现SCI级微电网鲁棒优化研究成果,掌握应对风光负荷不确定性的建模与求解方法;②深入理解两阶段鲁棒优化、分布鲁棒优化、机会约束规划等先进优化方法在能源系统中的实际应用;③为撰写高水平学术论文或开展相关课题研究提供代码参考和技术支持。; 阅读建议:建议读者结合文档提供的Matlab代码逐模块学习,重点关注不确定性建模、鲁棒优化模型构建与求解流程,并尝试在不同场景下调试与扩展代码,以深化对微电网优化运行机制的理解。
个人防护装备实例分割数据集 一、基础信息 数据集名称:个人防护装备实例分割数据集 图片数量: 训练集:4,524张图片 分类类别: - Gloves(手套):工作人员佩戴的手部防护装备。 - Helmet(安全帽):头部防护装备。 - No-Gloves(未戴手套):未佩戴手部防护的状态。 - No-Helmet(未戴安全帽):未佩戴头部防护的状态。 - No-Shoes(未穿安全鞋):未佩戴足部防护的状态。 - No-Vest(未穿安全背心):未佩戴身体防护的状态。 - Shoes(安全鞋):足部防护装备。 - Vest(安全背心):身体防护装备。 标注格式:YOLO格式,包含实例分割的多边形坐标和类别标签,适用于实例分割任务。 数据格式:来源于实际场景图像,适用于计算机视觉模型训练。 二、适用场景 工作场所安全监控系统开发:数据集支持实例分割任务,帮助构建能够自动识别工作人员个人防护装备穿戴状态的AI模型,提升工作环境安全性。 建筑与工业安全检查:集成至监控系统,实时检测PPE穿戴情况,预防安全事故,确保合规性。 学术研究与创新:支持计算机视觉在职业安全领域的应用研究,促进AI与安全工程的结合。 培训与教育:可用于安全培训课程,演示PPE识别技术,增强员工安全意识。 三、数据集优势 精准标注与多样性:每个实例均用多边形精确标注,确保分割边界准确;覆盖多种PPE物品及未穿戴状态,增加模型鲁棒性。 场景丰富:数据来源于多样环境,提升模型在不同场景下的泛化能力。 任务适配性强:标注兼容主流深度学习框架(如YOLO),可直接用于实例分割模型开发,支持目标检测和分割任务。 实用价值高:专注于工作场所安全,为自动化的PPE检测提供可靠数据支撑,有助于减少工伤事故。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值