在号码池取连续号码的算法

最近项目中需要提供一个选号接口,在一批号码中检索出一批连续的号码供选则。

实现算法如下:

import java.util.*;

public class SerialNum {

 /**
  * 在号码列表中检索出一批连续的号码
  * @param inNum 号码列表
  * @param serialCount 连续的号码个数
  * @return 符合条件的连续的号码
  */
 public List getSerialNum(List inNum,int serialCount)
 {
  int retListCount=inNum.size();//符合条件号码总数
  int serCount=serialCount;     //连续号码数
  List seriesNumList=new ArrayList();//连续的号码列表
  long preNum=0;  //前一个号码
  int serIndex=0; //号段前索引
  int serToIndex=0;//号码段后索引
  /*取一段连续的号码*/
  while(serIndex+serCount<=retListCount)
  {
   serToIndex=serIndex+serCount;
            /*取一段号码*/
   seriesNumList=getSubList(inNum,serIndex,serToIndex);
   for(int i=0;i<serCount;i++)
   {
    long curNum=Long.parseLong(seriesNumList.get(i).toString());//当前号码
    if(i!=0)
    {
     if(curNum-preNum!=1)
     {
      serIndex+=i;
      seriesNumList.clear();
      break;
     }
    }
    preNum=curNum;
    if(i==serCount-1)
    {
     return seriesNumList;
    }
   }

  }
  return seriesNumList;
 }
 /**
  * 从一个列表中取一段列表
  * @param inList 列表
  * @param fromIndex 起始索引
  * @param toIndex 终止索引
  * @return 在列表中起始索引至终止索引的一段列表
  */
 public List getSubList(List inList,int fromIndex,int toIndex)
 {
  List subList=new ArrayList();
  int size=inList.size();
  if(toIndex<=size&&(toIndex-fromIndex)<=size)
  {
      for(int i=fromIndex;i<toIndex;i++)
      {
       subList.add(inList.get(i));
      }
  }
  return subList;
 }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  List inNumList=new ArrayList();
  inNumList.add("4560000");
  inNumList.add("4560002");
  inNumList.add("4560004");
  inNumList.add("4560005");
  inNumList.add("4560006");
  inNumList.add("4560007");
  inNumList.add("4560008");
  inNumList.add("4560009");
  inNumList.add("4560010");
  inNumList.add("4560012");
  inNumList.add("4560013");
  inNumList.add("4560014");
  inNumList.add("4560015");
  inNumList.add("4560016");
  inNumList.add("4560017");
  inNumList.add("4560018");
  inNumList.add("4560019");
  inNumList.add("4560020");
  inNumList.add("4560200");
  inNumList.add("4560300");
  inNumList.add("4560301");
  inNumList.add("4560302");
  inNumList.add("4560303");
  inNumList.add("4560304");
  inNumList.add("4560305");
  inNumList.add("4560306");
  inNumList.add("4560307");
  inNumList.add("4560308");
  inNumList.add("4560309");
  inNumList.add("4560310");
  inNumList.add("4560311");
  inNumList.add("4560312");
  inNumList.add("4560313");
  inNumList.add("4560314");
  inNumList.add("4560315");
  inNumList.add("4560316");
  inNumList.add("4560317");

  SerialNum serialNum=new SerialNum();
  List serialList=serialNum.getSerialNum(inNumList,7);
  System.out.print(serialList);

 }
}

运行结果:
[4560004, 4560005, 4560006, 4560007, 4560008, 4560009, 4560010]

### 基于免疫算法的多车场VRP求解方法 #### 多车场VRP问题概述 多车场车辆路径问题(MDVRP, Multi-Depot Vehicle Routing Problem)是指多个配送中心向若干客户节点提供服务,在满足客户需求的同时最小化总运输成本或其他目标函数的一类优化问题。此类问题具有广泛的应用背景,如城市物流配送、快递行业等。 #### 免疫算法原理及其优势 人工免疫系统(AIS, Artificial Immune System)是一门模拟生物免疫系统的理论和技术科学。它借鉴了生物学中抗原识别机制、抗体多样性维持策略以及记忆细胞功能等特点来构建计算模型。应用于组合优化领域时,AIS能够有效克服传统进化算法易陷入局部最优解的问题,并且具备良好的全局搜索能力与自适应调节特性[^3]。 #### 求解过程描述 对于基于免疫算法处理MDVRP而言: - **初始化种群**:随机生成一组初始可行解作为“抗体”,每个个体代表一种可能的任务分配方案; - **评估亲和力**:定义适合度评价标准(例如路程长度),并据此计算各候选解的质量得分; - **选择操作**:依据一定概率保留较优秀的部分个体进入下一代繁殖池; - **克隆扩增**:对选中的高质量样本实施复制放大动作,形成规模更大的临时群体; - **超变突变**:针对上述扩大后的集合执行高频率变异处理,旨在探索邻域内潜在优良结构; - **负选择压力**:引入抑制重复模式产生的惩罚项,促进种群内部异质性的保持和发展; - **更新长期记忆库**:记录历次迭代过程中发现的最佳实践案例,以便后续查询利用; - **终止条件判断**:当达到预设的最大循环次数或者连续几代未见明显改进迹象,则停止运算输出最终结果。 ```matlab function [bestRoute,bestCost]=ImmuneAlgorithmForMDVRP(...) % 初始化参数设置... while ~terminationCondition() evaluateAffinity(population); % 计算当前种群成员的目标函数值 selectedIndividuals=selection(); % 执行自然选择法则筛选优秀者 clonedPopulation=clonalExpansion(selectedIndividuals); % 对优质基因型进行大量拷贝扩充数量级 mutatedClones=hypermutation(clonedPopulation); % 加强变异强度挖掘新奇性状 population=negativeSelection(mutatedClones); % 施加负面反馈防止过度同质化 updateMemoryBank(bestSoFar); % 将迄今为止最好的解决方案存入历史档案馆 bestRoute=getBestSolutionFrom(memoryBank); bestCost=fObjective(bestRoute); end end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiejava1018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值