【Luogu】P3052摩天大楼里的奶牛(遗传算法乱搞)
一道状压题,但今天闲来无事又用遗传乱搞了一下。
设了一个DNA数组,DNA[i]记录第i个物品放在哪个组里。适应度是n-这个生物的组数+1.
交配选用的是轮盘赌和单亲繁殖——0.3的几率单点变异。(事实上有性生殖我似乎写不出来……代码量略大)
种群大小开到了400,在vijos上繁殖了2050代,下数据自己测也是对的。
然而只有84分
这究竟是为什么啊 下数据自己测是没错的啊………………
疯了
代码和数据先放到这里,以后再改吧
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<ctime> inline double random(double from,double to){
return rand()*1.0/RAND_MAX*(to-from)+from;
} inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int n;
int w[],W;
int ans=0x7fffffff; struct Creative{
int DNA[],s[];
int cnt,score;
Creative(){ cnt=;score=; memset(s,,sizeof(s)); }
Creative Create(){
Creative New;
for(register int i=;i<=n;++i){
if(New.cnt==||random(,)<=0.5){
New.cnt++;
New.DNA[i]=New.cnt;
New.s[New.cnt]+=w[i];
}
else{
int j,tot=;
Label:
tot++;
j=random(,New.cnt);
if(New.s[j]+w[i]>W&&tot<=n*) goto Label;
if(!New.s[j]&&tot<=n+) goto Label;
if(tot>=n*){
New.cnt++;
New.DNA[i]=New.cnt;
New.s[New.cnt]+=w[i];
continue;
}
New.DNA[i]=j;
New.s[j]+=w[i];
}
}
if(New.cnt) ans=std::min(ans,New.cnt);
New.score=n-New.cnt+;
return New;
}
}; struct Biome{
Creative e[];
int tot;
void Clear(bool flag){
tot=;
for(int i=;i<;++i){
if(flag) e[i]=e[i].Create();
if(e[i].cnt) tot+=e[i].score;
if(e[i].cnt==) i--;
}
}
int Find(){
int sum=,limit=random(,tot);
for(register int i=;i<;++i){
sum+=e[i].score;
if(sum>=limit) return i;
}
return ;
}
Creative Multi(int x){
Creative New=e[x];
if(random(,)>0.3) return New;
int i=random(,n+),pos=New.DNA[i];
New.s[pos]-=w[i];
if(!New.s[pos]){
New.cnt--;
New.score++;
}
int j,tot=;
Label:
tot++;
j=random(,n);
if(New.s[j]+w[i]>W&&tot<=n*) goto Label;
if(!New.s[j]&&tot<=n+) goto Label;
if(tot>=n*){
New.cnt++;
New.DNA[i]=New.cnt;
New.score--;
New.s[New.cnt]+=w[i];
}
else{
New.DNA[i]=j;
if(!New.s[j]){
New.cnt++;
New.score--;
}
New.s[j]+=w[i];
ans=std::min(ans,New.cnt);
}
return New;
}
}Old,New; inline bool cmp(Creative a,Creative b){ return a.score>b.score; } int main(){
srand(time(NULL));
n=read(),W=read();
for(int i=;i<=n;++i) w[i]=read();
Old.Clear();
for(register int T=;T<=;++T){
Old.Clear();
for(register int i=;i<;++i) New.e[i]=Old.Multi(Old.Find());
std::sort(Old.e+,Old.e+,cmp);
std::sort(New.e+,New.e+,cmp);
for(register int i=;i<=;++i) Old.e[+i]=New.e[i];
}
/*for(int i=1;i<=100;++i,printf("\n")){
for(int j=1;j<=n;++j) printf("%d ",Old.e[i].DNA[j]);
printf(">>>%d %d",Old.e[i].cnt,Old.e[i].score);
}*/
printf("%d",ans);
return ;
}
18 100000000
37597832
24520955
100000000
18509980
29141223
20287969
14028193
33097076
12116817
53439913
10216168
32891936
43952038
13463011
4056577
4646046
10153053
37881213
下一个准备用遗传搞的题是猫狗大战。
【Luogu】P3052摩天大楼里的奶牛(遗传算法乱搞)的更多相关文章
- 【Luogu】P3052摩天大楼里的奶牛(状压DP)
参见ZHT467的题解. f[i]表示在i这个集合下的最少分组数和当前组最少的容量. 从1到(1<<n)-1枚举i,对于每个i枚举它的子奶牛,然后重载运算符计算. 代码如下 #includ ...
- 洛谷P3052 [USACO12MAR]摩天大楼里的奶牛 [迭代加深搜索]
题目传送门 摩天大楼里的奶牛 题目描述 A little known fact about Bessie and friends is that they love stair climbing ra ...
- 洛谷P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper 题目描述 A little known fact about Bessie and friends is ...
- [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
洛谷题目链接:[USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper 题目描述 A little known fact about Bessie and friends is ...
- 【题解】Luogu P3052 【USACO12】摩天大楼里的奶牛Cows in a Skyscraper
迭代加深搜索基础 题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A ...
- LUOGU P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A better k ...
- P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
题目描述 给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积<=W,问最小分组.(n<=18) 输入格式: Line 1: N and W separated by a spa ...
- 洛谷 P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A better k ...
- P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper 状压dp
这个状压dp其实很明显,n < 18写在前面了当然是状压.状态其实也很好想,但是有点问题,就是如何判断空间是否够大. 再单开一个g数组,存剩余空间就行了. 题干: 题目描述 A little k ...
随机推荐
- input type=file 选择图片并且实现预览效果
通过<input />标签,给它指定type类型为file,可提供文件上传: accept:可选择上传类型,如:只要传图片,且不限制图片格式,为image/*: multiple:规定是否 ...
- Nginx性能优化参考
nginx性能优化参考 1)调整配置文件中的配置项的值(配置文件:nginx.conf) worker_processes auto;开启的进程数,一般配置为跟逻辑CPU核数一样worker_rlim ...
- vijos 1190 繁忙的都市
描述 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路 ...
- WPF中给Button加上图标和文字
要实现在Button里面加入图标或者图形以及文字,我们就需要在Button里面用一个WrapPanel控件,这个WrapPanel控件会把我们的图标或者文字进行包裹,并显示出来. Xaml: < ...
- Html5怎么导出图片
其实很简单, 首先需要两个js文件 jquery.min.js html2canvas.js 直接上代码,几行就解决了 <a id="example1" onclick=&q ...
- NYOJ-06-喷水装置(一)
http://acm.nyist.net/JudgeOnline/problem.php?pid=6 喷水装置(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现有 ...
- 国庆集训 || Wannafly Day4
链接:https://www.nowcoder.com/acm/contest/205#question 一场题面非常 有趣 但是题目非常 不友好的比赛 QAQ L.数论之神 思维(?) 题意:求 ...
- ios retain copy 以及copy协议
阅读本文之前首先了解Copy与Retain的区别: Copy是创建一个新对象,Retain是创建一个指针,引用对象计数加1. Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的 ...
- C语言数据类型_02
C语言数据类型:
- Sass基本数据类型和各类型的原生方法
数据类型: 数字:1,2,3,11,10px (可以带单位) 字符串:"asd",'asd',asd (有引号和无引号都是字符串类型) 如 $name : zhang san ; ...