精华内容
下载资源
问答
  • 求函数最大值——遗传算法

    千次阅读 2006-06-27 00:04:00
    函数f(x)如下: f(x) = x * sin(10 * pi * x) + 1(在[-1, 2]内的最大值)用一个长22位的二进制串作为染色体,来表示(仅仅是表示,而不等于)x的实数值,染色体可以表示的整数的范围是0~4194304,const int

    遗传算法本身是一个用来解决很复杂的系统问题时使用的算法,记一个遗传算法所能解决的最小规模的问题——求函数最大值,旨在了解遗传算法。函数f(x)如下:

    f(x) = x * sin(10 * pi * x) + 1(求在[-1, 2]内的最大值)

    用一个长22位的二进制串作为染色体,来表示(仅仅是表示,而不等于)x的实数值,染色体可以表示的整数的范围是0~4194304,

    const int MAX = 4194304;

    const int MIN = 0;

     

    取得x所代表的实数值的函数可计算得到,在个体类(Indivaduality)里实现。同时还包括评价函数(就是题目中的f(x)),变异,交叉的方法。

     

    #include <iostream>

    #include <time.h>       //产生随机数要用到time(int),以使每次产生的数不同。

    #include <math.h>       //sin(float)在这儿。

    using namespace std;

     

     

    const float pi = 3.1415926;

     

    class Individuality {

    private:

        int chromosome;      //染色体

    public:

        void set(int chromosome) { this->chromosome = chromosome; }

        Individuality operator =(Individuality c) { this->chromosome = c.chromosome; return *this; }

        bool operator ==(Individuality c) { return this->chromosome == c.chromosome; }

        float resolve() { //通过染色体取得x的值.

           return  -1.0 + (float)chromosome * 3.0 / (MAX - 1);

        }

        float evaluate() {   //f()

           return resolve() * (float)sin(10*pi*resolve()) + 1.0;

        }

        void print() {

           cout << '/t';

           //以下循环是在以二进制串的形式打印染色体

           for(int j = 21; j >= 0; j--)

               if((1<<j) & chromosome) cout << '1';

               else cout << '0';

           printf( "/t/tx = %f/tf(x) = %f/n", resolve(), evaluate() );

        }

        //以下是对当前个体进行变异的操作

        Individuality variate() {

           int i = rand() % 21 + 1;

           this->chromosome ^= 1<<i;

           return *this;

        }

        //以下是两个个体进行交叉,并且返回两个新个体的操作

        void crisscross(Individuality prnt1, Individuality prnt2, Individuality &child1, Individuality &child2) {

           int i = rand() % 21 + 1;

           int temp1 = prnt1.chromosome;

           int temp2 = prnt2.chromosome;

           int temp = 0;

           for(; i < 22; i++)

               temp += 1<<i;

           temp1 &= temp;

           temp2 &= temp;

           prnt1.chromosome &= ~temp;

           prnt2.chromosome &= ~temp;

           prnt1.chromosome |= temp2;

           prnt2.chromosome |= temp1;

           child1 = prnt1;

           child2 = prnt2;

        }

    };

     

    建立一个种群的类,并且有固定的大小

     

    const int POP_SIZE = 200;

     

    每次遗传,选出f(x)的排名在前50%的个体进行遗传(排名通过希尔排序实现),都会有约1%的个体变异,10%的个体发生交叉遗传,其余的直接遗传。每次遗传都记录下本次f(x)为最大的个体Max。遗传150次,如果过程中发现已有30代的Max一直不变了,说明已达到最优,基本不需要再遗传了,所以提前跳出循环。

     

    class Population {

    private:

        //以下是当前中群众的所有的个体

        Individuality ind[POP_SIZE];

    public:

        //以下这个构造器对所有个体赋初值

        Population() {

           for(int i = 0; i < POP_SIZE; i++)

               ind[i].set( (((double)rand()/(double)RAND_MAX) * MAX + MIN) );

        }

        void shellSort() {

           int gap, i, j;

           Individuality temp;

           for(gap = POP_SIZE/2; gap > 0; gap /= 2)

               for(i = gap; i < POP_SIZE; i++)

                  for(j=i-gap; j>=0 && ind[j].evaluate() < ind[j+gap].evaluate(); j -= gap) {

                      temp = ind[j];

                      ind[j] = ind[j+gap];

                      ind[j+gap] = temp;

                  }

        }

        //以下遗传操作

        void inherit() {

           Population::shellSort();

           const int NT = POP_SIZE / 2;

           Individuality temp[NT];

           for(int i = 0; i < NT; i++)

               temp[i] = ind[i];

        

        

    //以上五行是对当前种群进行排队,选出better half放在临时种群里以待遗传

        

        

    //以下是变异,交叉,和直接复制。

           int nc = (rand() % (POP_SIZE/10) + (POP_SIZE/4)) / 2;

           int nv = rand() % (POP_SIZE/100+1) + (POP_SIZE/100);

           int i, n1, n2;

     

           for(i = 0; i < nv; i++) {

     

               n1 = rand() % NT;

               ind[i] = temp[n1].variate();

           }

           for(i = nv; i < nc; i += 2) {

               n1 = rand() % NT;

               n2 = rand() % NT;

               Individuality temp1, temp2;

               temp->crisscross(temp[n1], temp[n2], temp1, temp2);

               ind[i] = temp1; ind[i+1] = temp2;

           }

           for(i = nv+nc*2; i < POP_SIZE; i++) {

               n1 = rand() % NT;

               ind[i] = temp[n1];

           }

        }

        Individuality getMax() {

        

     

    //获取种群中适应度函数值最高的个体

           Individuality max = ind[0];

           for(int i = 0; i < POP_SIZE-1; i++) {

               if( ind[i+1].evaluate() > ind[i].evaluate() ) max = ind[i+1];

           }

           return max;

        }

        void traverse() {

           for(int i = 0; i < POP_SIZE; i++)

               ind[i].print();

           cout << endl;

        }

    };

     

    int main() {

        srand( (unsigned)time( NULL ) );

        Population a;

        a.traverse();

        int count = 0;

        int gen = 0;

        for(int i = 0; i < 150; i++) {

           Individuality temp = a.getMax();

           a.inherit();

           if(a.getMax() == temp) count++;

           if(count > 30) break;

           a.traverse();

           gen++;

        }

        cout << "The max is:/n";

        a.getMax().print();

        cout << "After " << gen << " generations./n";

        return 0;

    }

     

     

     

    完成于2006年6月24日

     

     点击小人下载源程序:)
    展开全文
  • 用遗传算法求函数f(a,b)=2a x sin(8PI x b) + b x cos(13PI x a)最大值,a:[-3,7],b:[-4:10] 实现步骤: 初始化种群 计算种群中每个个体的适应值 淘汰部分个体(这里是求最大值,f值存在正值,所以淘汰所有负值) ...

    题目:

    用遗传算法求函数f(a,b)=2a x sin(8PI x b) + b x cos(13PI x a)最大值,a:[-3,7],b:[-4:10]

    实现步骤:

    • 初始化种群
    • 计算种群中每个个体的适应值
    • 淘汰部分个体(这里是求最大值,f值存在正值,所以淘汰所有负值)
    • 轮盘算法对种群进行选择
    • 进行交配、变异,交叉点、变异点随机

    分析:

    为了方便,先将自变量范围调整为[0,10]、[0,14]
    有两个变量,种群中每个个体用一个列表表示,两个列表项,每项是一个二进制字符串(分别由a、b转化而来)
    种群之间交配时需要确定交叉点,先将个体染色体中的两个二进制字符串拼接,再确定一个随机数作为交叉点
    为了程序的数据每一步都比较清晰正确,我在select、crossover、mutation之后分别都进行了一次适应值的重新计算

    具体代码:

    import math
    import random
    def sum(list):
        total = 0.0
        for line in list:
            total += line
        return total
    def rand(a, b):
        number =  random.uniform(a,b)
        return math.floor(number*100)/100
    PI = math.pi
    def fitness(x1,x2):
        return 2*(x1-3)*math.sin(8*PI*x2)+(x2-4)*math.cos(13*PI*x1)
    def todecimal(str):
        parta = str[0:4]
        partb = str[4:]
        numerical = int(parta,2)
        partb = partb[::-1]
        for i in range(len(partb)):
            numerical += int(partb[i])*math.pow(0.5,(i+1))
        return numerical
    def tobinarystring(numerical):
        numa = math.floor(numerical)
        numb = numerical - numa
        bina = bin(numa)
        bina = bina[2:]
        result = "0"*(4-len(bina))
        result += bina
        for i in range(7):
            numb *= 2
            result += str(math.floor(numb))
            numb = numb - math.floor(numb)
        return result
    class Population:
        def __init__(self):
            self.pop_size = 500     # 设定种群个体数为500
            self.population = [[]]    # 种群个体的二进制字符串集合,每个个体的字符串由一个列表组成[x1,x2]
            self.individual_fitness = []    # 种群个体的适应度集合
            self.chrom_length = 22  # 一个染色体22位
            self.results = [[]]     # 记录每一代最优个体,是一个三元组(value,x1_str,x2_str)
            self.pc = 0.6           # 交配概率
            self.pm = 0.01          # 变异概率
            self.distribution = []  # 用于种群选择时的轮盘
        def initial(self):
            for i in range(self.pop_size):
                x1 = rand(0,10)
                x2 = rand(0,14)
                x1_str = tobinarystring(x1)
                x2_str = tobinarystring(x2)
                self.population.append([x1_str,x2_str]) # 添加一个个体
                fitness_value = fitness(x1,x2)
                self.individual_fitness.append(fitness_value)   # 记录该个体的适应度
            self.population = self.population[1:]
            self.results = self.results[1:]
        def eliminate(self):
            for i in range(self.pop_size):
                if self.individual_fitness[i]<0:
                    self.individual_fitness[i] = 0.0
        def getbest(self):
            "取得当前种群中的一个最有个体加入results集合"
            index = self.individual_fitness.index(max(self.individual_fitness))
            x1_str = self.population[index][0]
            x2_str = self.population[index][1]
            value = self.individual_fitness[index]
            self.results.append((value,x1_str,x2_str,))
        def select(self):
            "轮盘算法,用随机数做个体选择,选择之后会更新individual_fitness对应的数值"
            "第一步先要初始化轮盘"
            "选出新种群之后更新individual_fitness"
            total = sum(self.individual_fitness)
            begin = 0
            for i in range(self.pop_size):
                temp = self.individual_fitness[i]/total+begin
                self.distribution.append(temp)
                begin = temp
            new_population = []
            new_individual_fitness = []
            for i in range(self.pop_size):
                num = random.random()   # 生成一个0~1之间的浮点数
                j = 0
                for j in range(self.pop_size):
                    if self.distribution[j]<num:
                        continue
                    else:
                        break
                index = j if j!=0 else (self.pop_size-1)
                new_population.append(self.population[index])
                new_individual_fitness.append(self.individual_fitness[index])
            self.population = new_population
            self.individual_fitness = new_individual_fitness
        def crossover(self):
            "选择好新种群之后要进行交配"
            "注意这只是一次种群交配,种群每一次交配过程,会让每两个相邻的染色体进行信息交配"
            for i in range(self.pop_size-1):
                if random.random()<self.pc:
                    cross_position = random.randint(1,self.chrom_length-1)
                    i_x1x2_str = self.population[i][0]+self.population[i][1]    # 拼接起第i个染色体的两个二进制字符串
                    i1_x1x2_str = self.population[i+1][0]+self.population[i+1][1]    # 拼接起第i+1个染色体的两个二进制字符串
                    str1_part1 = i_x1x2_str[:cross_position]
                    str1_part2 = i_x1x2_str[cross_position:]
                    str2_part1 = i1_x1x2_str[:cross_position]
                    str2_part2 = i1_x1x2_str[cross_position:]
                    str1 = str1_part1+str2_part2
                    str2 = str2_part1+str1_part2
                    self.population[i] = [str1[:11],str1[11:]]
                    self.population[i+1] = [str2[:11],str2[11:]]
            "然后更新individual_fitness"
            for i in range(self.pop_size):
                x1_str = self.population[i][0]
                x2_str = self.population[i][1]
                x1 = todecimal(x1_str)
                x2 = todecimal(x2_str)
                self.individual_fitness[i] = fitness(x1,x2)
        def mutation(self):
            "个体基因变异"
            for i in range(self.pop_size):
                if random.random()<self.pm:
                    x1x2_str = self.population[i][0]+self.population[i][1]
                    pos = random.randint(0,self.chrom_length-1)
                    bit = "1" if x1x2_str[pos]=="0" else "0"
                    x1x2_str = x1x2_str[:pos]+bit+x1x2_str[pos+1:]
                    self.population[i][0] = x1x2_str[:11]
                    self.population[i][1] = x1x2_str[11:]
            "然后更新individual_fitness"
            for i in range(self.pop_size):
                x1_str = self.population[i][0]
                x2_str = self.population[i][1]
                x1 = todecimal(x1_str)
                x2 = todecimal(x2_str)
                self.individual_fitness[i] = fitness(x1, x2)
        def solving(self,times):
            "进行times次数的整个种群交配变异"
            "先获得初代的最优个体"
            self.getbest()
            for i in range(times):
                "每一代的染色体个体和适应值,需要先淘汰,然后选择,再交配、变异,最后获取最优个体。然后进入下一代"
                self.eliminate()
                self.select()
                self.crossover()
                self.mutation()
                self.getbest()
        def returnbest(self):
            self.results.sort()
            return self.results[len(self.results)-1]
    if __name__ == '__main__':
        demo = Population()
        demo.initial()
        demo.solving(100)
        answer = demo.returnbest()
        value = answer[0]
        x1 = todecimal(answer[1])
        x2 = todecimal(answer[2])
        print(x1,x2,value)

    参考文章

    转载于:https://www.cnblogs.com/lambdaCheN/p/9032805.html

    展开全文
  • 绝对值函数最大值/最小值函数之间的关系

    绝对值函数与最大值/最小值函数之间的关系
    这里写图片描述

    展开全文
  • 编写一个函数模板,数组中的最大元素,并写出调用此函数模板的完整程序,使的到函数调用时,数组的类型可以是整型也可以是双精度类型。 知识点:利用函数模板来解决数组问题,使用数组的引用来传递参数不太友好。...

    题目:

    编写一个函数模板,求数组中的最大元素,并写出调用此函数模板的完整程序,使的到函数调用时,数组的类型可以是整型也可以是双精度类型

    知识点:利用函数模板来解决数组问题,使用数组的引用来传递参数不太友好。数组引用必须指明数组的元素个数,比如 int (&arr)[5]。表示含有5个元素的数组引用,这里的5是不能被省略的。这样极大的限制了自定义函数模板处理数组的范围。

    所以,在函数模板中传递数组参数,还是用指针最好。


    main.cpp

    #include <iostream>
    using namespace std;
    #include "class.h"
    int main()
    {
    	int arr1[4] = { 5,32,78,123 };
    	double arr2[4] = { 56.1,45.3,78.32,49.0 };
    	cout << "max = " << maxInArray(arr1, 4) << endl;
    	cout << "max = " << maxInArray(arr2, 4) << endl;
    	system("pause");
    	return 0;
    }
    

    class.h

    #pragma once
    template <typename T>//模板声明
     maxInArray(T* arr,int num)//数组的引用应写成 T (&arr)[4],但要指明数组的元素个数,限制了不同数组来求最大值
    {
    	T max = arr[0];
    	for (int i = 1; i < num; i++)
    	{
    		arr[i] > max ? max = arr[i] :0;
    	}
    	return max;
    }
    

    运行结果:

    展开全文
  • **问题描述:**通过函数的递归四个数的最大值 **解题思路:**通过多次比较两个数进行比较大小,本质就是冒泡法排序 即max_4=max_2(num1,max_2(num2,max_2(num3,num4))) 那么可以将4推广成n, max_n 也可以用n-1次...
  • **minMaxLoc()和minMaxIdx()函数的功能是一样的,两个函数的区别在于设置的参数不同,而且minMaxLoc()**针对单通道图像,**minMaxIdx()**则不限制...(2)延伸一下,可以计算图像Mat中灰度最大值、最小值、返回最大...
  • 1、输入一组整数,找出这组数中最大值与最小值的下标,在主调函数中输出最大值和最小值;
  • sql函数平均值 总数 最小值 最大值 总和 标准差
  • Excel中,用MIN函数求最小值,往往出来的0是因为为空,有时值中如果存在文字,或者取不到,也会造成为0。这是由于MIN函数的特性决定的,那么,怎么解决这个问题呢? 求值需求: 如下Excel所示,要求出每个...
  • 用遗传算法求解二元函数最大值

    千次阅读 2020-06-23 17:07:40
    例、下述二元函数最大值: max f(x1,x2) = x1^2+x2^2; (1)个体编码:遗传算法的运算对象是表示个体的符号串,所以必须把变量x1,x2编码位一种符号串。本题中,用无符号二进制整数来表示。  因x1,x2为0-7...
  • 求解二元函数最大值-遗传算法

    千次阅读 2018-04-06 17:38:00
    例、下述二元函数最大值: max f(x1,x2) = x1^2+x2^2; (1)个体编码:遗传算法的运算对象是表示个体的符号串,所以必须把变量x1,x2编码位一种符号串。本题中,用无符号二进制整数来表示。  因x1,x2为0-7...
  • C/C++ 求最大值方法

    万次阅读 2018-10-03 11:12:35
    很多方面C语言和C++都很相似. 1.一般法(条件表达式)——直接在main函数中运算 特点:简短清晰 ...//max用了存放最大值 cin&gt;&gt;a&gt;&gt;b&gt;&gt;c; max=(a&gt;...
  • C语言中,三个数中求最大值

    千次阅读 2019-01-14 20:34:00
    /*调用函数来实现三个数求最大值的方法 非整型只需将格式进行相应的需改*/ int max(int a,int b)//两个数之间最大的数 { if(a&lt;b) return b; else return a; } int main() { int a,b,c,p; ...
  • 使用sql函数,您可以在一个select语句的查询当中,直接计算数据库资料的平均值、总数、最小值、最大值、总和、标准差、变异数等统计。使用recordset对象时,也可使用这些sql函数。 sql函数包括如下: avg函数:计算...
  • 遗传算法求解函数最大值Java实现

    千次阅读 2017-08-15 13:30:32
    一,概述本文在理解遗传算法的基本原理的基础上,使用Java语言写了一个小程序来简单实现用遗传算法求解二次函数f(x,y)=x*x+y*y (x和y的取值范围为1到127的正整数)的最大值。完整源码见已上传至我的github,详情请...
  • Python3 实例--Python 获取最大值函数

    千次阅读 2020-02-12 12:39:06
    #Python3 实例--Python 获取最大值函数: print("Python3 实例--Python 获取最大值函数:") def max_num(x, y): print("{}是最大值".format(max(x, y))) max_num(int(input()), int(input())) #运行结果如下: ...
  • C++求最大值编程

    千次阅读 2017-11-19 16:20:46
    题目:任意输入三个数(主函数),计算出这三个数的最大数(子函数)。 步骤解析: #include //调用输入输出函数库 ... //定义求最大值 extern int a,b,c; //定义输入的任意三个整型数字 printf("please enter t
  • 遗传算法_求最大值

    千次阅读 2012-11-08 11:06:43
    /*********************************************************** ** 人工智能--遗传算法 ** ** 求解f (x) = x2 的最大值,x∈ [0,31] ** ** author: CS0921 WTU **
  • 聚合函数对一组进行计算并返回单一的,通常聚合函数会与SELECT语句的GROUP BY子句一同使用,在与GROUP BY子句使用时,聚合函数会为每一个组产生一个单一,而不会为整个表产生一个单一. 在这张数据表的基础上...
  • 输入三个整数求最大值和最小值

    万次阅读 多人点赞 2018-11-06 22:09:18
    ``使用if else 嵌合语句求最大值` #include main() { int a,b,c,max; scanf("%d,%d,%d",&a,&b,&c); if(b>c) { if(c>b)max=c; else max=b; } else { if(c>a)max=c; else max=a; } printf("max=...
  • 函数函数搜索最大值。实现思路:将染色体表示为x,y的值(以bit的形式来表示),进行选择,交叉,变异。同时为了保证解具有较好的全局性,我们每次都选择最好的一个解来替代下一代的最差的一个解,同时提
  • 遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种 符号串。本题中,用无符号二进制整数来表示。 因 x1, x2 为 0 ~ 7之间的整数,所以分别用3位无符号二进制整数来表示,将它 们连接在...
  • 二分法求函数极大

    千次阅读 2019-02-18 12:00:04
    这棵函数是N次函数,经过观察发现,在闭区间[l,r]内函数存在一个极大点,请求出这个极大点x。 输入格式: 第一行,一个正整数N和两个实数l、r,表示闭区间范围。 第二行,N+1个实数,从左到右依次表示函数的...
  • --取平均值 AVG() :sal平均值 select avg(sal) as avg_sal from emp; --求和 SUM() 对sal求和 ...--求最大值 MAX()、最小值MIN() 对sal进行操作 select max(sal) as max_sal,min(sal) as min_sal f...
  • #include<stdio.h> int max(int a, int b)/*定义函数*/ { if (a > b) return a; else return b; } int main() { int a, b, c, maxvalue; printf("请输入三个数:\n"); scan...
  • 本章将介绍NumPy的常用函数。具体来说,我们将以分析历史股价为例,介绍怎样从文件中载入数据,以及怎样使用NumPy的基本数学和统计分析函数。这里还将学习读写文件的方法,并尝试函数式编程和NumPy线性代数运算。 第...
  • matlab中特征的eig函数说明

    万次阅读 2019-05-07 20:49:46
    matlab中特征的eig函数说明 1 基本用法 e = eig(A) 返回一个列向量,其中包含方阵 A 的特征。 示例 [V,D] = eig(A) 返回特征的对角矩阵 D 和矩阵 V,其列是对应的右特征向量,使得 AV = VD。 示例 [V,D,W] =...
  • 表示观测。 2.连续型统计模型 自己的理解: 似然函数的形式是理论上各事件(这个事件表示一个采样一个样本,每个样本有不同的分类)的发生概率。现在发生了的某个事件,似然函数就变成了这个样本的理论概率...
  • 要求用C语言编写程序:编写程序:从键盘上输入若干个整数(以输入-1作为结束标识),输出这些数中的最大值和最小值,要求编写一个函数实现最大值和最小值的取。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 752,897
精华内容 301,158
关键字:

哪个函数表示求最大值