【算法思想】过河问题(续)

简介:        前一篇文章用人、狗、鸡、米过河问题介绍了解决过河问题的普适解决方法以及其改进算法。本文先用该算法解决我们常见的六只老虎过河问题,然后用特殊方法解决另外一种过河问题。
       前一篇文章用人、狗、鸡、米过河问题介绍了解决过河问题的普适解决方法以及其改进算法。本文先用该算法解决我们常见的六只老虎过河问题,然后用特殊方法解决另外一种过河问题。
六只老虎过河问题:
     问题描述 有三 大虎 ( b c)  好母子三对。 要过一条河 条船 最多 能载两 知三 大虎 船。 限制条 , 的母 小虎才能与其他母虎同船 同岸或岸边 遭遇 问怎 样往返渡船 才能 使 六只 平安过河?
     问题分析:这是一个具有趣味性的数学问题,答案有多个,方法也可以不同。用上一篇文章中的算法来分析:我们可以用一个六维向量来表示所有可能的状态向量,用一个二维向量来表示船上状态的运算向量。过河就是这些可能的状态向量与运算向量进行异或运算。我们用前一篇文章的图论法来解决的话,就是将每一个状态向量作为图的一个顶点,如果一个状态向量能够与另一个状态向量能够通过与运算向量(有限制)相乘得到,就将这两个状态向量用一条边连接起来,这样我们就可以得到一个图。
     问题解决:我们可以枚举出可能的状态向量和运算向量:
       运算变量:  c =
     1     1     0     0     0     0
     1     0     1     0     0     0
     0     1     1     0     0     0
     1     0     0     1     0     0
     0     1     0     0     1     0
     0     0     1     0     0     1
     0     0     0     1     1     0
     0     0     0     1     0     1
     1     0     0     0     0     0
     0     1     0     0     0     0
     0     0     1     0     0     0
     0     0     0     1     0     0
                                                                                    
      状态向量: ab =
     1     1     1     1     1     1
     1     1     1     1     1     0
     1     1     1     1     0     1
     1     1     1     0     1     1
     1     1     1     1     0     0
     1     1     1     0     0     1
     1     1     1     0     1     0
     1     1     1     0     0     0
     1     1     0     1     1     0
     1     0     1     1     0     1
     0     1     1     0     1     1
     0     0     0     0     0     0
     0     0     0     0     0     1
     0     0     0     0     1     0
     0     0     0     1     0     0
     0     0     0     0     1     1
     0     0     0     1     1     0
     0     0     0     1     0     1
     0     0     0     1     1     1
     0     0     1     0     0     1
     0     1     0     0     1     0
     1     0     0     1     0     0

有了状态变量和运算变量后,我们就可以根据前面的算法构造图,然后通过图的最短路径算法求解得到,由于时间有限,并且前一篇文章已经实现,我就不再实现了。下面讲一下,算法中应该注意的地方:
   1、考虑运算变量的选取限制
for i=1:length(ab)%ab是状态向量的集合
    result(:,:,i)=xor(repmat(ab(i,:),12,1),c);%将ab(i,:)的内容复制12遍,从而与c的维数相同,并且进行异或运算
    [x(i,:),y(i,:)]=ismember(result(:,:,i),ab,'rows');%判断异或运算的结果向量是否在可能的状态变量中
    %下面的方法是考虑运算变量选取的限制问题
    mark=[];
    for j=1:length(c)
        a1=find(ab(i,:));%找到状态向量中为1的位置
        a2=find(ab(i,:)==0);%找到状态向量中为0的位置
        if(sum(c(j,a1)>=1)&&sum(c(j,a2)>=1))%这里是运算变量的限制条件
            mark=[mark j];%将不符合条件的向量标记出来
        end
    end
    x(i,mark)=0;%祛除不符合的运算向量
    y(i,mark)=0;
    
end
根据上面的程序我们可以得到哪些状态向量是可以通过运算向量进行转化的。其中y是一个22*12的矩阵:
y =
     0     0     0    11    10     9     6     7     0     0     0     4
     0     0     0     0     0     0     8     0     0     0     9     7
     0     0     0     0     0     0     0     8     0    10     0     6
     0     0     0     0     0     0     0     0    11     0     0     1
     0     0    22     0     0     0     0     0     0     0     0     8
    20     0     0     0     0     0     1     0     0     0     0     3
     0    21     0     0     0     0     0     1     0     0     0     2
     0     0     0     0     0     0     2     3     0     0     0     5
    17     0     0    21    22     1     0     0     0     0     2     0
     0    18     0    20     1    22     0     0     0     3     0     0
     0     0    16     1    20    21     0     0     4     0     0     0
     0     0     0    22    21    20    17    18     0     0     0    15
     0     0     0     0     0     0    19     0     0     0    20    18
     0     0     0     0     0     0     0    19     0    21     0    17
     0     0     0     0     0     0     0     0    22     0     0    12
     0     0    11     0     0     0     0     0     0     0     0    19
     9     0     0     0     0     0    12     0     0     0     0    14
     0    10     0     0     0     0     0    12     0     0     0    13
     0     0     0     0     0     0    13    14     0     0     0    16
     6     0     0    10    11    12     0     0     0     0    13     0
     0     7     0     9    12    11     0     0     0    14     0     0
     0     0     5    12     9    10     0     0    15     0     0     0
虽然说上面限制了运算变量的选取,但是还需要满足一个条件: 奇数时,状态变量为1的位置,运算变量对应位置才可以为1;偶数时,状态变量为0的位置,运算变量对应的位置才可以为0,这里是编程需要注意的,本文中没有考虑。
2、如何构造邻接矩阵
y(1,4)=10说明第1个状态向量可以通过与运算向量异或变成第11个运算向量。因此我们可以根据该图构造邻接矩阵。那么我们如何将上面的矩阵变成c语言形式的数组了,只需要在上面程序添加下面三句:
   fid = fopen('y.txt','wt');
   fpr intf(fid, '{%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d},\n' ,y');
   fclose(fid)
得到的txt文件如下:

对于该问题的结果,我就不在给出了,百度上都有结果。下面介绍比较特别的算法。

2.商人、随从过河问题
   问题提出: 各带一 名随从要 最多 纳两人的小船 们密 在河的 任何 要他们的人 数超过 杀人 越货 乘船 的安 权属于 人知这项密 你为 定一种 安全渡河方 .
   问题分析:我们同样可以用前面提到的状态转移的图论算法来求解。但是我们可以根据该问题的特殊型来用巧妙的解法:我们可以用坐标轴的方法来求解。假设x轴代表商人的个数,y轴代表随从的个数,可行的状态如下坐标轴的黑点。我们的目的就是从(3,3)到(0 , 0)点。由于小船容纳两人,则在坐标轴中,表示我们可以沿坐标线走一步、或则两步。奇数步时,是将人运到对岸,岸这边的人数是减少的,因此这时只能向左走,或则向下走,偶数步时,反之亦然。图解如下:

从上图可以看出,过河方案为:(3,3)---->(3,1)---->(3,2)---->(3,0)---->(3,1)---->(1,1)---->(2,2)---->(0,2)---->(0,3)---->(0,1)---->(0,2)---->(0,0)









目录
相关文章
|
机器学习/深度学习 人工智能 算法
【算法编程】过河问题
    今天偶尔想到了过河问题。记得读小学六年级的时候第一次接触到这个问题--六个老虎过河问题(百度上有详细介绍,本文解决的是一个简单的问题,下一篇文章中将讨论该问题),当时都是从逻辑思维的方法得到正确的解决方法。
1228 0
|
7天前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
7天前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
101 68
|
16天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
29天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
169 80
|
17天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
17天前
|
算法
基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真
本设计基于龙格库塔算法对锅炉单相受热管进行建模与MATLAB数值仿真,简化为喷水减温器和末级过热器组合,考虑均匀传热及静态烟气处理。使用MATLAB2022A版本运行,展示自编与内置四阶龙格库塔法的精度对比及误差分析。模型涉及热传递和流体动力学原理,适用于优化锅炉效率。
|
15天前
|
移动开发 算法 计算机视觉
基于分块贝叶斯非局部均值优化(OBNLM)的图像去噪算法matlab仿真
本项目基于分块贝叶斯非局部均值优化(OBNLM)算法实现图像去噪,使用MATLAB2022A进行仿真。通过调整块大小和窗口大小等参数,研究其对去噪效果的影响。OBNLM结合了经典NLM算法与贝叶斯统计理论,利用块匹配和概率模型优化相似块的加权融合,提高去噪效率和保真度。实验展示了不同参数设置下的去噪结果,验证了算法的有效性。
|
14天前
|
算法 决策智能
基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法
本项目基于MATLAB2022A,使用模拟退火(SA)和蚁群优化(ACO)算法求解旅行商问题(TSP),对比两者的仿真时间、收敛曲线及最短路径长度。SA源于金属退火过程,允许暂时接受较差解以跳出局部最优;ACO模仿蚂蚁信息素机制,通过正反馈发现最优路径。结果显示SA全局探索能力强,ACO在路径优化类问题中表现优异。
|
23天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。