主頁 > 軟體設計 > 2021深圳杯東三省建模

2021深圳杯東三省建模

2021-07-26 08:20:59 軟體設計

火星探測器著陸控制方案

本題聚焦于探測器從火星同步軌道出發到探測器在火星地表上
方懸停的程序(以下簡稱著陸程序),要求參賽隊收集有關天問一號
探測器的音像和文字等公開資料,建立數學模型,研究如下問題:

  1. 確定探測器著陸程序時間最短的操控方案(包括環繞器與著
    陸巡視器分離、阻尼傘打開、發動機系統點火等時間,以及
    發動機系統運行方案);
  2. 對給定的著陸程序時間,確定消耗能量最少的操控方案;
  3. 如果希望探測器著陸程序與公開的音像和文字資料盡量一致,
    如何設計操控方案

相關資料及資料分析
在這里插入圖片描述
火星著陸器開傘條件均為超聲速開傘,但為了確保降落傘的開傘可靠,
一般都控制開傘馬赫數不大于 2.2;
? 由于大氣密度小,開傘動壓較小,一般采用彈傘筒直接彈傘和一次開傘
技術;
? 大部分火星著陸器均使用了盤縫帶傘,其中在著陸前沒有姿態控制的著
陸器均采用了火星探路者型別及其改進型的盤縫帶傘(降落傘的穩定性高),在著陸前進行姿態控制的著陸器均采用海盜號型別的盤縫帶傘(降落傘的阻力系數大);

最小彈射分離速度的確定方法
對于降落傘系統而言,確定彈射分離速度非常關鍵,該彈射分離速度取得過小,將可能導致降落傘無法越過回收物的尾流或無法正常拉直;該彈射分離速度取得過大,由于彈射分離推力一般與該速度的二次方成正比,過大的彈射分離推力將導致彈傘載荷偏大,并對回收物的結構設計、降落傘連接分離機構的結構設計帶來影響,從而導致更大的結構重量,選取合適的彈射分離速度,首先需要得到所需的最小彈射分離速度,

在這里插入圖片描述
在這里插入圖片描述
受力分析
在這里插入圖片描述
在這里插入圖片描述

import java.util.*;

public class test9 {
	private static String Time[] = { "0", "20", "50", "100", "150", "200",
			"240", "290", "320", "400", "450", "490" };
	private static int verticalspeed[] = { 1400, 1600, 1550, 1300, 1700, 1000, 1100, 800, 700, 40,
			200, 400 };
	private static int horizonspeed[] = { 0, 10, 15, 10, 5, 3, 0, -20, -30, -32, -35, -32, -21,
			-11, 0 };
	private static int b2[] = { 98, 78, 63, 50, 40, 33 };
	private static int thrust[] = { 7500,7500,7500,7500,7500,7500,7500,7500,7500,7500,7500,7500 };
	private static int angle[] = { 85, 85, 84, 82, 80, 78, 77, 75, 74, 72, 68, 65 };
	private int timeNum = Time.length; 
	private int popSize = 50; 
	private int maxgens = 10000; 
	private double pxover = 0.8; 
	private double pmultation = 0.05; 
	private long[][] distance = new long[timeNum][timeNum];
	private int range = 2000; 

	private class genotype {
		int city[] = new int[timeNum]; 
		long fitness; 
		double selectP; 
		double exceptp; 
		int isSelected; 
	}

	private genotype[] citys = new genotype[popSize];

	/**
	 * 建構式,初始化種群
	 */
	public test9() {
		for (int i = 0; i < popSize; i++) {
			citys[i] = new genotype();
			int[] num = new int[timeNum];
			for (int j = 0; j < timeNum; j++)
				num[j] = j;
			int temp = timeNum;
			for (int j = 0; j < timeNum; j++) {
				int r = (int) (Math.random() * temp);
				citys[i].city[j] = num[r];
				num[r] = num[temp - 1];
				temp--;
			}
			citys[i].fitness = 0;
			citys[i].selectP = 0;
			citys[i].exceptp = 0;
			citys[i].isSelected = 0;
		}
		initDistance();
	}

	/**
	 * 計算每個種群每個基因個體的適應度,選擇概率,期望概率,和是否被選擇,
	 */
	public void CalAll() {
		for (int i = 0; i < popSize; i++) {
			citys[i].fitness = 0;
			citys[i].selectP = 0;
			citys[i].exceptp = 0;
			citys[i].isSelected = 0;
		}
		CalFitness();
		CalSelectP();
		CalExceptP();
		CalIsSelected();
	}

	/**
	 * 填充,將多選的填充到未選的個體當中
	 */
	public void pad() {
		int best = 0;
		int bad = 0;
		while (true) {
			while (citys[best].isSelected <= 1 && best < popSize - 1)
				best++;
			while (citys[bad].isSelected != 0 && bad < popSize - 1)
				bad++;
			for (int i = 0; i < timeNum; i++)
				citys[bad].city[i] = citys[best].city[i];
			citys[best].isSelected--;
			citys[bad].isSelected++;
			bad++;
			if (best == popSize || bad == popSize)
				break;
		}
	}

	/**
	 * 交叉主體函式
	 */
	public void crossover() {
		int x;
		int y;
		int pop = (int) (popSize * pxover / 2);
		while (pop > 0) {
			x = (int) (Math.random() * popSize);
			y = (int) (Math.random() * popSize);

			executeCrossover(x, y);// x y 兩個體執行交叉
			pop--;
		}
	}

	/**
	 * 執行交叉函式
	 * 
	 * @param 個體x
	 * @param 個體y
	 *            對個體x和個體y執行佳點集的交叉
	 */
	private void executeCrossover(int x, int y) {
		int dimension = 0;
		for (int i = 0; i < timeNum; i++)
			if (citys[x].city[i] != citys[y].city[i]) {
				dimension++;
			}
		int diffItem = 0;
		double[] diff = new double[dimension];

		for (int i = 0; i < timeNum; i++) {
			if (citys[x].city[i] != citys[y].city[i]) {
				diff[diffItem] = citys[x].city[i];
				citys[x].city[i] = -1;
				citys[y].city[i] = -1;
				diffItem++;
			}
		}

		Arrays.sort(diff);

		double[] temp = new double[dimension];
		temp = gp(x, dimension);

		for (int k = 0; k < dimension; k++)
			for (int j = 0; j < dimension; j++)
				if (temp[j] == k) {
					double item = temp[k];
					temp[k] = temp[j];
					temp[j] = item;

					item = diff[k];
					diff[k] = diff[j];
					diff[j] = item;
				}
		int tempDimension = dimension;
		int tempi = 0;

		while (tempDimension > 0) {
			if (citys[x].city[tempi] == -1) {
				citys[x].city[tempi] = (int) diff[dimension - tempDimension];

				tempDimension--;
			}
			tempi++;
		}

		Arrays.sort(diff);

		temp = gp(y, dimension);

		for (int k = 0; k < dimension; k++)
			for (int j = 0; j < dimension; j++)
				if (temp[j] == k) {
					double item = temp[k];
					temp[k] = temp[j];
					temp[j] = item;

					item = diff[k];
					diff[k] = diff[j];
					diff[j] = item;
				}

		tempDimension = dimension;
		tempi = 0;

		while (tempDimension > 0) {
			if (citys[y].city[tempi] == -1) {
				citys[y].city[tempi] = (int) diff[dimension - tempDimension];

				tempDimension--;
			}
			tempi++;
		}

	}

	/**
	 * @param individual
	 *            個體
	 * @param dimension
	 *            維數
	 * @return 佳點集 (用于交叉函式的交叉點) 在executeCrossover()函式中使用
	 */
	private double[] gp(int individual, int dimension) {
		double[] temp = new double[dimension];
		double[] temp1 = new double[dimension];
		int p = 2 * dimension + 3;

		while (!isSushu(p))
			p++;

		for (int i = 0; i < dimension; i++) {
			temp[i] = 2 * Math.cos(2 * Math.PI * (i + 1) / p)
					* (individual + 1);
			temp[i] = temp[i] - (int) temp[i];
			if (temp[i] < 0)
				temp[i] = 1 + temp[i];

		}
		for (int i = 0; i < dimension; i++)
			temp1[i] = temp[i];
		Arrays.sort(temp1);
		// 排序
		for (int i = 0; i < dimension; i++)
			for (int j = 0; j < dimension; j++)
				if (temp[j] == temp1[i])
					temp[j] = i;
		return temp;
	}

	/**
	 * 變異
	 */
	public void mutate() {
		double random;
		int temp;
		int temp1;
		int temp2;
		for (int i = 0; i < popSize; i++) {
			random = Math.random();
			if (random <= pmultation) {
				temp1 = (int) (Math.random() * (timeNum));
				temp2 = (int) (Math.random() * (timeNum));
				temp = citys[i].city[temp1];
				citys[i].city[temp1] = citys[i].city[temp2];
				citys[i].city[temp2] = temp;

			}
		}
	}

	/**
	 * 初始化各狀態之間的距離
	 */
	private void initDistance() {
		for (int i = 0; i < timeNum; i++) {
			for (int j = 0; j < timeNum; j++) {
				distance[i][j] = Math.abs(i - j);
			}
		}
	}

	/**
	 * 計算所有狀態序列的適應度
	 */
	private void CalFitness() {
		for (int i = 0; i < popSize; i++) {
			for (int j = 0; j < timeNum - 1; j++)
				citys[i].fitness += distance[citys[i].city[j]][citys[i].city[j + 1]];
			citys[i].fitness += distance[citys[i].city[0]][citys[i].city[timeNum - 1]];
		}
	}

	/**
	 * 計算選擇概率
	 */
	private void CalSelectP() {
		long sum = 0;
		for (int i = 0; i < popSize; i++)
			sum += citys[i].fitness;
		for (int i = 0; i < popSize; i++)
			citys[i].selectP = (double) citys[i].fitness / sum;

	}

	/**
	 * 計算期望概率
	 */
	private void CalExceptP() {
		for (int i = 0; i < popSize; i++)
			citys[i].exceptp = (double) citys[i].selectP * popSize;
	}

	/**
	 * 計算該狀態序列是否較優,較優則被選擇,進入下一代
	 */
	private void CalIsSelected() {
		int needSelecte = popSize;
		for (int i = 0; i < popSize; i++)
			if (citys[i].exceptp < 1) {
				citys[i].isSelected++;
				needSelecte--;
			}
		double[] temp = new double[popSize];
		for (int i = 0; i < popSize; i++) {
			temp[i] = citys[i].exceptp * 10;
		}
		int j = 0;
		while (needSelecte != 0) {
			for (int i = 0; i < popSize; i++) {
				if ((int) temp[i] == j) {
					citys[i].isSelected++;
					needSelecte--;
					if (needSelecte == 0)
						break;
				}
			}
			j++;
		}

	}

	/**
	 * @param x
	 * @return 判斷一個數是否是素數的函式
	 */
	private boolean isSushu(int x) {
		if (x < 2)
			return false;
		for (int i = 2; i <= x / 2; i++)
			if (x % i == 0 && x != 2)
				return false;

		return true;
	}

	/**
	 * @param x
	 *            陣列
	 * @return x陣列的值是否全部相等,相等則表示x.length代的最優結果相同,則演算法結束
	 */
	private boolean isSame(long[] x) {
		for (int i = 0; i < x.length - 1; i++)
			if (x[i] != x[i + 1])
				return false;
		return true;
	}

	public int[] sort(int a[]) {
		for (int i = 1; i < a.length; i++) {// 外層回圈從i=1開始
			for (int j = 0; j < a.length - 1; j++) {// 內層回圈從i=0開始
				if (a[j] > a[j + 1]) {// 比較陣列元素相鄰兩個元素的大小,如果前者大于后者就將兩個值進行交換
					int temp1 = a[j];
					a[j] = a[j + 1];
					a[j + 1] = temp1;
				}
			}
		}
		return a;
	}

	/**
	 * 列印任意代最優的路徑序列
	 */
	private void printBestRoute() {
		CalAll();
		long temp = citys[0].fitness;
		int index = 0;
		for (int i = 1; i < popSize; i++) {
			if (citys[i].fitness < temp) {
				temp = citys[i].fitness;
				index = i;
			}
		}
		for (int j = 0; j < timeNum; j++) {
			String cityEnd[] = { Time[citys[index].city[j]] };
			for (int m = 0; m < cityEnd.length; m++) {
				System.out.print(cityEnd[m] + " ");
			}
		}
		System.out.println();
	}

	/**
	 * 演算法執行
	 */
	public void run() {
		long[] result = new long[range];
		// result初始化為所有的數字都不相等
		for (int i = 0; i < range; i++)
			result[i] = i;
		int index = 0; // 陣列中的位置
		int num = 1; // 第num代
		while (maxgens > 0) {
			CalAll();
			pad();
			crossover();
			mutate();
			maxgens--;
			long temp = citys[0].fitness;
			for (int i = 1; i < popSize; i++)
				if (citys[i].fitness < temp) {
					temp = citys[i].fitness;
				}
			result[index] = temp;
			if (isSame(result))
				break;
			index++;
			if (index == range)
				index = 0;
			num++;
		}
		printBestRoute();
	}

	/**
	 * @param a
	 *            開始時間
	 * @param b
	 *            結束時間
	 */
	public static void CalTime(Calendar a, Calendar b) {
		long x = b.getTimeInMillis() - a.getTimeInMillis();
		long y = x / 1000;
		x = x - 1000 * y;
		System.out.println("演算法執行時間:" + y + "." + x + " 秒");
	}

	/**
	 * 程式入口
	 */
	public static void main(String[] args) {
		Arrays.sort(verticalspeed);
		System.out.println("時間:");
		for(int i=0;i<Time.length;i++)
		{
			System.out.print(Time[i]+" ");
		}
		System.out.println();
		System.out.println("垂直速度");
		for(int i=0;i<verticalspeed.length;i++)
		{
			System.out.print(verticalspeed[i]+" ");
		}
		System.out.println();
		System.out.println("水平速度");
		for(int i=0;i<horizonspeed.length;i++)
		{
			System.out.print(horizonspeed[i]+" ");
		}
		System.out.println();
		System.out.println("推力");
		for(int i=0;i<thrust.length;i++)
		{
			System.out.print(thrust[i]+" ");
		}
		System.out.println();
		System.out.println("姿態角");
		for(int i=0;i<angle.length;i++)
		{
			System.out.print(angle[i]+" ");
		}
	}
}

阻尼傘打開的數學模型為:
企鵝
917267119

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/290127.html

標籤:其他

上一篇:Nginx保姆級教程(一)-手把手教你安裝Nginx

下一篇:程式員剛畢業,去大廠好還是小廠好,送給剛畢業的你

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more