找回密码
 注册
Simdroid-非首页
查看: 94|回复: 0

【讨论】用0-1规划求解八皇后问题

[复制链接]
发表于 2011-1-19 15:54:37 | 显示全部楼层 |阅读模式 来自 河北廊坊
前段时间写过剔除法求解八皇后问题,可以求出所有解,今天用0-1规划写了一个程序,每次只能求出一个解

  1. clear;clc;close all
  2. N=8;
  3. c=ones(N);
  4. % 行求和
  5. blkele=num2cell(c,2);
  6. A1=blkdiag(blkele{:});
  7. % 列求和
  8. A2=repmat(eye(N),1,N);
  9. Aeq=[A1;A2];
  10. beq=ones(2*N,1);
  11. % 斜线情况判断
  12. M=N-2;
  13. A=zeros(4*M+2,N*N);
  14. d{1}=arrayfun(@(i)find(diag(diag(c,i),i)),-M:M,'UniformOutput',0);
  15. d{2}=arrayfun(@(i)find(fliplr(diag(diag(c,i),i))),-M:M,'UniformOutput',0);
  16. d0=cat(1,d{:});
  17. linearIndex=arrayfun(@(x)sub2ind(size(A),x+zeros(1,length(d0{x})),...
  18.     d0{x}'),1:numel(d0),'UniformOutput',0);
  19. A(cell2mat(linearIndex))=1;
  20. b=ones(4*M+2,1);
  21. x=bintprog([],A,b,Aeq,beq);
  22. Res=reshape(x,[],N);
复制代码

下面是我用lingo写的一个版本,还有待改进

  1. model:
  2. sets:
  3. Node/1..8/:N;
  4. link(Node,Node):x;
  5. plus1/1..15/:;
  6. minus1/1..6/:;
  7. endsets
  8. @for(Node(i):@sum(Node(j):x(i,j))=1);
  9. @for(Node(j):@sum(Node(i):x(i,j))=1);
  10. @for(plus1(k)|k#ge#3:@sum(link(i,j)|i+j#eq#k:x(i,j))<1);
  11. @for(minus1(k):@sum(link(i,j)|i-j#eq#k:x(i,j))<1);
  12. @for(minus1(k):@sum(link(i,j)|j-i#eq#k:x(i,j))<1);
  13. @sum(Node(i):x(i,i))<1;
  14. @for(link(i,j):@bin(x(i,j)));
复制代码

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-5 03:31 , Processed in 0.038432 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表