Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Zlb_Rose
qtcpp_demo
提交
8e2856a6
qtcpp_demo
项目概览
Zlb_Rose
/
qtcpp_demo
与 Fork 源项目一致
Fork自
colorEagleStdio / qtcpp_demo
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
qtcpp_demo
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8e2856a6
编写于
4月 28, 2021
作者:
M
manjaro
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add a example
上级
38312b12
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
278 addition
and
0 deletion
+278
-0
README
README
+4
-0
find0xff/Find0xff.pro
find0xff/Find0xff.pro
+11
-0
find0xff/main.cpp
find0xff/main.cpp
+263
-0
未找到文件。
README
浏览文件 @
8e2856a6
...
...
@@ -12,6 +12,10 @@ cpp_threadpool
functional助力C++11实现高度可重用接口-线程池例子
https://goldenhawking.blog.csdn.net/article/details/51981905
find0xff
论坛:二维数组中找最大特征数组
https://goldenhawking.blog.csdn.net/article/details/116240710
floodfill_mdf
作业讲评-二值矩阵避障最短路径算法
https://goldenhawking.blog.csdn.net/article/details/109411787
...
...
find0xff/Find0xff.pro
0 → 100644
浏览文件 @
8e2856a6
TEMPLATE
=
app
CONFIG
+=
console
c
++
11
CONFIG
-=
app_bundle
CONFIG
-=
qt
SOURCES
+=
\
main
.
cpp
QMAKE_CXXFLAGS
+=
-
fopenmp
LIBS
+=
-
lgomp
-
lpthread
find0xff/main.cpp
0 → 100644
浏览文件 @
8e2856a6
#include <iostream>
#include <random>
#include <cassert>
#include <vector>
#include <list>
#include <algorithm>
#include <array>
#include <set>
#include <memory.h>
using
namespace
std
;
//行列、测试列(本例子取8)
template
<
int
R
,
int
C
,
int
T
>
class
tag_item
{
public:
tag_item
(){
for
(
int
i
=
0
;
i
<
T
;
++
i
)
coords
[
i
]
=
0
;
}
tag_item
(
const
tag_item
&
t
){
memcpy
(
coords
,
t
.
coords
,
sizeof
(
coords
));
good
=
t
.
good
;
}
int
coords
[
T
];
int
good
=
0
;
public:
inline
bool
operator
==
(
const
tag_item
&
t
)
const
{
for
(
int
i
=
0
;
i
<
T
;
++
i
)
if
(
t
.
coords
[
i
]
!=
coords
[
i
])
return
false
;
return
true
;
}
inline
tag_item
&
operator
=
(
const
tag_item
&
t
)
{
for
(
int
i
=
0
;
i
<
T
;
++
i
)
coords
[
i
]
=
t
.
coords
[
i
];
good
=
t
.
good
;
return
*
this
;
}
inline
int
cal_good
(
const
char
(
*
data
)[
C
])
const
{
int
res
=
0
;
for
(
int
i
=
0
;
i
<
R
;
++
i
)
{
bool
failed
=
false
;
for
(
int
j
=
0
;
j
<
T
&&
!
failed
;
++
j
)
{
if
(
!
data
[
i
][
coords
[
j
]])
failed
=
true
;
}
if
(
!
failed
)
++
res
;
}
return
res
;
}
inline
void
output
()
const
{
using
std
::
cout
;
cout
<<
"Weight="
<<
good
<<
" Cols: "
;
for
(
int
i
=
0
;
i
<
T
;
++
i
)
cout
<<
" "
<<
coords
[
i
];
cout
<<
"
\n
"
;
}
inline
void
sort
()
{
std
::
sort
(
coords
,
coords
+
T
,
std
::
less
<
int
>
());
}
};
template
<
int
R
,
int
C
,
int
T
>
inline
bool
operator
<
(
const
tag_item
<
R
,
C
,
T
>&
t1
,
const
tag_item
<
R
,
C
,
T
>&
t2
)
{
for
(
int
i
=
0
;
i
<
T
;
++
i
)
{
if
(
t1
.
coords
[
i
]
<
t2
.
coords
[
i
])
return
true
;
else
if
(
t1
.
coords
[
i
]
>
t2
.
coords
[
i
])
return
false
;
}
return
false
;
}
int
main
(
int
/*argc*/
,
char
*
/*argv*/
[])
{
using
namespace
std
;
default_random_engine
e
;
const
int
R
=
5000
,
C
=
5000
,
T
=
8
;
typedef
tag_item
<
R
,
C
,
T
>
citem
;
char
(
*
data
)[
C
]
=
new
char
[
R
][
C
];
assert
(
data
);
for
(
int
i
=
0
;
i
<
R
;
++
i
)
for
(
int
j
=
0
;
j
<
C
;
++
j
)
data
[
i
][
j
]
=
e
()
%
2
;
int
best
[
8
]
=
{
12
,
445
,
17
,
2314
,
3033
,
1273
,
2289
,
4987
};
//Best rows,重量一致,但是排齐
for
(
int
i
=
0
;
i
<
R
/
2
;
++
i
)
for
(
int
j
=
0
;
j
<
8
;
++
j
)
{
data
[
i
][
best
[
j
]]
=
1
;
data
[
i
][
best
[
j
]
+
R
/
2
]
=
0
;
}
//种群1024
const
int
S
=
1024
;
vector
<
citem
>
group
;
std
::
set
<
citem
>
group_set
;
//产生初始集合
for
(
int
i
=
0
;
i
<
S
;
++
i
)
{
citem
tmp
;
for
(
int
j
=
0
;
j
<
T
;
++
j
)
{
bool
failed
=
false
;
do
{
tmp
.
coords
[
j
]
=
e
()
%
C
;
failed
=
false
;
if
(
j
)
{
for
(
int
k
=
0
;
k
<
j
&&
!
failed
;
++
k
)
if
(
tmp
.
coords
[
k
]
==
tmp
.
coords
[
j
])
failed
=
true
;
}
}
while
(
failed
);
}
tmp
.
sort
();
tmp
.
good
=
tmp
.
cal_good
(
data
);
if
(
group_set
.
find
(
tmp
)
==
group_set
.
end
())
{
group_set
.
insert
(
tmp
);
group
.
push_back
(
tmp
);
}
else
--
i
;
}
//开始遗传优化K次
const
int
K
=
1
<<
20
;
for
(
int
g
=
0
;
g
<
K
;
++
g
)
{
vector
<
citem
>
new_group
;
//交叉
#pragma omp parallel for
for
(
int
i
=
0
;
i
<
S
;
++
i
)
{
set
<
int
>
cols
;
vector
<
int
>
cols_v
;
for
(
int
j
=
0
;
j
<
T
;
++
j
)
{
cols
.
insert
(
group
[
i
].
coords
[
j
]);
cols_v
.
push_back
(
group
[
i
].
coords
[
j
]);
}
const
int
s
=
e
()
%
S
;
citem
nw
;
if
(
s
!=
i
)
{
for
(
int
j
=
0
;
j
<
T
;
++
j
)
{
if
(
cols
.
find
(
group
[
s
].
coords
[
j
])
==
cols
.
end
())
{
cols_v
.
push_back
(
group
[
s
].
coords
[
j
]);
cols
.
insert
(
group
[
s
].
coords
[
j
]);
}
}
const
size_t
sz_set
=
cols_v
.
size
();
for
(
int
b
=
0
;
b
<
T
;
++
b
)
{
const
int
take
=
e
()
%
(
sz_set
-
b
);
auto
iter
=
cols_v
.
begin
()
+
take
;
nw
.
coords
[
b
]
=
*
iter
;
cols_v
.
erase
(
iter
);
}
nw
.
good
=
nw
.
cal_good
(
data
);
nw
.
sort
();
#pragma omp critical
new_group
.
push_back
(
nw
);
}
}
//复制
std
::
copy
(
new_group
.
begin
(),
new_group
.
end
(),
back_inserter
(
group
));
new_group
.
clear
();
const
size_t
S2
=
group
.
size
();
//变异
#pragma omp parallel for
for
(
size_t
i
=
0
;
i
<
S2
;
++
i
)
{
const
int
b
=
e
()
%
T
;
citem
nw
=
group
[
i
];
bool
failed
=
false
;
do
{
nw
.
coords
[
b
]
=
e
()
%
C
;
failed
=
false
;
for
(
int
k
=
0
;
k
<
T
&&
!
failed
;
++
k
)
if
(
nw
.
coords
[
b
]
==
nw
.
coords
[
k
]
&&
b
!=
k
)
failed
=
true
;
}
while
(
failed
);
nw
.
good
=
nw
.
cal_good
(
data
);
nw
.
sort
();
#pragma omp critical
new_group
.
push_back
(
nw
);
}
std
::
copy
(
new_group
.
begin
(),
new_group
.
end
(),
back_inserter
(
group
));
new_group
.
clear
();
//增补
for
(
int
i
=
0
;
i
<
S
/
4
;
++
i
)
{
citem
tmp
;
for
(
int
j
=
0
;
j
<
T
;
++
j
)
{
bool
failed
=
false
;
do
{
tmp
.
coords
[
j
]
=
e
()
%
C
;
failed
=
false
;
if
(
j
)
{
for
(
int
k
=
0
;
k
<
j
&&
!
failed
;
++
k
)
if
(
tmp
.
coords
[
k
]
==
tmp
.
coords
[
j
])
failed
=
true
;
}
}
while
(
failed
);
}
tmp
.
sort
();
tmp
.
good
=
tmp
.
cal_good
(
data
);
if
(
group_set
.
find
(
tmp
)
==
group_set
.
end
())
{
group_set
.
insert
(
tmp
);
group
.
push_back
(
tmp
);
}
else
--
i
;
}
//排序
sort
(
group
.
begin
(),
group
.
end
(),
[](
const
citem
&
t1
,
const
citem
&
t2
)
->
bool
{
return
t1
.
good
>
t2
.
good
;
});
//淘汰
if
(
g
%
4
==
0
)
{
group_set
.
clear
();
int
kept
=
0
;
for
(
auto
p
=
group
.
begin
();
p
!=
group
.
end
()
&&
kept
<
S
;
++
p
)
{
if
(
group_set
.
find
(
*
p
)
==
group_set
.
end
())
{
new_group
.
push_back
(
*
p
);
group_set
.
insert
(
*
p
);
++
kept
;
}
}
group
=
new_group
;
}
//输出
cout
<<
"Iter "
<<
g
<<
":"
;
group
.
begin
()
->
output
();
}
delete
[]
data
;
data
=
nullptr
;
return
0
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录