使用分布式实现N皇后问题 erlang语言实现
来源:互联网 发布:java 英文日期转换 编辑:程序博客网 时间:2024/05/16 05:12
<未完>
对于N皇后问题的算法的设计一般都是基于c语言或者c++算法进行设计的回溯算法,但是当N的值很大的时候,这个时候如果要计算N皇后解的话,是比较费时间的,因此,可以采用并发的方式进行相应算法的设计,以此来提高效率。
下面的算法是使用c语言进行设计的回溯算法:
- #include <stdio.h>
- #include <stdlib.h>
- #define N 11
- int sum = 0;
- int x[N];
- int check(int k)
- {
- int i;
- for(i = 0; i < k; i++) {
- if(x[i]==x[k] || abs(k-i)==abs(x[k]-x[i])) {
- return 0;
- }
- }
- return 1;
- }
- //递归算法
- void Backtrack(int t)
- {
- int i;
- if(t > N) {
- sum = sum+1;
- printf("%d\n", sum);
- } else {
- for(i = 0; i < N; i++) {
- x[t] = i;
- if(check(t)) {
- Backtrack(t+1);
- }
- }
- }
- }
- int main()
- {
- Backtrack(4);
- printf("sum=%d\n", sum);
- return 0;
- }
使用erlang语言进行并行开发,代码的核心算法并未给出,待续完成。
%% nqueensbitv2.erl
-module(nqueensbitv2).
-export([start/1,startSearch/3,collect/3,startAllThread/1]).
-define(LOG(X), io:format("~p ~p ~p~n", [?MODULE, ?LINE, X])).
%% 模块的外部调用函数,开始计算N皇后的计算。
%% NQueens:表示的是皇后的个数。
start(NQueens) ->
%% 如果皇后个数小于4的话,不符合N皇后问题的计算,所以直接退出。
if(NQueens < 4) ->
io:format("Can't solve Nqueens problem less then 4.~n");
true ->
%% 创建一个收集处理的进程。
CollectID = spawn(?MODULE, collect, [[],0,self()]),
%% 创建NQeens个进程,每一个进程分别处理一种情况。
createNthreads(NQueens ,CollectID ,NQueens),
%% 上面的操作结束之后,该进程等待结束的消息。
receive
{finished,Solutions} ->
io:format("Find Solutions:~w.~n",[Solutions]);
_ ->
ok
end
end.
%% 收集处理进程所干的事情
%% ChildPIDS:记录已经创建好的进程的PID,是一个列表类型
%% Solutions:记录已经计算出来的N皇后问题的解的个数
%% ChildPIDS:记录此进程创建者PID,也就是start进程
collect(ChildPIDS,Solutions,ParentPID)->
receive
startChild ->
spawn(nqueensbitv2,startAllThread,[ChildPIDS]),
collect(ChildPIDS,Solutions,ParentPID);
{addchild,ChildP} ->
collect([ChildP|ChildPIDS],Solutions,ParentPID);
{finished,ChildP} ->
LeftPIDS = lists:delete(ChildP,ChildPIDS),
if(LeftPIDS == []) ->
ParentPID ! {finished,Solutions};
true ->
collect(LeftPIDS,Solutions,ParentPID)
end;
{found,SolutionPath} ->
collect(ChildPIDS,Solutions + 1,ParentPID);
{found,_} -> collect(ChildPIDS,Solutions + 1,ParentPID);
_ -> ok
end.
%% 创建N个进程,每一个进程都是相互独立的
createNthreads(_,CollectID,0) ->
CollectID ! startChild;
createNthreads(N,CollectID,Nthread) ->
?LOG(N),
?LOG(CollectID),
?LOG(Nthread),
ChildP = spawn(nqueensbitv2,startSearch,[N,CollectID,Nthread]),
CollectID ! {addchild,ChildP},
createNthreads(N,CollectID,Nthread - 1).
%% 启动创建好的计算进程,让其开始计算
startAllThread([]) -> ok;
startAllThread([Child|Childs]) -> ?LOG(Childs),
Child ! startSearch,
startAllThread(Childs).
%% 单个独立计算进程所进行的计算
startSearch(NQueens,CollectID,NthThread) ->
%% 核心算法
0
上一篇:抓不到的就放弃吧
下一篇:有关sizeof()的实现
相关热门文章
- linux 常见服务端口
- xmanager 2.0 for linux配置
- 【ROOTFS搭建】busybox的httpd...
- openwrt中luci学习笔记
- 什么是shell
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- 使用分布式实现N皇后问题 erlang语言实现
- C语言实现N皇后问题源代码
- N 皇后问题C语言实现
- 使用java语言实现八皇后问题
- N皇后问题的实现
- C++实现n皇后问题
- java实现N皇后问题
- 递归实现n皇后问题
- N皇后问题(python实现)
- Python实现N皇后问题
- N皇后问题,java实现
- [算法]经典算法8皇后(N皇后)问题的解法,C语言实现
- n皇后问题java递归实现
- n皇后问题java回溯实现
- N皇后问题的回溯法实现
- N皇后问题的递归回溯实现
- N皇后问题的简单实现
- java数组实现N皇后问题
- 有关dd命令的几个简单例子
- 利用strstr简单求最大字串
- 抓不到的就放弃吧
- CDR利用修剪命令将文字一分为二的两种方法
- http状态码一览
- 使用分布式实现N皇后问题 erlang语言实现
- 有关sizeof()的实现
- c++派生类对象赋值给基类对象
- 快速幂取模の子函數
- vim的一个配置文件
- MPAndroidChart 图表柱状图,折线图,和组合图
- 内核模块编程——打印一个进程的vm_area_struct
- 关于4G直播的运用,手机app直接控制编码器物联方式简化编码器的操作
- 怎么用CDR X8做出胶片效果
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
小雨伞折纸
雨伞的作用
幼儿园小雨伞
小雨伞制作方法
幼儿园手工小雨伞
谢谢你小雨伞
韩娱之幸福小雨伞
小雨伞的制作
蕾哈娜小雨伞
小雨伞提取shsh教程
如何制作小雨伞
中班儿歌小雨伞
fasola雨伞怎么样
如何使用小雨伞
小雨伞 shsh
雨中情雨伞
小雨伞手工制作图解
纸雨伞
rita小雨桑
雯雯小雨点
小雨点舞蹈
小雨点的故事
小雨点跳舞
小雨点沙沙沙
小雨点沙沙
小雨点日记
小雨点歌词
小雨点故事
小雨点电动车
小雨点琼瑶
琼瑶小雨点
顽皮的小雨点
雄迈小雨点
小雨点像什么
小雨点简谱
小雨点跳舞教案
小雨点图片
小雨滴歌词
小雨滴电动车
小雨滴app
绿水农家绕 疯狂小雨滴