33 votes

AI de propulsion du vaisseau spatial: atterrir un vaisseau 3D à la position = 0 et à l'angle = 0

C'est un problème très difficile sur la façon de manœuvrer un vaisseau spatial qui peut à la fois traduire et de le faire tourner en 3D, pour un jeu de l'espace.

Le vaisseau spatial s' n jets de placer dans différentes positions et les directions.

La Transformation de l' i-ème jet par rapport à la CM de vaisseau spatial est constante = Ti.

  • La Transformation est un tuple de la position et de l'orientation (quaternion ou d'une matrice 3x3 ou, moins préférable, angles d'Euler).
  • Une transformation peut également être désigné par une seule matrice 4x4.

En d'autres termes, tous les jet sont collées sur le navire et ne peut pas tourner.

Un jet peut exercer une force vers le vaisseau spatial seulement dans la direction de son axe (vert).
Comme un résultat de la colle, de l'axe de rotation avec le vaisseau spatial.

enter image description here

Tous les jets peuvent exercer une force (vecteur,Fi) à une certaine ampleur (scalaire,fi) :
i-ème jet peut exercer une force (Fi= axis x fi) que dans la gamme min_i<= fi <=max_i.
Les deux min_i et max_i sont constants avec la valeur connue.

Pour être clair, l'unité de l' min_i,fi,max_i est celle de Newton.
Ex. Si la plage ne couvre pas 0, cela signifie que le jet ne peut pas être éteint.

Le vaisseau spatial de masse = m et du tenseur d'inertie = I.
Le vaisseau spatial de la transformation actuelle = Tran0, vitesse = V0, angularVelocity = W0.

Le vaisseau spatial de la physique corps suit bien connues de la physique des règles :-
Torque=r x F
F=ma
angularAcceleration = I^-1 x Torque
linearAcceleration = m^-1 x F

I est différent pour chaque direction, mais par souci de simplicité, il a la même valeur pour chaque direction (sphère-like). Ainsi, I peut être considéré comme un scalaire au lieu de la matrice 3x3.

Question

Comment contrôler tous les jets (tous fi) à la terre le navire avec position=0 et l'angle=0?
Mathématiques-comme spécification: Trouver la fonction d' fi(time) que de prendre un minimum de temps pour atteindre position=(0,0,0), orient=identity avec final angularVelocity et velocity = zéro.

Plus précisément, quels sont les noms de la technique ou liées à des algorithmes pour résoudre ce problème?

Mes travaux de recherche (1 dimension)

Si l'univers est en 1D (donc, pas de rotation), le problème sera facile à résoudre.
( Merci à Gavin de Verrouillage, https://stackoverflow.com/a/40359322/3577745 )

Tout d'abord, trouver la valeur MIN_BURN=sum{min_i}/m et MAX_BURN=sum{max_i}/m.

Deuxièmement, penser en sens inverse, à supposer qu' x=0 (position) et l' v=0 à t=0,
ensuite, créez deux paraboles avec x''=MIN_BURN et x''=MAX_BURN.
(Le 2ème dérivé est supposée être constante pour une période de temps, il est de la parabole.)

Le seul travail est de rejoindre les deux paraboles ensemble.
Le trait rouge de la ligne est l'endroit où les rejoindre.

enter image description here

Dans la période de temps qu' x''=MAX_BURN, tous fi=max_i.
Dans la période de temps qu' x''=MIN_BURN, tous fi=min_i.

Il fonctionne vraiment bien pour les 1D, mais en 3D, le problème est beaucoup plus difficile.

Note:
Juste un rough guide m'indiquer un bon sens est vraiment apprécié.
Je n'ai pas besoin d'une parfaite AI, par exemple, il peut prendre un peu plus de temps que l'optimum.
J'y pense depuis plus de 1 semaine, trouve toujours pas la moindre idée.

D'autres tentatives / opinions

  • Je ne pense pas que l'apprentissage de la machine comme le réseau de neurones est approprié pour ce cas.
  • Limite-limité-moins-carré-optimisation peut être utile, mais je ne sais pas comment l'adapter à mes deux hyper-parabole à cette forme de problème.
  • Cela peut être résolu en utilisant un nombre d'itérations, mais comment?
  • J'ai cherché de la NASA site web, mais ne pas trouver quelque chose d'utile.
  • La fonctionnalité peut exister dans "l'Espace de l'Ingénieur" de jeu.
  • Commenté par Logman: Connaissances en génie mécanique peut aider.
  • Commenté par AndyG: C'est un mouvement de la planification de problème avec nonholonomic contraintes. Il pourrait être résolu par une Rapide exploration aléatoire de l'arbre (Tras), la théorie autour de l'équation de Lyapunov, et Linéaire quadratique régulateur.
  • Commenté par John Coleman: Cela semble plus comme un contrôle optimal de l'IA.

Edit: "à Proximité-0 hypothèse" (en option)

  • Dans la plupart des cas, l'IA (à la conception) exécuté en continu (c'est à dire appelée à chaque étape).
  • Ainsi, avec l'IA de tuning, Tran0 est généralement proche de l'identité, V0 et W0 sont généralement pas si différent de 0, par exemple, |Seta0|<30 degree,|W0|<5 degree per time-step .
  • Je pense que l'IA en se basant sur cette hypothèse serait de travailler sur OK dans la plupart des cas. Bien que n'étant pas parfait, il peut être considéré comme une solution correcte (j'ai commencé à penser que sans cette hypothèse, cette question est peut-être trop dur).
  • J'ai vaguement le sentiment que cette hypothèse peut permettre a certains trucs que l'utilisation de certains "linéaire"-approximation.


La 2ème Alternative Question - "Tune 12 Variables" (plus facile)

La question ci-dessus peut également être considéré comme suivi:

Je veux régler tous les six values et six values' (1er dérivés) à 0, en utilisant la plus faible quantité de temps.

Voici un tableau montrent une situation possible que l'IA peut faire face à:-

enter image description here

La table de multiplication des magasins d' inertia^-1 * r et mass^-1 à partir de la question d'origine.

Le Multiplicateur et la Plage sont constants.

Chaque timestep, l'IA sera demandé d'en choisir un n-uplet de valeurs fi qui doit être dans la gamme [min_i,max_i] pour chaque i+1-ème jet.
Ex. De la table, l'IA peut choisir (f0=1,f1=0.1,f2=-1).

Ensuite, l'appelant utilisera fi à se multiplier avec la table de multiplication pour obtenir de l' values''.
Px'' = f0*0.2+f1*0.0+f2*0.7
Py'' = f0*0.3-f1*0.9-f2*0.6
Pz'' = ....................
SetaX''= ....................
SetaY''= ....................
SetaZ''= f0*0.0+f1*0.0+f2*5.0

Après cela, l'appelant sera mise à jour tous values' avec la formule values' += values''.
Px' += Px''
.................
SetaZ' += SetaZ''

Enfin, l'appelant sera mise à jour tous values avec la formule values += values'.
Px += Px'
.................
SetaZ += SetaZ'

L'IA sera demandé qu'une seule fois pour chaque pas de temps.

L'objectif de l'IA est de retour tuples d' fi (peut être différente pour différents pas de temps), pour faire de Px,Py,Pz,SetaX,SetaY,SetaZ,Px',Py',Pz',SetaX',SetaY',SetaZ' = 0 (ou très près),
en utilisant moins d'étapes que possible.

J'espère offrir une autre vision du problème sera plus facile.
Il n'est pas exactement le même problème, mais j'ai l'impression qu'une solution qui peut résoudre cette version peut m'apporter très proche de la réponse de la question d'origine.

Une réponse à cette autre question peut être très utile.



La 3ème Alternative Question - "Tune 6 Variables" (la plus facile)

C'est une perte version simplifiée de la précédente alternative.

La seule différence est que maintenant, le monde est en 2D, Fi est également en 2D (x,y).

Ainsi, j'ai pour syntoniser uniquement Px,Py,SetaZ,Px',Py',SetaZ'=0, en utilisant le moins de temps possible.

Une réponse à cette simple alternative question peut être considéré comme utile.

6voto

AndyG Points 3298

Je vais essayer de garder ce court et doux.

Une approche est souvent utilisée pour résoudre ces problèmes dans la simulation est une Rapide Exploration Aléatoire de l'Arbre. Pour donner au moins un peu de crédibilité à mon post, je vais vous avouer que j'ai étudié ces, et le mouvement de la planification a été mon laboratoire de recherche de son domaine d'expertise (probabiliste de la planification des mouvements).

L'canonique de papier à lire sur ces est Steven LaValle est Rapidement exploration aléatoire des arbres: Un nouvel outil pour la planification de la trajectoire, et il y a eu un million d'articles publiés depuis que tous l'améliorer, d'une certaine façon.

D'abord je vais couvrir le plus de base à la description d'un TRA, et puis je vais décrire comment les changements lorsque vous avez des contraintes dynamiques. Je vais laisser tripoter par la suite à vous de voir:

La terminologie

"Espaces"

L'état de votre vaisseau spatial peut être décrit par ses 3 dimensions la position (x, y, z) et ses 3 dimensions de rotation (alpha, bêta, gamma) (j'utilise ces noms grecs, parce que ce sont les angles d'Euler).

espace d'état est toutes les positions possibles et les rotations de votre vaisseau spatial peut y habiter. Bien sûr, c'est infini.

collision de l'espace sont tous des "invalides" les etats. c'est à dire de façon réaliste des positions impossibles. Ce sont des états où votre vaisseau spatial est en collision avec un obstacle (Avec d'autres organismes, ce serait également inclure collision avec lui-même, par exemple la planification pour une longueur de chaîne). Abrégé comme C-Espace.

l'espace libre est quelque chose qui n'est pas de collision dans l'espace.

L'Approche générale (pas de dynamique, contraintes)

Pour un corps sans dynamique des contraintes de la démarche est assez simple:

  1. Exemple d'un état
  2. Trouver des voisins les plus proches de cet état
  3. Tentative pour planifier un itinéraire entre les voisins et de l'état

Je vais parler brièvement de chaque étape

L'échantillonnage d'un état

L'échantillonnage de l'état dans la plupart des cas de base, c'est choisir au hasard de valeurs pour chaque entrée dans votre espace d'état. Si nous avons fait cela avec votre vaisseau spatial, nous serions au hasard de l'échantillon pour x, y, z, alpha, bêta, gamma pour l'ensemble de ses valeurs possibles uniforme (échantillonnage aléatoire).

De la façon dont bien sûr plus de votre espace obstacle de l'espace que l'espace libre en général (parce que vous enfermez votre objet en question à certains "environnement" que vous souhaitez déplacer à l'intérieur des). Donc, ce qui est très courant de faire est de prendre la délimitation cube de votre environnement et les positions des échantillons à l'intérieur (x, y, z), et maintenant nous avons beaucoup plus de chance de l'échantillon dans l'espace libre.

Dans un TRA, vous aurez échantillon au hasard la plupart du temps. Mais avec une certaine probabilité pour vous de choisir votre prochaine échantillon à votre objectif de l'état (jouer avec elle, de commencer à 0.05). C'est parce que vous avez besoin de tester régulièrement pour voir si un chemin d'accès à partir de début à l'objectif qui est disponible.

Trouver des voisins les plus proches à un échantillonnage de l'état

Vous avez choisi de certaines entier > 0. Appelons ce nombre entier k. Votre k voisins les plus proches sont à proximité dans l'espace d'état. Cela signifie que vous avez une certaine distance métrique qui peut vous dire à quelle distance les états sont les uns des autres. La plupart de base de la distance de mesure est la distance Euclidienne, qui ne tient compte que de la distance physique et ne se soucie pas de rotation des angles (parce que dans le cas le plus simple, vous pouvez faire pivoter de 360 degrés dans un seul timestep).

Au départ, vous n'aurez qu'à votre position de départ, de sorte qu'il sera le seul candidat dans le voisin le plus proche de la liste.

La planification d'un itinéraire entre les états

Cela s'appelle de la planification locale. Dans un monde réel scénario, vous savez où vous allez, et le long de la façon dont vous avez besoin pour esquiver les autres personnes et les objets en mouvement. Nous n'allons pas vous soucier de ces choses ici. Dans notre planification de monde nous supposons que l'univers est statique, mais pour nous.

Ce qui est le plus commun est d'utiliser une interpolation linéaire entre l'échantillon de l'état et de son plus proche voisin. Le voisin (c'est à dire un nœud déjà dans l'arbre) est déplacé le long de cette interpolation linéaire peu à peu jusqu'à ce qu'il atteigne l'échantillon de la configuration, ou il se déplace à un maximum de distance (souvenez-vous de votre distance métrique).

Ce qui se passe ici est que votre arbre est en croissance vers l'échantillon. Quand je dis que vous l'étape "bit par bit", je veux dire vous définir certains "delta" (une très petite valeur) et déplacer le long de l'interpolation linéaire que chaque timestep. À chaque point que vous vérifiez si vous le nouvel état est entré en collision avec un obstacle. Si vous frappez un obstacle, vous gardez la dernière configuration valide en tant que partie de l'arbre (n'oubliez pas de ranger le bord en quelque sorte!) Donc, ce que vous aurez besoin pour un local planner est:

  • Vérification des collisions
  • comment "interpoler" entre les deux états (pour votre problème, vous n'avez pas besoin de vous inquiéter à ce sujet parce que nous allons faire quelque chose de différent).
  • Une simulation physique pour timestepping (Euler intégration est assez commun, mais moins stable que quelque chose comme de Runge-Kutta. Heureusement, vous avez déjà un modèle physique de!

Modification dynamique des contraintes

Bien sûr, si nous supposons que vous pouvez interpoler linéairement entre les états, nous allons violer la physique que vous avez défini pour votre vaisseau spatial. Nous avons donc modifier le RRT comme suit:

  • Au lieu de l'échantillonnage aléatoire unis, nous avons échantillon aléatoire de contrôles et d'appliquer, a déclaré contrôles pour une période de temps fixe (ou jusqu'à ce que la collision).

Avant, quand nous échantillonnage aléatoire unis, ce que nous étions vraiment en train de faire était de choisir une direction (dans l'espace d'état) pour se déplacer. Maintenant que nous avons des contraintes, nous avons au hasard de l'échantillon de notre contrôle, qui est effectivement la même chose, sauf que nous sommes à la garantie de ne pas violer nos contraintes.

Après avoir appliqué votre contrôle pour un intervalle de temps fixe (ou jusqu'à ce que la collision), vous ajoutez un nœud de l'arbre, avec le contrôle se trouvant sur le bord. Votre arbre se développe très rapidement pour explorer l'espace. Ce contrôle de l'application remplace l'interpolation linéaire entre l'arbre états et échantillonnées par les états.

L'échantillonnage des contrôles

Vous avez n - jets qui individuellement ont quelques min et max de la force qu'ils peuvent s'appliquer. De l'échantillon dans les que min et max de la force pour chaque jet.

Le nœud(s) puis-je demander mon contrôles?

Eh bien, vous pouvez choisir au hasard, ou votre peut introduire un biais dans la sélection des nœuds qui sont le plus proche de votre objectif de l'état (besoin de la distance métrique). Cette polarisation va essayer de pousser les nœuds rapprocher de l'objectif au fil du temps.

Maintenant, avec cette approche, vous avez peu de chances de exactement à atteindre votre but, si vous avez besoin de définir une partie de la définition de "assez près". Qui est, vous allez utiliser votre distance métrique de trouver des voisins les plus proches à votre objectif, puis de les tester pour "assez près". Cette "assez près" métrique peut être différent d'une distance métrique, ou pas. Si vous êtes à l'aide de la distance Euclidienne, mais il est très important que vous avez pour but de configuration est également correctement orientée, alors vous pouvez vouloir modifier le "assez près" mesure de regarder à l'angle des différences.

Ce qui est "assez proche" est entièrement à vous. Aussi quelque chose pour vous de régler, et il y a un million de journaux qui essaient de vous beaucoup plus proche de la première place.

Conclusion

Cet échantillonnage aléatoire peut sembler ridicule, mais votre arbre va croître à la découverte de l'espace libre très rapidement. Voir des vidéos de youtube sur RT pour la planification de la trajectoire. Nous ne pouvons pas garantir à quelque chose appelé "probabiliste de l'exhaustivité" avec dynamique de contraintes, mais il est généralement assez "bon". Parfois, il sera possible qu'une solution n'existe pas, de sorte que vous aurez besoin de mettre un peu de logique là-bas pour arrêter la croissance de l'arbre, après un certain temps (de 20 000 échantillons par exemple)

Plus De Ressources:

Commencez avec ces, et puis commencer à regarder dans leurs citations, et puis commencer à les citer.

5voto

Special Sauce Points 1341

Ce n'est pas une réponse, mais c'est trop long pour placer un commentaire.

Tout d'abord, une réelle solution implique à la fois la programmation linéaire (pour multivariée d'optimisation avec des contraintes qui seront utilisés dans plusieurs des sous-étapes) ainsi que les techniques utilisées dans la trajectoire de l'optimisation et/ou la théorie du contrôle. C'est un problème très complexe, et si vous pouvez le résoudre, vous pourriez avoir un emploi dans une entreprise de votre choix. La seule chose qui pourrait rendre le problème plus grave serait de friction (drag) effets ou de l'organisme externe de la gravitation effets. Une vraie solution serait aussi idéalement utiliser Verlet de l'intégration ou de 4e ordre de Runge-Kutta, qui offrent des améliorations par rapport à la droite d'Euler d'intégration que vous avez mis en place ici.

Deuxièmement, je crois que votre "2ème Version Alternative" de votre question ci-dessus a omis de rotation influence sur la position vecteur de déplacement vous ajouter dans la position à chaque timestep. Alors que le jet axes restent fixes par rapport au cadre de référence du navire, ils ne pas rester fixe par rapport au système de coordonnées universel vous utilisez à la terre du navire (au mondial de coordonner [0, 0, 0]). Par conséquent, l' [Px', Py', Pz'] vecteur (calculé à partir du navire cadre de référence) doivent faire l'objet approprié de rotation dans les 3 dimensions avant d'être appliqué à la position globale de coordonnées.

Troisièmement, il y a quelques hypothèses implicites que vous avez omis de préciser. Par exemple, une dimension devrait être définie comme "l'atterrissage" profondeur et de dimension négative des valeurs de coordonnées doit être interdite (sauf si vous acceptez un terrible crash). J'ai développé une maquette de modèle pour ce dont j'ai supposé z dimension à l'atterrissage dimension. Ce problème est très sensible à l'état initial et les contraintes qui pèsent sur les jets. Toutes mes tentatives d'utilisation de votre exemple de conditions initiales ci-dessus a échoué à la terre. Par exemple, dans ma maquette (sans la 3d vecteur de déplacement de rotation indiqué ci-dessus), le jet contraintes ne permettent que de la rotation dans une direction sur l'axe des z. Donc, si aZ devient négatif à tout moment (ce qui est souvent le cas), le navire est en fait contraint de faire une rotation complète sur l'axe avant, il peut même tenter de s'approcher de zéro degrés à nouveau. Aussi, sans la 3d vecteur de déplacement de rotation, vous trouverez qu' Px ne vont négatif à l'aide de votre exemple de conditions initiales et les contraintes, et le navire est obligé de crash ou divergent de plus en plus loin sur le négatif de l'axe des x comme il tente de manœuvre. La seule façon de résoudre ce problème est de véritablement intégrer la rotation ou de laisser suffisamment de positif et de négatif jet forces.

Cependant, même lorsque je me suis détendue à votre min/max de la force des contraintes, je n'ai pu obtenir ma maquette pour atterrir avec succès, démontrant la complexité de la planification sera probablement nécessaire ici. À moins qu'il est possible de formuler ce problème de programmation linéaire de l'espace, je crois que vous aurez besoin d'intégrer la planification avancée ou stochastique des arbres de décision qui sont "smart" assez de toujours utiliser de rotation des méthodes de réorienter le plus souple des jets sur le moment le plus nécessaire axes.

Enfin, comme je l'ai indiqué dans la section "commentaires", "le 14 Mai 2015, le code source pour l'Espace d'Ingénieurs a été faite librement disponible sur GitHub pour le public." Si vous croyez que le jeu contient déjà cette logique, ce devrait être votre lieu de départ. Je soupçonne cependant, vous êtes lié pour être déçu. La plupart de l'espace de jeu à l'atterrissage séquences tout simplement prendre le contrôle du navire et de ne pas simuler le "réel" vecteurs de la force. Une fois que vous prenez le contrôle d'un modèle 3-d, il est très facile de prédéterminer une spline 3d avec rotation qui va permettre au navire d'atterrir en douceur et avec une parfaite palier à l'heure prédéterminée. Pourquoi un programmeur de jeu de go par le biais de ce niveau de travail pour une séquence d'atterrissage? Ce genre de logique pourrait le contrôle des missiles ICBM ou rover planétaire des véhicules de rentrée et il est tout simplement exagéré à mon humble avis, pour un jeu (à moins que le but du jeu est de voir si vous pouvez atterrir un vaisseau spatial endommagé arbitraire des jets et des contraintes sans s'écraser).

2voto

MrBrushy Points 528

Je peux présenter une autre technique dans le mélange de (génial) réponses proposées.

Il se trouve plus à l'AI, et fournit proche de l'optimal solutions. Cela s'appelle l'Apprentissage de la Machine, plus précisément Q-Learning. Il est étonnamment facile à mettre en œuvre, mais dur pour obtenir le droit.

L'avantage est que l'apprentissage peut être fait hors ligne, de sorte que l'algorithme peut alors être super rapide lorsqu'il est utilisé.

Vous pourriez faire de l'apprentissage lorsque le navire est construit, ou quand quelque chose arrive (propulseur de destruction, de gros morceaux arrachés...).


Optimalité

J'ai observé que vous êtes à la recherche pour des solutions optimales. Votre méthode avec des paraboles est bon pour un contrôle optimal. Ce que vous avez fait est ceci:

  • Observer l'état du système.
  • Pour chaque état (à venir dans le trop rapide, trop lent, à la tête de suite, clôture, etc.) vous avez mis au point une action (appliquer une stratégie) qui permettra de ramener le système dans un état plus proche de l'objectif.
  • Répétez

C'est à peu près insoluble pour un humain en 3D (de trop nombreux cas, vous conduira fou) cependant une machine peut savoir où couper les paraboles dans toutes les dimensions, et de concevoir une stratégie optimale par lui-même.

Le Q-learning fonctionne très semblable à nous:

  • Observer l' (secretized) de l'état du système
  • Sélectionnez une action basée sur une stratégie de
    • Si cette action a introduit le système dans un état souhaité (plus proche de l'objectif), la marque de l'action/état initial comme plus souhaitable
  • Répétez

Discrétiser votre état d'un système.

Pour chaque état, une carte est initialisée quasi-aléatoire, qui associe à chaque état, à une Action (c'est la stratégie). Aussi attribuer une opportunité pour chaque état (à l'origine, zéro partout et 1000000 de l'état cible (X=0, V=0).

  • Votre état pourrait être votre 3 positions, 3 angles, 3translation vitesse, et trois de la vitesse de rotation.
  • Vos actions peuvent être n'importe quelle combinaison de propulseurs

De formation

Le Train de l'IA (hors phase):

  • Générer de nombreuses et diverses situations
  • Appliquer la stratégie
  • Évaluer l'état de new
  • Laissez l'algo (voir les liens ci-dessus) renforcer les stratégies choisies' opportunité de la valeur.

En direct de l'utilisation dans le jeu

Après quelques temps, une stratégie mondiale pour la navigation émerge. Vous stockez ensuite, et pendant votre boucle de jeu que vous simplement l'exemple de votre stratégie et de l'appliquer à chaque situation comme ils viennent.

La stratégie peut encore apprendre au cours de cette phase, mais probablement plus lentement (parce qu'il se passe en temps réel). (Btw, je rêve d'un jeu où l'IA à apprendre de chaque utilisateur de la rétroaction, de sorte que nous pourrions collectivement le train ^^)


Essayez ceci dans un simple 1D problème, il conçoit une stratégie très rapidement (quelques secondes).

En 2D, je crois, d'excellents résultats peuvent être obtenus en une heure.

Pour la 3D... Vous êtes à la recherche à la nuit des calculs. Il y a quelques chose à essayer et à accélérer le processus:

  1. Essayez jamais "oublier" des calculs précédents, et de les nourrir comme un "best guess" stratégie. L'enregistrer dans un fichier!

  2. Vous pouvez déposer certains états (comme le navire roll peut-être?) sans perdre beaucoup de navigation de l'optimalité, mais l'augmentation de la vitesse de calcul considérablement. Peut-être que le changement de référentiel de sorte que le navire est toujours sur l'axe des X, de cette façon vous aurez drop x&y!

  3. Les états sont plus fréquemment rencontrés ont un système fiable et très stratégie optimale. Peut-être normaliser l'état pour faire de votre navire de l'état toujours à proximité d'un "standard" de l'état?

  4. Généralement les vitesses de rotation des intervalles peuvent être délimités de façon sécuritaire (vous ne voulez pas un navire de tumbling wildely, de sorte que la stratégie sera toujours "un vent" que de la vitesse). Bien sûr angles de rotation sont en outre délimité.

  5. Vous pouvez aussi probablement discrétiser non-linéairement les postes, car de plus en plus loin de l'objectif, la précision ne sera pas affecter la stratégie de beaucoup.

1voto

Manuel Rodriguez Points 311

Pour ce genre de problèmes il y a deux techniques: bruteforce de recherche et des méthodes heuristiques. Bruteforce les moyens de reconnaître le problème comme un blackbox avec l'entrée et les paramètres de sortie et le but est d'obtenir le droit de paramètres d'entrée pour gagner le jeu. Pour programmer un tel bruteforce de recherche, le gamephysics s'exécute dans une boucle de simulation (simulation physique) et via la recherche stochastique (minimax, alpha-bêta-prunning) chaque possibilité est essayé. L'inconvénient de bruteforce de recherche est la forte consommation de cpu.

Les autres techniques d'utilisation des connaissances sur le jeu. Connaissances sur la motion de primitives et d'évaluation. Cette connaissance est programmée à la normale computerlanguages comme C++ ou Java. L'inconvénient de cette idée est, qu'il est souvent difficile d'en saisir la connaissance.

La meilleure pratique pour la résolution de vaisseau spatial de navigation est de combiner les deux idées dans un système hybride. Pour la programmation, le code source de ce problème concret j'estime que près de 2000 lignes de code sont nécessaires. Ce genre de problèmes sont normalement effectués au sein de projets d'envergure avec beaucoup de programmeurs et dure environ 6 mois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X