商人过河数学模型求源程序

题目:三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己滑行。随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货。但是如何乘船渡船的大权掌握在商人手中,商人们怎么样才能安全渡河?

求解:
数学模型:记第k次渡河前此岸的商人人数为Xk,随从人数为Yk,k=1,2,3...。将二维向量Sk=(Xk,Yk)定义为状态。安全渡河条件下的状态集合称为允许状态集合,记做S.不难写出

s={(x,y)|x=0,y=0,1,2,3;x=3,y=0,1,2,3;x=y=1,2}     {1}

记第k次渡船上的商人人数为Uk,随从人数为Vk。将二维向量dk=(Uk,Vk)定义为决策。允许决策集合记做D,由小船的容量可知

D={(u,v)|u+v=1,2}   {2}

因为k为奇数时船从此岸驶向彼岸,k为偶数时船由彼岸驶回此岸,所以状态sk随决策dk变化的规律是:

S(k+1)=Sk+(-1)^k*dk    {3}

{3}式称为状态转移律。所以,制定安全渡河方案归结为如下的多步决策问题:
求决策dk属于D(k=1,2,3,...,n),使状态sk属于S按照转移律{3},由初始状态s1=(3,3)经有限步n到达状态s(n+1)=(0,0)

要求设计一程序,按照上面思路求解,代码最好为c++  (完)  

 录入:逸天 qq:12872678 e-mail:nutting@163.com  2004.07.27
摘自:数学模型(第二版) 姜启源 编 高等教育出版社 isbn 7-04-004502-2


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
商人问题可以使用数学建模来解决,而MATLAB是一个非常适合进行数学建模和计算的工具。下面是一个使用MATLAB进行商人问题数学建模的示例: 首先,我们可以使用二进制向量来表示商人、野人和船的位置状态,其中0表示左岸,1表示右岸。假设商人和野人的数量分别为M和N。 下面是MATLAB代码示例: % 商人和野人的数量 M = 3; N = 3; % 初始状态(左岸) initial_state = [ones(1, M+N), 0]; % 目标状态(右岸) target_state = [zeros(1, M+N), 1]; % 状态转移规则函数 state_transition = @(state, action) state + action; % 判断状态是否合法 is_valid_state = @(state) ... all(state(1:M) >= state(M+1:end) | state(1:M) == 0) && ... all(state(M+1:end) >= state(1:M) | state(M+1:end) == 0); % 判断是否达到目标状态 is_goal_state = @(state) all(state == target_state); % 使用递归函数解决问题 solution = recursive_solve(initial_state, []); % 递归函数 function solution = recursive_solve(state, path) % 如果已经达到目标状态,则返回路径 if is_goal_state(state) solution = path; return; end % 遍历所有可能的动作 actions = generate_actions(state); for i = 1:size(actions, 1) action = actions(i, :); % 计算新状态 new_state = state_transition(state, action); % 如果新状态合法,则继续递归解 if is_valid_state(new_state) solution = recursive_solve(new_state, [path; action]); % 如果找到解,则返回 if ~isempty(solution) return; end end end % 如果找不到解,则返回空 solution = []; end % 生成所有可能的动作 function actions = generate_actions(state) M = sum(state(1:end-1) == 1); N = sum(state(1:end-1) == 0); % 动作格式:[商人移动数 野人移动数 船移动方向] % 商人独自移动 actions = [-1 0 -1; -2 0 -1; 1 0 1; 2 0 1]; % 野人独自移动 actions = [actions; 0 -1 -1; 0 -2 -1; 0 1 1; 0 2 1]; % 商人和野人一起移动 for i = 1:M for j = 1:N if i + j <= 2 actions = [actions; -i -j -1; i j 1]; end end end end 这个示例代码使用了递归解的方法来找到商人问题的解。代码中的state_transition函数定义了状态转移规则,is_valid_state函数判断状态是否合法,is_goal_state函数判断是否达到目标状态。generate_actions函数生成所有可能的动作。 注意:这只是商人问题的一个简单数学建模示例,实际问题可能需要更多的约束和复杂的规则。你可以根据具体需进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值