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