• 人工智能导论作业


    #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); 
    }
  • 相关阅读:
    FastAPI项目实战: 个人博客项目的API
    Jmeter分布式执行,java.rmi.UnmarshalException: xxxAbstractSimpleThreadGroup错误
    [转]JMeter分布式的坑
    Docker菜鸟教程-硬敲系列
    VMware EXIS 安装
    2020简单总结
    07.1 迭代器、生成器
    locust 的 ‘1’ 版本时代变化
    移动端专项测试-内存泄漏
    乘风破浪的不止姐姐,还有我们的测试工程师!
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/13996538.html
Copyright © 2020-2023  润新知