Проблема оптимизации с ограничениями с использованием pygmoPython

Программы на Python
Anonymous
Проблема оптимизации с ограничениями с использованием pygmo

Сообщение Anonymous »

Мне нужно решить задачу оптимизации в Python: мне нужно минимизировать целевую функцию с семью ограничениями. Я использую pygmo, но у меня проблемы с алгоритмом, я правда не понимаю, что делаю не так. Я пытаюсь реализовать половину орбиты от Земли до Марса и половину орбиты от Марса до Земли, я должен убедиться, что последнее положение и последняя скорость половины орбиты, идущей вперед, равны положению и скорость половины орбиты, движущейся назад. целевая функция написана для максимизации конечной массы.
Я написал следующий код:

Код: Выделить всё

`import numpy as np
import pykep as pk
import math
from scipy.integrate import odeint
import pygmo as pg
import matplotlib.pyplot as plt
from scipy.optimize import minimize
from scipy.optimize import fsolve
from mpl_toolkits.mplot3d import Axes3D

mu_sun = pk.MU_SUN*10**(-9)  #km^3/s^2
r_earth = 1.496e8  #raggio orbitale Terra km
r_mars = 2.279e8   #raggio orbitale Marte km

#orbita di trasferimento Hohmann

a_transfer = (r_earth+r_mars)/2

t_of = 348.79*pk.DAY2SEC

g0 = 9.80665

thrust = 0.5  #N

Isp = 2000   #s

m0 = 1000  #kg

earth = pk.planet.jpl_lp('earth') #effemeridi Terra
mars = pk.planet.jpl_lp('mars')  #effemeridi Marte

r0 = [-140699693, -51614428, 980]  #km lista, propagate lagrangian vuole liste
v0 = [9.774596, -28.07828, 4.337725*10**(-4)]  #km/s

rM = [-172682023, 176959469, 7948912]  #km
vM = [-16.427384, -14.860506, 9.21486*10**(-2)]  #km/s

r_fwd, v_fwd = pk.propagate_lagrangian(r0, v0, t_of/2, mu_sun)  #non so se è giusto, comunque devo vedere se vanno messi qui o no
r_bwd, v_bwd = pk.propagate_lagrangian(rM, vM, -t_of/2, mu_sun)

class Optimization:

def __init__(self, r_i, v_i, r_f, v_f, m0, Isp, mu, g0, t_of, r_fwd, v_fwd, r_bwd, v_bwd):

self.r_i = r0
self.v_i = v0
self.r_f = rM
self.v_f = vM
self.m0 = m0
self.Isp = Isp
self.mu = mu
self.g0 = g0
self.t_of = t_of
self.r_fwd = r_fwd
self.v_fwd = v_fwd
self.r_bwd = r_bwd
self.v_bwd = v_bwd

def fitness(self, x):

mf = x[0]

constraint_posx = self.r_fwd[0] - self.r_bwd[0]
constraint_posy = self.r_fwd[1] - self.r_bwd[1]
constraint_posz = self.r_fwd[2] - self.r_bwd[2]

constraint_velx = self.v_fwd[0] - self.v_bwd[0]
constraint_vely = self.v_fwd[1] - self.v_bwd[1]

`constraint_velz = self.v_fwd[2] - self.v_bwd[2]`

dV_fwd = np.linalg.norm(np.array(self.v_fwd)-np.array(self.v_i))
dV_bwd = np.linalg.norm(np.array(self.v_bwd)-np.array(self.v_f))

m_fwd = self.m0*np.exp(-dV_fwd/(self.Isp*self.g0))
mf = m_fwd*np.exp(-dV_fwd/(self.Isp*self.g0))
m_bwd = mf*np.exp(dV_bwd/(self.Isp*self.g0))

constraint_mass = m_fwd-m_bwd

J = -mf

constraints = [constraint_posx, constraint_posy, constraint_posz, constraint_velx, constraint_vely, constraint_velz, constraint_mass]

return [J] + constraints

def get_bounds(self):

return([0], [self.m0])

def get_nec(self):

return 7

def get_ni(self):

return 0

prob = pg.problem(Optimization(r0, v0, rM, vM, m0, Isp, mu_sun, g0, t_of, r_fwd, v_fwd, r_bwd, v_bwd))
algo = pg.algorithm(pg.nlopt('slsqp'))
pop = pg.population(prob,10)
pop = algo.evolve(pop)

best_solution = pop.champion_x
mf_final = best_solution

print(mf_final)
`
К сожалению, это не работает, я пробовал разные алгоритмы, ни один из них не работает... может кто-нибудь мне помочь?

Подробнее здесь: https://stackoverflow.com/questions/790 ... sing-pygmo

Вернуться в «Python»