假设在一段数字中【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;
}
}