zoukankan      html  css  js  c++  java
  • 人工智能导论作业

    #include<bits/stdc++.h>
    
    using namespace std;
    
    const int maxn=5005;
    
    double S;
    int n;
    double v[maxn];
    double w[maxn];
    
    const unsigned int inf=~0U;
    typedef unsigned int U;
    
    U SX=335634763,SY=873658265,SZ=192849106,SW=746126501;
    U xorshift128(){
         //快速随机数生成器 
        U tt=SX^(SX<<11);
        SX=SY;
        SY=SZ;
        SZ=SW;
        return SW=SW^(SW>>19)^tt^(tt>>8);
    }
    
    
    struct Genetic_algorithm {
        
        struct chromesome {
            vector<int> id;//一个01序列,表示状态,第i位为0表示不选取第i个物品,第i位为1表示选取
            double weight;//表示选择算子(权重),权重越大,被选中的概率越大
            double sop;//表示被选中的概率
            double st,ed;//在轮盘赌算法中占据的位置,st表示起点,ed表示终点
            chromesome () {
                
            }
            bool operator < (const chromesome &r) const {
                return weight>r.weight;//排序规则,只保留适应度较大的
            }
        };
        
        vector<chromesome> chr_list;//一个包含当前种群的列表
        
        double cal_weight (vector<int> id) {
            double weight=0;//定义总权重
            double sum=0;//定义当前体积
            for (int i=0;i<id.size();i++) {
                if (id[i]==0) continue;
                sum+=v[i];
                weight+=w[i];
            }
            //printf("%lf
    ",sum);
            if (sum>S) return 0;//如果超出背包容量,直接返回0
            return weight;
        } 
        
        void cal_sop () {
            double sum=0;
            for (int i=0;i<chr_list.size();i++) chr_list[i].weight=cal_weight(chr_list[i].id);
            for (int i=0;i<chr_list.size();i++) chr_list[i].sop=chr_list[i].weight/sum;
            double cc=0;
            for (int i=0;i<chr_list.size();i++) {
                chr_list[i].st=cc;
                chr_list[i].ed=cc+chr_list[i].sop-0.000001;//计算被选中的区间
            }
        }
        
        chromesome cross (vector<chromesome> chr_list) {
            chromesome ans;
            chromesome t1=chr_list[0],t2=chr_list[0];
            double x=xorshift128()*1.0/1000000000;
            for (int i=0;i<chr_list.size();i++) {
                if (x>=chr_list[i].st&&x<=chr_list[i].ed) {
                    t1=chr_list[i];
                    break;
                }
            }
            
            double y=xorshift128()*1.0/1000000000;
            for (int i=0;i<chr_list.size();i++) {
                if (y>=chr_list[i].st&&y<=chr_list[i].ed) {
                    t2=chr_list[i];
                    break;
                }
            }
            int p=xorshift128()%n;//随机生成一个交叉位置
            for (int i=0;i<p;i++) ans.id.push_back(t1.id[i]);
            for (int i=p;i<t1.id.size();i++) ans.id.push_back(t2.id[i]);
            return ans;
        }
        
        chromesome variation (chromesome x) {
            vector<int> p;
            for (int i=0;i<5;i++) p.push_back(xorshift128()%n);
            for (int i=0;i<p.size();i++) {
                if (x.id[p[i]]==1) continue;
                x.id[p[i]]=1;//往好的方向变异
            }
            return x;
        }
        
        vector<chromesome> diedai () {
            vector<chromesome> ans=chr_list;
            for (int i=0;i<200;i++) ans.push_back(cross(chr_list));
            for (int i=0;i<chr_list.size();i++) ans.push_back(variation(chr_list[i]));
            sort(ans.begin(),ans.end());
            int len=ans.size();
            for (int i=0;i<len-200;i++) ans.pop_back();
            return ans;
        }
        
        void init () {
            //随机生成200个01串进入序列
            for (int i=0;i<200;i++) {
                chromesome tt;
                for (int j=0;j<n;j++) tt.id.push_back(xorshift128()%2);
                chr_list.push_back(tt);
            }
        }
        
        void start () {
            init();
            for (int i=0;i<200;i++) {
                cal_sop();
                chr_list=diedai();
            }
        }
    }; 
    
    int main () {
        scanf("%lf%d",&S,&n);
        for (int i=0;i<n;i++) scanf("%lf%lf",v+i,w+i);
        Genetic_algorithm zlc;
        zlc.start();
    //    for (int i=0;i<zlc.chr_list.size();i++) {
    //        for (int j=0;j<zlc.chr_list[i].id.size();j++) printf("%d",zlc.chr_list[i].id[j]);
    //        printf("%lf",zlc.chr_list[i].weight);
    //        printf("
    ");
    //    }
        printf("%lf
    ",zlc.chr_list[0].weight); 
    }
  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/13996538.html
Copyright © 2011-2022 走看看