Python作业3

发布于:2022-12-17 ⋅ 阅读:(206) ⋅ 点赞:(0)

随机搜索(random search)是利用随机数求极小点而求得函数近似的最优解的方法。

     变量允许的变化区间,不断随机地而不是有倾向性产生随机点,并计算其约束函数和目标函数的值,对满足约束条件的点,逐个比较其目标函数的值,将坏的点抛弃,保留好的点,最后便得到最优解的近似解。这种方法是建立在概率论的基础上,所取随机点越多,则得到最优解的概率也就越大。由于大多数计算机程序库中有随机数发生器,所以应用这种方法是很方便的。但是其计算精度较差、效率较低。随机搜索一般用于粗选或普查。常用的方法有随机跳跃法,随机走步法等。

 

   确定性算法是利用问题的解析性质,产生一确定的有限或无限点序列使其收敛于全局最优解。这类方法依据某一确定性策略搜索局部极小,并试图跳跃已获得的局部极小而达到某个全局最优点,能充分利用问题的解析性质,从而计算效率高。

public class BinarySearch {
    public static void main(String[] args) {
        int arr[] = {1, 5, 7, 10, 324, 2345};
        int arr1[] = {1, 5, 7, 7,7,7,7,10, 324, 2345};
        int resultIndex = binarySearch(arr, 0, arr.length - 1, 2345);
        System.out.println("该结果的索引为:");
        System.out.println(resultIndex);
        System.out.println("输出没有的数据:");
        System.out.println(binarySearch(arr, 0, arr.length - 1, 23));
        System.out.println("输出有相同的数据的下标:");
        System.out.println(binarySearch1(arr1,0,arr.length-1,7));
        System.out.println("输出没有的数据:");
        System.out.println(binarySearch1(arr1,0,arr.length-1,4343));
    }

    /**
     * @param arr     数组
     * @param left    左边的索引
     * @param right   右边的索引
     * @param findval 要查找的值
     * @return 如果找到就返回该值的下标
     */
    public static int binarySearch(int[] arr, int left, int right, int findval) {
        //当left>right时,说明递归整个数组后都没有找要找的值
        if (left > right) {
            return -1;
        }
        int mid = (left + right) / 2;
        int midValue = arr[mid];
        if (findval > midValue) {//向右递归
            return binarySearch(arr, mid + 1, right, findval);
        } else if (findval < midValue) {//向左递归
            return binarySearch(arr, left, mid - 1, findval);
        } else {
            return mid;
        }
    }
   /**
    *@Descriptin 思考优化
    *@return java.util.ArrayList<java.lang.Integer>
    *@data 2021/12/23
    */
    public static ArrayList<Integer> binarySearch1(int[] arr, int left, int right, int findval) {
        //当left>right时,说明递归整个数组后都没有找要找的值
        if (left > right) {
            return new ArrayList<>();
        }
        int mid = (left + right) / 2;
        int midValue = arr[mid];
        if (findval > midValue) {//向右递归
            return binarySearch1(arr, mid + 1, right, findval);
        } else if (findval < midValue) {//向左递归
            return binarySearch1(arr, left, mid - 1, findval);
        } else {
        ArrayList<Integer> list = new ArrayList<>();
            int temp = mid - 1;
            while (true) {
                if (temp < 0 || arr[temp] != findval) {
                    break;
                }
                list.add(temp);
                temp -= 1;//temp左移
            }
            list.add(mid);
            temp = mid + 1;
            while (true) {
                if (temp > arr.length - 1 || arr[temp] != findval) {
                    break;
                }
                list.add(temp);
                temp += 1;//temp右移
            }
        return  list;
        }
    }
}5a3ccebde5654f8fb79d50091317e4e5.PNG

 


网站公告

今日签到

点亮在社区的每一天
去签到