matlab编程实践14、15

news2024/11/16 7:00:34

目录

数独

"四独"游戏

解的存在和唯一性

算法

常微分方程 


数独


        采用蛮力试凑法来解决数独问题。(采用单选数,以及计算机科学技术中的递推回溯法

        以上的数独是图14-2的两个矩阵的和,左侧的矩阵可以由kron和magic函数建立起来,前一个函数用来求Kronecker乘积,后者生成幻方矩阵。

X = kron(eye(3), magic(3))


"四独"游戏


        使用4×4网格,可能的备选项用小数标注出来。将单选数填在网格内,如果没有单选数,则采用递归回溯法来求解。(左:有单选数; 右:无单选数)

 

X=diag(1:4)
Y=shidoku(diag(1:4))
Z=shidoku(diag(1:4)')'  %可能的另一个解

解的存在和唯一性


        可以用sudoku_all程序来寻找数独全部的解。

%生成数独谜题
X=kron(eye(3), magic(3))
X=sudoku_puzzle(13)

        数独网格的一些运算可能改变其在图形用户界面中的显示,但不能改变其基本特性。所有变化基本上都是相同的数字谜。这些等效的运算可以用matlab的数组运算表示。

%重新排列表示数字的文字
p = randperm(9), z=find(X>0). X(z)=p(X(z))
%其它运算
X', rot90(X, k)
flipud(X), fliplr(X),X([4:9 1:3], :)
X(:, randperm(3) 4:9)
function L = sudoku_all(X,L)
% SUDOKU_ALL  Enumerate all solutions to a Sudoku puzzle.
%   L = sudoku_all(X), for a 9-by-9 array X, is a list of all solutions.
%   L{k} is the k-th solution.
%   L{:} will print all the solutions.
%   length(L) is the number of solutions.  A valid puzzle must have only one.
%   See also sudoku, sudoku_basic, sudoku_puzzle, sudoku_assist.

   if nargin < 2
      % Initialize the list on first entry.
      L = {};
   end

   % Fill in all "singletons", the cells with only one candidate.
   % C is the array of candidates for each cell.
   % N is the vector of the number of candidates for each cell.
   % s is the index of the first cell with the fewest candidates.

   [C,N] = candidates(X);
   while all(N>0) & any(N==1)
      s = find(N==1,1);
      X(s) = C{s};
      [C,N] = candidates(X);
   end

   % Add a solution to the list.

   if all(X(:)>0)
      L{end+1} = X;
   end
   
   % Enumerate all possible solutions.

   if all(N>0)
      Y = X;
      s = find(N==min(N),1);
      for t = [C{s}]                    % Iterate over the candidates.
         X = Y;
         X(s) = t;                      % Insert a value.
         L = sudoku_all(X,L);           % Recursive call.
      end
   end

% ------------------------------

   function [C,N] = candidates(X)
      % C = candidates(X) is a 9-by-9 cell array of vectors.
      % C{i,j} is the vector of allowable values for X(i,j).
      % N is a row vector of the number of candidates for each cell.
      % N(k) = Inf for cells that already have values.
      tri = @(k) 3*ceil(k/3-1) + (1:3);
      C = cell(9,9);
      for j = 1:9
         for i = 1:9
            if X(i,j)==0
               z = 1:9;
               z(nonzeros(X(i,:))) = 0;
               z(nonzeros(X(:,j))) = 0;
               z(nonzeros(X(tri(i),tri(j)))) = 0;
               C{i,j} = nonzeros(z)';
            end
         end
      end
      N = cellfun(@length,C);
      N(X>0) = Inf;
      N = N(:)';
   end % candidates
end % sudoku_all

算法


基本流程:

① 填入所有的单选数

②如果某个单元没有备选项,停止程序

③在某个空白的网格中填入一个试探的值

④ 递归式调用此程序

 

function [X,steps] = sudoku(X,steps)
% SUDOKU  Solve a Sudoku puzzle using recursive backtracking.
%   sudoku(X), for a 9-by-9 array X, solves the Sudoku puzzle for X.
%   [X,steps] = sudoku(X) also returns the number of steps.
%   See also sudoku_all, sudoku_assist, sudoku_basic, sudoku_puzzle. 

   if nargin < 1
      X = sudoku_puzzle(1);
   end
   if nargin < 2
      steps = 0;
      gui_init(X);
   end
   sudoku_gui(X,steps);

   % Fill in all "singletons", the cells with only one candidate.
   % C is the array of candidates for each cell.
   % N is the vector of the number of candidates for each cell.
   % s is the index of the first cell with the fewest candidates.

   [C,N] = candidates(X);
   while all(N>0) & any(N==1)
      sudoku_gui(X,steps,C);
      s = find(N==1,1);
      X(s) = C{s};
      steps = steps + 1;
      sudoku_gui(X,steps,C);
      [C,N] = candidates(X);
   end
   sudoku_gui(X,steps,C);
   
   % Recursive backtracking.

   if all(N>0)
      Y = X;
      s = find(N==min(N),1);
      for t = [C{s}]                        % Iterate over the candidates.
         X = Y;
         sudoku_gui(X,steps,C);
         X(s) = t;                          % Insert a tentative value.
         steps = steps + 1;
         sudoku_gui(X,steps,C,s);           % Color the tentative value.

         [X,steps] = sudoku(X,steps);       % Recursive call.

         if all(X(:) > 0)                   % Found a solution.
            break
         end
         sudoku_gui(X,steps,C,-s);          % Revert color of tentative value.
      end
   end
   if nargin < 2
      gui_finish(X,steps);
   end

% ------------------------------

   function [C,N] = candidates(X)
      % C = candidates(X) is a 9-by-9 cell array of vectors
      % C{i,j} is the vector of allowable values for X(i,j).
      % N is a row vector of the number of candidates for each cell.
      % N(k) = Inf for cells that already have values.
      tri = @(k) 3*ceil(k/3-1) + (1:3);
      C = cell(9,9);
      for j = 1:9
         for i = 1:9
            if X(i,j)==0
               z = 1:9;
               z(nonzeros(X(i,:))) = 0;
               z(nonzeros(X(:,j))) = 0;
               z(nonzeros(X(tri(i),tri(j)))) = 0;
               C{i,j} = nonzeros(z)';
            end
         end
      end
      N = cellfun(@length,C);
      N(X>0) = Inf;
      N = N(:)';
   end % candidates

% ------------------------------

   function gui_init(X)

      % Initialize gui
      % H is the structure of handles, saved in figure userdata.

      dkblue = [0 0 2/3];
      dkgreen = [0 1/2 0];
      dkmagenta = [1/3 0 1/3];
      grey = [1/2 1/2 1/2];
      fsize = get(0,'defaulttextfontsize');
      fname = 'Lucida Sans Typewriter';
      clf
      shg
      set(gcf,'color','white')
      axis square
      axis off
      
      for m = [2 3 5 6 8 9]
         line([m m]/11,[1 10]/11,'color',grey)
         line([1 10]/11,[m m]/11,'color',grey)
      end
      for m = [1 4 7 10]
         line([m m]/11,[1 10]/11,'color',dkmagenta,'linewidth',4)
         line([1 10]/11,[m m]/11,'color',dkmagenta,'linewidth',4)
      end
   
      H.a = zeros(9,9);
      for j = 1:9
         for i = 1:9
            if X(i,j) > 0
               string = int2str(X(i,j));
               color = dkblue;
            else
               string = ' ';
               color = dkgreen;
            end
            H.a(i,j) = text((j+1/2)/11,(10.5-i)/11,string, ...
              'units','normal','fontsize',fsize+6,'fontweight','bold', ...
              'fontname',fname,'color',color,'horizont','center');
         end
      end
      strings = {'step','slow','fast','finish'};
      H.b = zeros(1,4);
      for k = 1:4
         H.b(k) = uicontrol('style','toggle','string',strings{k}, ...
            'units','normal','position',[(k+3)*0.125,0.05,0.10,0.05], ...
            'background','white','value',0, ...
            'callback', ...
            'H=get(gcf,''user''); H.s=find(H.b==gco); set(gcf,''user'',H)');
      end
      set(H.b(1),'style','pushbutton')
      H.s = 1;
      H.t = title('0','fontweight','bold');
      set(gcf,'userdata',H)
      drawnow

   end % gui_init

% ------------------------------

   function sudoku_gui(X,steps,C,z)

      H = get(gcf,'userdata');
      if H.s == 4
         if mod(steps,50) == 0
            set(H.t,'string',int2str(steps))
            drawnow
         end
         return
      else
         set(H.t,'string',int2str(steps))
      end
      k = [1:H.s-1 H.s+1:4];
      set(H.b(k),'value',0);
      dkblue = [0 0 2/3];
      dkred = [2/3 0 0];
      dkgreen = [0 1/2 0];
      cyan = [0 2/3 2/3];
      fsize = get(0,'defaulttextfontsize');

      % Update entire array, except for initial entries.

      for j = 1:9
         for i = 1:9
            if ~isequal(get(H.a(i,j),'color'),dkblue) && ...
               ~isequal(get(H.a(i,j),'color'),cyan)
               if X(i,j) > 0
                  set(H.a(i,j),'string',int2str(X(i,j)),'fontsize',fsize+6, ...
                     'color',dkgreen)
               elseif nargin < 3
                  set(H.a(i,j),'string',' ')
               elseif length(C{i,j}) == 1
                  set(H.a(i,j),'string',char3x3(C{i,j}),'fontsize',fsize-4, ...
                     'color',dkred)
               else
                  set(H.a(i,j),'string',char3x3(C{i,j}),'fontsize',fsize-4, ...
                     'color',dkgreen)
               end
            end
         end
      end
      if nargin == 4
         if z > 0
            set(H.a(z),'color',cyan)
         else
            set(H.a(-z),'color',dkgreen)
            return
         end
      end

      % Gui action = single step, brief pause, or no pause

      switch H.s
         case 1
            H.s = 0;
            set(gcf,'userdata',H);
            while H.s == 0;
               drawnow
               H = get(gcf,'userdata');
            end
         case 2
            pause(0.5)
         case 3
            drawnow
      end
      if nargin == 4
         if z > 0
            set(H.a(z),'color',cyan)
         else
            set(H.a(-z),'color',dkgreen)
            return
         end
      end

      % ------------------------------
   
      function s = char3x3(c)
         % 3-by-3 character array of candidates.
         b = blanks(5);
         s = {b; b; b};
         for k = 1:length(c)
            d = c(k);
            p = ceil(d/3);
            q = 2*mod(d-1,3)+1;
            s{p}(q) = int2str(d);
         end
      end

   end % gui

% ------------------------------

   function gui_finish(X,steps)
 
      H = get(gcf,'userdata');
      H.s = 2;
      set(H.b(1:3),'vis','off')
      set(gcf,'userdata',H)
      set(H.b(4),'string','close','value',0, ...
         'callback','close(gcf)')
      sudoku_gui(X,steps)
    
   end % gui_finish

end % sudoku

        备选项计算&数独题目生成:

%% Candidates备选项计算

% C = candidates(X) 为向量数组构成的单元结构
% C{i,j} 为 X(i,j)构成的集合

   C = cell(9,9);
   tri = @(k) 3*ceil(k/3-1) + (1:3);
   for j = 1:9
      for i = 1:9
         if X(i,j)==0
            z = 1:9;
            z(nonzeros(X(i,:))) = 0;
            z(nonzeros(X(:,j))) = 0;
            z(nonzeros(X(tri(i),tri(j)))) = 0;
            C{i,j} = nonzeros(z)';
         end
      end
   end
   C

%% First singleton and first empty. 第一个单选数,第一个空白网格

% N = number of candidates in each cell.
% s = first cell with only one candidate.
% e = first cell with no candidates.

   N = cellfun(@length,C)
   s = find(X==0 & N==1,1)
   e = find(X==0 & N==0,1)

%% Sudoku puzzles 数独题目生成

   help sudoku_puzzle

   for p = 1:16
      sudoku_puzzle(p)
   end

常微分方程 


        matlab提供了很多求给定常微分方程数组近似解的函数,这一常微分方程组数值解的函数包括ode23、ode45、ode113、ode23s、ode15s、ode23t、ode23tb函数名中的数字表示所用算法的阶次,阶次和算法的复杂程度和精度有关。所有这些函数都会自动选择近似步长,来保证预先选择的精度要求。所选择的阶次越高,每一步计算量越大,但是所用的步长也越大。比如ode23算法比较二阶和三阶算法来估计计算步长,而ode45比较的是四阶和五阶算法。

        s表示为stiff 刚性微分方程的求解函数。

        微分方程求解程序库提供的求解函数都至少需要下面三个输入变元:

(1)F为定义微分方程组的函数

(2)tspan为描述积分区间的向量

(3) y0为初始值的向量

ode1的算法-误差较大

function [t,y] = ode1(F,tspan,y0)
% ODE1  World's simplest ODE solver.
%   ODE1(F,[t0,tfinal],y0) uses Euler's method to solve
%      dy/dt = F(t,y)
%   with y(t0) = y0 on the interval t0 <= t <= tfinal.

t0 = tspan(1);
tfinal = tspan(end);
h = (tfinal - t0)/200;
y = y0;
for t = t0:h:tfinal
   ydot = F(t,y);
   y = y + h*ydot;
end

匿名函数生成微分方程:

    acircle = @(t,y) [y(2); -y(1)];

ode23求解

%% ODE23 Automatic Plotting.
    figure
    tspan = [0 2*pi];
    y0 = [0; 1];
    ode23(acircle,tspan,y0)

%% Phase Plot.
    figure
    tspan = [0 2*pi];
    y0 = [0; 1];
    [t,y] = ode23(acircle,tspan,y0)
    plot(y(:,1),y(:,2),'-o')
    axis square
    axis([-1.1 1.1 -1.1 1.1])

%% ODE23 Automatic Phase Plot.
    opts = odeset('outputfcn',@odephas2)
    ode23(acircle,tspan,y0,opts)
    axis square
    axis([-1.1 1.1 -1.1 1.1])

odeset

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/818061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试之性能测试实施流程

软件测试之性能测试实施流程&#xff1a; 1.测试需求分析 测试需求分析是整个性能测试的基础&#xff0c;在这一阶段测试负责人要和项目干系人进行沟通&#xff0c;同时手机各种项目资料&#xff0c;尤其要搞清楚用户对待性能测试的核心需求。 测试需求分析阶段的主要任务是确…

小红书2020校招测试开发后端笔试题卷三

//完全背包求组合数 #include <iostream> #include<vector> #include<set> #include<map> #include<algorithm> using namespace std; int value[300]; // vector<int>vis; // vector<int>vis1; map<vector<int>,int>m…

Verilog语法学习——LV3_奇偶校验

LV3_奇偶校验 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 题目描述&#xff1a; 现在需要对输入的32位数据进行奇偶校验,根据sel输出校验结果&#xff0…

【GITHUB】FlipIt – Windows的开源翻页时钟

FlipIt 是一款免费开源的翻页时钟应用&#xff0c;专为 Windows 平台设计。该应用灵感来源于备受喜爱的老牌翻页时钟应用 Fliqlo&#xff0c;后者被公认为经典的翻页时钟屏保。然而&#xff0c;由于 Fliqlo 是基于 Flash 技术开发的&#xff0c;随着微软最近正式禁用 Flash&…

《cuda c编程权威指南》03 - cuda小功能汇总

1. 计时 1.1 linux #include <sys/time.h>double cpuSecond() {struct timeval tp;gettimeofday(&tp, NULL);return ((double)tp.tv_sec (double)tp.tv_usec*1e-6); }// 调用 double start cpuSecond(); kernel_name << <grid, block >> > (ar…

防火墙监控工具

防火墙监控是跟踪在高效防火墙性能中起着关键作用的重要防火墙指标&#xff0c;防火墙监控通常应包括&#xff1a; 防火墙日志监控防火墙规则监控防火墙配置监控防火墙警报监控 防火墙监控服务的一个重要方面是它应该是主动的。主动识别内部和外部安全威胁有助于在早期阶段识…

CompletableFuture使用详解(全网看这一篇就行)

CompletableFuture是jdk8的新特性。CompletableFuture实现了CompletionStage接口和Future接口&#xff0c;前者是对后者的一个扩展&#xff0c;增加了异步会点、流式处理、多个Future组合处理的能力&#xff0c;使Java在处理多任务的协同工作时更加顺畅便利。 一、创建异步任务…

element-tree-line el-tree 添加结构线 添加虚线

概览&#xff1a;给element组件添加上虚线&#xff0c;通过使用插件element-tree-line 参考连接&#xff1a; 参考别人的博客 安装插件&#xff1a; # npm npm install element-tree-line -S # yarn yarn add element-tree-line -S main.js全局注册引入插件&#xff1a; imp…

《翻开收藏夹,拾起行动的力量》

文章目录 每日一句正能量前言分享一道收藏的好题分享一个收藏的便捷技巧积灰这么久&#xff0c;这个当时被收藏的东西对现在的你还有用吗&#xff1f;后记 每日一句正能量 很喜欢一个字&#xff0c;淡&#xff0c;平淡的淡&#xff0c;其实很不平淡&#xff0c;蕴含着很多人生哲…

巨人互动|Google海外户Google SEO关键词工具有哪些?

Google SEO是网站优化的重要工具之一&#xff0c;可以通过优化关键词来提升网站在搜索引擎结果页面的排名。而Google SEO关键词工具是帮助网站管理员和营销人员找到最有效关键词的工具。Google SEO关键词工具是一组被广泛使用的在线工具&#xff0c;可以帮助网站管理员和营销人…

初学者预算不多,千元内新手入门吉他推荐!恩雅X0和VEAZEN费森CLR300怎么样?全方面对比评测!

千元内入门吉他少不了VEAZEN费森CLR300单板系列和恩雅X0 HPL合板系列这两款热门系列&#xff0c;最近很多初学者朋友来私信&#xff0c;咨询这两款琴有什么优缺点&#xff0c;哪一款更值得初学者选购&#xff0c;那么今天&#xff0c;就以它们为本期的评测主角&#xff0c;全方…

阿里用户序列建模SIM

Search-based User Interest Modeling with Lifelong Sequential Behavior Data for Click-Through Rate Prediction 摘要 MIMN是工业解决方案中第一个可以对用户序列长度达到1000的数据进行建模。但MIMN无法精确捕获给定用户兴趣的特定候选项目时&#xff0c;长度为用户行为…

3.playbook剧本二

文章目录 playbook二Roles模块roles模式安装LNMP创建nginxfiles目录handlers目录tasks目录templates目录vars目录 创建mysqltasks目录 创建phpfiles目录handlers目录tasks目录templates目录vars目录 创建LNMP剧本文件 playbook二 Roles模块 角色的作用&#xff1a;把playbook…

海外网红营销:品牌如何借助网红力量打造口碑传播?

随着全球化的不断推进&#xff0c;品牌在海外市场的竞争日趋激烈。在这样的市场环境中&#xff0c;口碑成为品牌赢得消费者信任和忠诚度的重要手段。然而&#xff0c;在海外市场中树立良好的口碑并吸引目标受众&#xff0c;是一个充满挑战的任务。如今&#xff0c;随着社交媒体…

生产者消费者模型——条件变量与信号量

文章目录 模型条件变量信号量&#xff08;信号灯&#xff09;应用伪代码 模型 生产者、消费者用线程 容器用链表 条件变量 条件变量不是锁&#xff0c;可以控制线程阻塞与否&#xff0c;可以配合锁使用。 注意&#xff1a;当pthread_cond_wait(&cond, &mutex)使用时&…

【投资笔记】(23/7/31)下半年消费复苏的机会来了?

本文为本人投资逻辑验证&#xff0c;不作为任何建议&#xff1b; 政策面 汽车&#xff1a;&#xff08;一&#xff09;优化汽车购买使用管理&#xff08;二&#xff09;扩大新能源汽车消费&#xff0c;重点在于新能源汽车&#xff1b;房地产&#xff1a;&#xff08;三&#x…

TWILIGHT靶场详解

TWILIGHT靶场详解 下载地址&#xff1a;https://download.vulnhub.com/sunset/twilight.7z 这是一个比较简单的靶场&#xff0c;拿到IP后我们扫描发现开启了超级多的端口 其实这些端口一点用都没有&#xff0c;在我的方法中 但是也有不同的方法可以拿权限&#xff0c;就需要…

【数据分析专栏之Python篇】三、全网最细Numpy教程

文章目录 前言一、Numpy概述1.1 NumPy 简介1.2 NumPy 安装1.3 NumPy 操作 二、Ndarray 对象2.1 概述2.2 特点2.3 Ndarray类2.4 数据类型 三、Numpy 常用操作及函数3.1 数组属性3.2 创建数组3.3 数组维度变换3.4 ndarray数组的索引和切片3.5 ndarray数组的运算3.6 利用ndarray进…

记一次phpmyadmin巧妙利用

声明&#xff1a;文中涉及到的技术和工具&#xff0c;仅供学习使用&#xff0c;禁止从事任何非法活动&#xff0c;如因此造成的直接或间接损失&#xff0c;均由使用者自行承担责任。 点点关注不迷路&#xff0c;每周不定时持续分享各种干货。 原文链接&#xff1a;众亦信安&a…

辅助栈、单调栈与单调队列在lc中的应用

为什么要汇总在一块&#xff1f; 三者都有何区别&#xff1f; 总结 1 泛化性更好的策略 个人建议单调栈/队列中存放的元素最好是下标而不是值&#xff0c;因为有的题目需要根据下标计算&#xff0c;这样泛化性更好。参考lc239和lc496 2 单调队列何栈其实可以共用同一套模板…