求推荐一种高效的算法

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


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;
    }
}