2024年“华数杯”数学竞赛A题完整解析 | 代码分享

news2024/11/15 9:41:33

机器臂关节角路径的优化设计

问题一


代码

  • Matlab
clc
clear
% 参数定义
a = [0, 300, 1200, 300, 0, 0];
alpha = [0, -90, 0, -90, -90, -90];
d = [600, 0, 0, 1200, 0, 0];
theta_min = [-160, -150, -200, -180, -120, -180];
theta_max = [160, 15, 80, 180, 120, 180];
P_target = [1500, 1200, 200]; % 目标位置
lambda = 1; % 权重因子

% 初始种群生成
population_size = 100;
num_generations = 100;
crossover_rate = 0.8;
mutation_rate = 0.1;

% 随机生成初始种群
population = zeros(population_size, 6);
for i = 1:population_size
    for j = 1:6
        population(i, j) = theta_min(j) + (theta_max(j) - theta_min(j)) * rand;
    end
end

% 遗传算法主程序
for generation = 1:num_generations
    % 适应度计算
    fitness_values = zeros(population_size, 1);
    for i = 1:population_size
        fitness_values(i) = fitness(population(i, :), P_target);
    end
    
    % 将适应度值转换为非负值
    min_fitness = min(fitness_values);
    fitness_values = fitness_values - min_fitness + 1; % 确保所有适应度值为正
    
    % 选择(轮盘赌算法)
    probabilities = fitness_values / sum(fitness_values);
    selected_indices = randsample(1:population_size, population_size, true, probabilities);
    selected_population = population(selected_indices, :);
    
    % 交叉
    new_population = zeros(population_size, 6);
    for i = 1:2:population_size
        if rand < crossover_rate
            crossover_point = randi([1, 5]);
            new_population(i, :) = [selected_population(i, 1:crossover_point), selected_population(i + 1, crossover_point + 1:end)];
            new_population(i + 1, :) = [selected_population(i + 1, 1:crossover_point), selected_population(i, crossover_point + 1:end)];
        else
            new_population(i, :) = selected_population(i, :);
            new_population(i + 1, :) = selected_population(i + 1, :);
        end
    end
    
    % 变异
    for i = 1:population_size
        if rand < mutation_rate
            mutation_point = randi([1, 6]);
            new_population(i, mutation_point) = theta_min(mutation_point) + (theta_max(mutation_point) - theta_min(mutation_point)) * rand;
        end
    end
    
    population = new_population;
end

% 输出最优解
fitness_values = zeros(population_size, 1);
for i = 1:population_size
    fitness_values(i) = fitness(population(i, :), P_target);
end

[~, best_index] = min(fitness_values);
best_solution = population(best_index, :)
best_fitness = fitness_values(best_index)
% 正运动学计算函数
function T = forward_kinematics(theta)
    a = [0, 300, 1200, 300, 0, 0];
    alpha = [0, -90, 0, -90, -90, -90];
    d = [600, 0, 0, 1200, 0, 0];
    T = eye(4);
    for i = 1:6
        A = [cosd(theta(i)), -sind(theta(i)) * cosd(alpha(i)), sind(theta(i)) * sind(alpha(i)), a(i) * cosd(theta(i));
             sind(theta(i)), cosd(theta(i)) * cosd(alpha(i)), -cosd(theta(i)) * sind(alpha(i)), a(i) * sind(theta(i));
             0, sind(alpha(i)), cosd(alpha(i)), d(i);
             0, 0, 0, 1];
        T = T * A;
    end
end

% 适应度计算函数
function E_error = fitness(theta, P_target)
    T = forward_kinematics(theta);
    P_actual = T(1:3, 4)';
    E_error = norm(P_target - P_actual);
end
  • Python
import numpy as np
from scipy.optimize import minimize

# D-H参数
a = [0, 300, 1200, 300, 0, 0]
alpha = [0, -np.pi/2, 0, -np.pi/2, -np.pi/2, -np.pi/2]
d = [600, 0, 0, 1200, 0, 0]
theta_ranges = [(-160, 160), (-150, 15), (-200, 80), (-180, 180), (-120, 120), (-180, 180)]

# 目标位置
target = np.array([1500, 1200, 200])

# 计算D-H矩阵
def dh_matrix(a, alpha, d, theta):
    return np.array([
        [np.cos(theta), -np.sin(theta)*np.cos(alpha), np.sin(theta)*np.sin(alpha), a*np.cos(theta)],
        [np.sin(theta), np.cos(theta)*np.cos(alpha), -np.cos(theta)*np.sin(alpha), a*np.sin(theta)],
        [0, np.sin(alpha), np.cos(alpha), d],
        [0, 0, 0, 1]
    ])

# 计算末端位姿
def end_effector_position(thetas):
    T = np.eye(4)
    for i in range(6):
        T = T @ dh_matrix(a[i], alpha[i], d[i], np.radians(thetas[i]))
    return T[:3, 3]

# 目标函数
def objective(thetas):
    pos = end_effector_position(thetas)
    return np.linalg.norm(pos - target)

# 初始猜测
initial_guess = [0, -90, 0, 180, -90, 0]

# 约束
bounds = [(low, high) for low, high in theta_ranges]

# 优化
result = minimize(objective, initial_guess, bounds=bounds, method='SLSQP')
optimal_thetas = result.x

print("最优关节角度:", optimal_thetas)
print("最小化误差:", result.fun)

# 打印末端位置
end_position = end_effector_position(optimal_thetas)
print("末端位置:", end_position)

技术文档

在这里插入图片描述

完整内容请看下方~

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

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

相关文章

计算机网络(网络层)

网络层概述 网络层是干什么的&#xff1f; 网络层的主要任务是实现不同异构网络互连&#xff0c;进而实现数据包在各网络之间的传输相比于数据链路层的以太网通信&#xff0c;网络层则是将一个个数据链路层连接的以太网通过路由器连接起来。从而实现不同数据链路层的互联。 这…

【Linux】网络基础_3

文章目录 十、网络基础5. socket编程socket 常见APIsockaddr结构简单的UDP网络程序 未完待续 十、网络基础 5. socket编程 socket 常见API // 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器) int socket(int domain, int type, int protocol);// 绑定端口号 (TCP/UDP, 服…

Ubuntu窗口如何自适应VM虚拟机

修改VM的显示设置 1&#xff1a;右击ubuntu计算机&#xff0c;点击设置按钮&#xff0c;进入到设置界面。 2&#xff1a;点击拉伸模式&#xff0c;选择自由拉伸。 以上操作结束之后打开ubuntu虚拟机。 ubuntu屏幕显示设置 进入到ubuntu系统之后&#xff0c;在桌面右击&…

网关与auth微服务缓存打通

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.缓存一致性问题1、更新了数据库&#xff0c;再更新缓存2、更…

大数据-68 Kafka 高级特性 物理存储 日志存储概述

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

文献翻译软件哪个好?6个工具让你轻松看懂外语文献

在医学研究领域&#xff0c;文献翻译软件扮演着至关重要的角色。 医学论文、研究报告和临床指南等&#xff0c;往往包含了大量的专业术语和复杂的句子结构&#xff0c;对于非母语者来说&#xff0c;理解这些内容无疑是一项挑战。 幸运的是&#xff0c;随着技术的发展&#xf…

巴黎奥运会8K转播科技为国产品牌自主研发设计

这个夏天&#xff0c;顶流是属于巴黎奥运会中国队的。 20枚金牌、15枚银牌、12枚铜牌......这个数字正随着赛事推进而不停在增加。赛场之上&#xff0c;中国健儿奋力拼搏、捷报频传&#xff0c;令人热血沸腾&#xff1b;赛场之外&#xff0c;另一支来自中国企业的“奥运选手”…

Linux OS:基于阻塞队列的生产者消费者模型

Linux OS&#xff1a;基于阻塞队列的生产者消费者模型 前言一、阻塞队列的大致框架二、生产者向阻塞队列中生产数据三、消费者获取阻塞队列中数据四、总体生产和消费思路及测试代码4.1 单生产单消费4.2 多生产多消费 五、所以代码 前言 阻塞队列是一种常用于实现生产者消费者模…

大模型微调技术PEFT

1. 横向对比 总体概览&#xff1a; 方法Transformer 中如何应用特点Prompt Tuning在输入到Transformer的input文本中添加Prompthard 模式prompt CO-STARP-tuning在输入到Transformer的embedding 层添加Promptsoft 模式 promptAdapter Tuning在 Transformer 中间层插入 Adapt…

MATLAB代码|蚁群算法|计算二元函数最大值

总述 蚁群方法求解二元函数的最大值。蚂蚁群先随机分布在定义域内&#xff0c;如下&#xff1a; 计算结束后&#xff0c;得到如下的分布&#xff0c;再计算分布均值&#xff0c;得到此时的自变量取值&#xff0c;因为是二元函数&#xff0c;所以有两个自变量&#xff0c;带入…

Qt 实战(9)窗体 | 9.1、QWidget

文章目录 一、QWidget1、定义与概念2、继承体系3、常用特性3.1、事件处理3.2、布局管理3.3、子控件与父子关系3.4、右键菜单 4、注意事项5、总结 前言&#xff1a; 在Qt这一强大的跨平台C图形用户界面应用程序开发框架中&#xff0c;QWidget扮演着至关重要的角色。作为所有用户…

【日记】为啥家族原发性高血压的人还喜欢喝酒啊……(442 字)

正文 今天跟人吵了一下午架&#xff0c;因为有一张报表换了新表&#xff0c;所有人都不知道怎么报。上级行一个想法&#xff0c;我一个想法。吵完都发现对方说得有道理&#xff0c;于是决定明天问省分行。难绷。草台班子。 鱼儿说他最近喜欢上了喝酒。我们劝他的同时&#xff0…

太阳光度计CE-318数据处理

太阳光度计CE-318数据处理 备注&#xff1a;处理公式 在我国近海&#xff0c;α的值在0到3之间&#xff0c;所以他们相对误差最大不超过25%&#xff0c;而通过查阅相关资料&#xff0c;北京地区α的值可以近似的取1.665。 大气是不断运动的&#xff0c;气溶胶在短时间内也可…

【网络安全】https协议的加密方案避免中间人攻击(MITM攻击)导致的数据泄露风险

目录 引言 概念准备 中间人 加密 数据摘要 && 数据指纹 数字签名 密钥加密 中间人攻击 CA证书 https加密的解决方案 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 引言 http在应用层协议中是明文传输协议&#xff0c;它是通信双方传输数据时的一种约定。【…

超声波便携式气象站:精准监测,随身携带

在追求高效与便捷的今天&#xff0c;超声波便携式气象站以其独特魅力脱颖而出&#xff0c;成为众多行业及户外爱好者的理想选择。超声波便携式气象站采用多采集装置一体式设计&#xff0c;不仅实现了体积的小型化与重量的轻量化&#xff0c;更便于用户随身携带&#xff0c;随时…

期权杠杆与期货杠杆的区别是什么?

期权与股指期货在杠杆性上展现出截然不同的特性&#xff0c;这些特性对投资者的策略选择具有深远影响。首先&#xff0c;股指期货采用保证金制度&#xff0c;其杠杆比例是恒定的&#xff0c;无论市场如何波动&#xff0c;投资者在月初设定的十倍杠杆到月尾仍保持不变。相比之下…

STM32常见的下载方式有三种

经过对比&#xff0c;推荐使用 SWD下载&#xff0c;只需要一个仿真器&#xff08;如jLINK、ST LINK、 CMSIS DAP 等&#xff09;&#xff0c;比较方便。 不推荐使用串口下载&#xff08;速度慢、无法仿真和调试&#xff09;和 JTAG 下载&#xff08;占用 IO 多&#xff09;。

Java语言程序设计基础篇_编程练习题*16.7 (设置时钟的时间)

*16.7 (设置时钟的时间) 编写一个程序&#xff0c;显示一个时钟&#xff0c;并通过在三个文本域中输入小时、分钟和秒 钟来设置时钟的时间&#xff0c;如图16-38b 所示。使用程序清单14-21的ClockPane改变时钟大小使其居于面板中央 习题思路 实例化一个ClockPane(在程序清单1…

【网络安全渗透测试零基础入门必知必会】之什么是文件包含漏洞分类(非常详细)零基础入门到精通,收藏这一篇就够了

一、前言 这是大白给粉丝盆友们整理的网络安全渗透测试入门阶段文件包含渗透与防御第1篇。 本文主要讲解什么是文件包含漏洞、本地文件包含漏洞 喜欢的朋友们&#xff0c;记得给大白点赞支持和收藏一下&#xff0c;关注我&#xff0c;学习黑客技术。 一、什么是文件包含漏洞…

the request was rejected because no multipart boundary was found

文章目录 1. 需求描述2. 报错信息3. 探索过程1. 使用postman 排除后端错误2. 搜索网上的解决方法3. 解决方法 1. 需求描述 想要在前端上传一个PDF 发票&#xff0c;经过后端解析PDF之后&#xff0c;将想要的值自动回填到对应的输入框中 2. 报错信息 org.apache.tomcat.util.…