wqxuexic 2018-11-08 02:00 采纳率: 0%
浏览 574
已结题

求推荐一种高效的算法

假设在一段数字中【0-3000】中,随机选取【4-10】个数字,这些数字的选取有如下规则:
1、必须在【0-3000】范围内;
2、每两个数字之间必须满足最小150数值差的间隔;
3、选取出n个数字后(n在【4-10】之间),输入到下层算法,下层算法可以根据这个数字组合,使用另一种很复杂的规则(假设为f=f(x1,x2,,,,xn))算出此组合的f值;
4、求一种算法,能够算出使f值达到最小的数字组合;
问题存在难点:如果使用遗传算法等启发式算法,需要确定决策变量数目(也就是数字的选取数量才能编码,但是现在选取数量在【4-10】之间,并不确定),求怎么解决这个问题比较好?如何选取一种好的上层算法。

  • 写回答

1条回答

  • x060508 2018-11-08 02:50
    关注
    
    package com.test;
    
    import java.util.ArrayList;
    import java.util.ListIterator;
    import java.util.Random;
    
    public class Test {
    
        public static void main(String[] args) throws Exception {
    
            Test test=new Test();
            int arr[]=test.getNum();
            for(int x:arr) {
                System.out.println(x);
            }
        }
    
    
        /**
         *  假设在一段数字中【0-3000】中,随机选取【4-10】个数字,这些数字的选取有如下规则:
            1、必须在【0-3000】范围内;
            2、每两个数字之间必须满足最小150数值差的间隔;
    
         * 
         */
        public int[] getNum() {
    
            /*
             * 
             * 如:取150这个数  就把差值 (0-300  开区间)区间全部删除 不包括0/300  
             * 
             */
            Random r=new Random();
            int count=r.nextInt(7)+ 4; //[0-6]  +4 则为【4,10】 
    
    
            ArrayList<Integer> resultList=new ArrayList<>();
    
            //创建3000个数集合
            ArrayList<Integer> nums= new ArrayList<>();
            for(int i=0;i<=3000;i++) {
                nums.add(i);
            }
    
            //随机取count个数值
            for (int i = 0; i < count; i++) {
                //取值范围
                int n=r.nextInt(nums.size());
                int num=nums.get(n);
                resultList.add(num);
    
    
                ListIterator<Integer> listIterator = nums.listIterator(n);
    
                while(listIterator.hasNext()) {
                    int currNum = listIterator.next();
                    if(currNum-num<150) {
                        listIterator.remove();
                    }
                    break;
                }
    
                while(listIterator.hasPrevious()) {
                    int currNum = listIterator.previous();
                    if(num-currNum<150) {
                        listIterator.remove();
                    }
                    break;
                }
    
            }
    
            int result[]=new int[resultList.size()];
            for (int i = 0; i < resultList.size(); i++) {
                result[i]=resultList.get(i);
            }
            return result;
        }
    }
    
    
    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B