商人随从渡河matlab,商人过河Matlab程序2

3名(或多名)商人各带一名随从乘船渡河,只有一条小船,且此船只能容纳2人,由他们自己划行,随从们密约,在河的任意岸,一旦随从人数比商人多,就杀商人,此密约被商人知道,如何乘船渡河的大权掌握在商人们手中,那么商人们应怎样安排每次乘船方案,才能安全渡河呢? function foot=merchant

1-16-png_6_0_0_135_223_12_18_892.979_1262.879-11-0-21-11.jpg

%%%%%%%%%%%%%%%%%%%%%% 程序开始需要知道商人数,仆人数,船的最大容量

1-16-png_6_0_0_135_246_12_18_892.979_1262.879-11-0-42-11.jpg

n=input('输入商人数目

1-16-png_6_0_0_135_270_12_18_892.979_1262.879-11-0-63-11.jpg

:');

nn=input('输入仆人数目

1-16-png_6_0_0_135_293_12_18_892.979_1262.879-11-0-84-11.jpg

:');

nnn=input('输入船的最大容量

1-16-png_6_0_0_135_316_12_18_892.979_1262.879-11-0-105-11.jpg

:');

if

1-16-png_6_0_0_135_340_12_18_892.979_1262.879-11-0-126-11.jpg

nn>n

n=input('输入商人数目

1-16-png_6_0_0_135_363_12_18_892.979_1262.879-11-0-147-11.jpg

:');

nn=input('输入仆人数目

1-16-png_6_0_0_135_387_12_18_892.979_1262.879-11-0-168-11.jpg

:');

nnn=input('输入船的最大容量

1-16-png_6_0_0_135_410_12_18_892.979_1262.879-11-0-189-11.jpg

:');

1-16-png_6_0_0_135_433_12_18_892.979_1262.879-11-0-210-11.jpg

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 决策生成

1-16-png_6_0_0_135_457_12_18_892.979_1262.879-11-0-231-11.jpg

jc=1; % 决策向量存放在矩阵“d”中,jc为插入新元素的行标初始为

1-16-png_6_0_0_135_480_12_18_892.979_1262.879-11-0-252-11.jpg

1

for

1-16-png_6_0_0_135_503_12_19_892.979_1262.879-11-0-273-11.jpg

i=0:nnn

1-16-png_6_0_0_135_527_12_18_892.979_1262.879-11-0-294-11.jpg

for j=0:nnn

if (i+j<=nnn)&(i+j>0) % 满足条件

1-16-png_6_0_0_135_574_12_18_892.979_1262.879-11-0-345-11.jpg

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

d(jc,1:3)=[i,j 1]; %生成一个决策向量后立刻将他扩充为三维(再末尾加“1”)

1-16-png_6_0_0_135_597_12_18_892.979_1262.879-11-0-366-11.jpg

d(jc+1,1:3)=[-i,-j,-1]; % 同时生成他的负向量

1-16-png_6_0_0_135_620_12_19_892.979_1262.879-11-0-387-11.jpg

jc=jc+2; % 由于一气生成两个决策向量,jc指标需要往下移动两个单位

1-16-png_6_0_0_135_644_12_18_892.979_1262.879-11-0-408-11.jpg

1-16-png_6_0_0_135_667_12_18_892.979_1262.879-11-0-429-11.jpg

end

1-16-png_6_0_0_135_691_12_18_892.979_1262.879-11-0-450-11.jpg

end

1-16-png_6_0_0_135_714_12_18_892.979_1262.879-11-0-471-11.jpg

j=0;

1-16-png_6_0_0_135_737_12_19_892.979_1262.879-11-0-492-11.jpg

1-16-png_6_0_0_135_761_12_18_892.979_1262.879-11-0-513-11.jpg

end

1-16-png_6_0_0_135_784_12_18_892.979_1262.879-11-0-534-11.jpg

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 状态数组生成

1-16-png_6_0_0_135_810_12_18_892.979_1262.879-11-0-555-11.jpg

1-16-png_6_0_0_135_831_12_18_892.979_1262.879-11-0-576-11.jpg

kx=1; % 状态数组存放在矩阵“A”中,生成方法同决策生成

1-16-png_6_0_0_135_854_12_19_892.979_1262.879-11-0-597-11.jpg

for

1-16-png_6_0_0_135_878_12_18_892.979_1262.879-11-0-618-11.jpg

i=n:-1:0

1-16-png_6_0_0_135_901_12_18_892.979_1262.879-11-0-639-11.jpg

for

1-16-png_6_0_0_135_925_12_18_892.979_1262.879-11-0-660-11.jpg

j=nn:-1:0

1-16-png_6_0_0_135_948_12_18_892.979_1262.879-11-0-681-11.jpg

1-16-png_6_0_0_135_971_12_19_892.979_1262.879-11-0-702-11.jpg

if

1-16-png_6_0_0_135_997_12_18_892.979_1262.879-11-0-723-11.jpg

((i>=j)&((n-i)>=(nn-j)))|((i==0)|(i==n))

1-16-png_6_0_0_135_1018_12_18_892.979_1262.879-11-0-744-11.jpg

% (i>=j)&((n-i)>=(nn-j)))|((i==0)|(i==n))为可以存在的状态的约束条件

1-16-png_6_0_0_135_1042_12_18_892.979_1262.879-11-0-765-11.jpg

1-16-png_6_0_0_135_1065_12_18_892.979_1262.879-11-0-786-11.jpg

A(kx,1:3)=[i,j,1]; % 生成状态数组集合

1-16-png_6_0_0_135_1088_12_19_892.979_1262.879-11-0-807-11.jpg

D`

1-16-png_6_0_0_135_1112_12_18_892.979_1262.879-11-0-828-11.jpg

A(kx+1,1:3)=[i,j,0];

商人随从过河问题是一个经典的问题,描述如下:有一位商人和他的两个随从需要过一条河。他们只有一艘小船,这艘小船最多只能搭载两个人。在任何情况下,如果随从的数量少于商人的数量,随从们会攻击商人。要求找出一种策略,使得商人随从们都能安全到达对岸。 下面是使用Python解决商人随从过河问题的示例代码: ```python from itertools import combinations def is_valid_state(state): missionaries, cannibals = state if not 0 <= missionaries <= 3 or not 0 <= cannibals <= 3: return False if missionaries < cannibals and missionaries > 0: return False return True def generate_successor_states(state): successors = [] boat = 1 - state[2] for m in range(3): for c in range(3): if m + c <= 2 and m + c > 0: new_state = (state[0] + boat*m, state[1] + boat*c, boat) if is_valid_state(new_state): successors.append(new_state) return successors def solve(): initial_state = (3, 3, 1) # 初始状态为(3, 3, 1),表示商人随从和船都在起始岸 goal_state = (0, 0, 0) # 目标状态为(0, 0, 0),表示商人随从和船都在对岸 visited = set() queue = [[initial_state]] while queue: path = queue.pop(0) current_state = path[-1] if current_state == goal_state: return path visited.add(current_state) successors = generate_successor_states(current_state) for successor in successors: if successor not in visited: new_path = list(path) new_path.append(successor) queue.append(new_path) return None # 调用solve函数获取解决方案 solution = solve() if solution: print("Solution found:") for i, state in enumerate(solution): print(f"Step {i+1}: {state}") else: print("No solution found.") ``` 上述代码使用广度优先搜索算法来解决商人随从过河问题。它通过不断生成后继状态,并检查其是否有效,然后将有效的后继状态加入队列中进行搜索。最终找到的路径即为解决方案。 注意:这只是一种可能的解决方案,可能还有其他方法来解决商人随从过河问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值