Quan la realitat no coincideix amb les expectatives, sempre és desagradable. És especialment desagradable si has pagat diners per la realitat esperada: compres un bitllet d'una aerolínia, però per alguna raó et posen en un avió d'una aerolínia completament diferent. Llavors fas una connexió, i et posen en un avió d'alguna tercera aerolínia desconeguda. Què passa? Després de tot, tens un bitllet de la companyia aèria, que vas comprar només perquè saps què esperar d'ella, però encara voles amb avions de companyies aèries completament diferents. Sembla haver comprat un bitllet d'una aerolínia gran i ben establerta, però a bord es revela que aquesta aerolínia té filials regionals i sucursals, que no Les companyies aèries no s'adonen que aquestes accions poden fer que els viatgers canviïn completament les seves preferències? Una experiència negativa ràpidament construeix l'habilitat per prendre un enfocament més aprofundit per avaluar possibles alternatives. Els fluxos de passatgers són com un fluid que flueix en major volum on hi ha menys obstacles en el seu camí. En aquest cas, fins i tot una petita diferència en les avaluacions de les companyies aèries i dels viatgers de l'atractiu dels vols pot conduir a una distracció significativa dels fluxos de passatgers. Una disminució en l'atractiu d'un vol d'una aerolínia condueix a l'anomenat "embotellament" d'una part del flux de passatgers. Una altra aerolínia pot recollir el vessament oferint una alternativa més atractiva - fer una presa. Aquest model s'anomena el model de vessament i captura (captura) del flux de passatgers i relaciona directament els beneficis de l'aerolínia amb experiències de viatgers positives. Aquest article se centra en com fer que els vols de codeshare siguin més atractius, i fer un bon benefici en això (sense deixar enrere els seus competidors, per descomptat). Distribució del flux de passatgers Suposem que hi ha una petita xarxa de rutes de tres ciutats, que consisteix en només tres rutes: A → B - els vols són operats per A1; B→C: els vols són operats per A2 i A3; A→B→C - en el primer segment, els vols són operats per A1, en el segon per A2 и A3 - aquesta és la ruta que requereix avaluar l'optimitat de l'acord de codeshare. Els fluxos de passatgers es poden representar en dues formes - anomenem-los H i D: H - el trànsit de passatgers elemental entre dues ciutats; D - trànsit de passatgers compost entre dues ciutats. Per exemple, en el segment A→B, la companyia A1 pot estimar (observar si és inferior a la capacitat) el flux de passatgers D11, que és la suma de dos fluxos de passatgers elementals: En aquest cas, H1 és el flux de passatgers interessats en arribar d'A a B, i H3 és el flux de passatgers interessats en arribar d'A a C. Per al segment B→C, les coses són una mica més interessants: En aquest cas, les aerolínies A2 i A3 comparteixen el trànsit de passatgers H2 - viatgers que van de B a C, i el trànsit de passatgers H3 - viatgers que van de A a C i connecten a l'aeroport de la ciutat B. El paràmetre α també es pot interpretar com la probabilitat de fer una compra de bitllet en un vol de la companyia aèria en particular, per tant: α depèn de l'atractiu dels vols i es determina per la funció d'utilitat U(R), on R és un vector de paràmetres de vol, sobre la base del qual els viatgers decideixen comprar un bitllet. Normalment, les funcions exponenciades s'utilitzen com a funció d'utilitat i es converteixen en probabilitats utilitzant funcions suau-max. És aquesta una bona manera de fer-ho? És comú i senzill. Al mateix temps, les funcions sigmoides i la funció de distribució de Dirichlet s'ajusten molt millor al paradigma de votació. Per exemple, si hi havia una enquesta de viatgers on havíeu d'avaluar cada paràmetre de vol en una escala de 10 punts, seria la distribució beta i Dirichlet que processaria els resultats. Impacte dels acords de codeshare en l'atractiu de la ruta Els vols codeshare són atractius per als viatgers perquè permeten als passatgers: Acumuleu milles de bonificació participant en el programa de fidelització de la companyia aèria, fins i tot si el vol és operat per una altra companyia. Reservar bitllets d'avió per a vols amb connexions convenients, escollint l'opció més adequada entre les ofertes de diferents companyies aèries. Rebre assistència i suport de la companyia aèria durant el vol, independentment de la companyia de la qual es va comprar el bitllet. No obstant això, la raó principal per la qual els vols de codeshare són atractius és que augmenten el nombre de rutes - és molt més fàcil triar una ruta preparada que crear-la tu mateix. Naturalment, els vols de codeshare també poden ser poc atractius per diverses raons: nivells de servei inadequats; Regles de transport i equipatge diferents. la possibilitat de problemes d'equipatge durant les connexions. Augmentar l'atractiu d'un vol de codeshare pot augmentar el trànsit de passatgers: En teoria, els vols de codeshare poden augmentar el trànsit total de passatgers, però en una mesura molt més gran, simplement augmenten la demanda. L'addició d'un vol de codeshare posa els viatgers H3 davant de tres alternatives: Volar d'A a C en un vol de codeshare amb mínims inconvenients. Volar de A a C a través de B amb una connexió convenient a un vol de la companyia A2. Volar d'A a C a través de B amb una connexió incòmoda en el vol de la companyia A3. Suposem que això és el cas, llavors H3 es pot representar com la suma següent: on H(ch)3 són els viatgers que han triat un vol de codeshare, i H(rem)3 són els viatgers que han triat una ruta d'autotransfer. Llavors la redistribució completa de tots els fluxos entre les companyies aèries es pot escriure de la forma següent: El fet que l'atractiu de les rutes pot canviar tot el flux de passatgers pot semblar bastant estrany. No obstant això, és important comprendre que estem parlant de parts del flux de passatgers, és a dir, segments individuals de viatgers que avaluen i classifiquen les alternatives possibles de manera diferent. La demanda mostra com el preu afecta el nombre de bitllets comprats. L'atractivitat, d'altra banda, mostra com aquest nombre està influït per altres factors. L'atractivitat és sovint fixa - per exemple, per a vols programats que no poden canviar les hores d'arribada o de sortida. Un cop s'afegeix un vol conjunt amb una altra companyia aèria a un vol com aquest, el temps de connexió pot canviar, el que significa que una part dels viatgers seran guiats per més que només el preu en comprar un bitllet. Jugar i capturar Hem obtingut una expressió que descriu el canvi proporcional en el volum de passatgers entre les companyies aèries. Queda per esbrinar com calcular les proporcions basades en α. Això pot semblar molt complicat -en aquest cas sempre recorrem a aproximacions simples. Tenim les dades. Podem crear models de dades. Bàsicament estem parlant només del que "sabem com fer en ML (aprenentatge automàtic)". En primer lloc, cal especificar els volums aleatoris de passatgers que consisteixen en compradors potencials, és a dir, qualsevol persona que estigui d'alguna manera interessada a comprar un bitllet en algunes de les rutes considerades. H1 a Poisson(λ1) H2 ± Poisson(λ2) H3 Poisson(λ3) Considerem com es produeix l'embotellament i la captura del trànsit de passatgers utilitzant l'exemple de H3, perquè aquest trànsit de passatgers es divideix entre tres companyies aèries. Diferents nivells d'atractiu del vol generen diferents nivells d'atenció en diferents segments de preus de passatgers. Per exemple, un vol de codeshare serà el més atractiu, però per la mateixa raó serà el més car. Significa que serà d'interès per a aquells que estiguin disposats a pagar més del que és habitual per un bitllet. Deixeu que l'atractivitat sigui determinada per dos factors: codeshare i temps de connexió. Suposem que t(2) el temps de transferència per al vol A2 és molt més proper a t∗ que t(3) - el temps de transferència per al vol A3. Ara podem determinar l'atractivitat (utilitat dels dos vols) a través d'una simple funció en forma de campana. Δt∗=t∗−t=0 - diferència mínima del temps de transferència ideal. Δt∗=t∗−t>0 - cal anar de pressa. Δt∗=t∗−t<0 — cal esperar. Expressem les atraccions a través de les funcions utilitàries: u2=U(Δt2) i u3=U(Δt3), on U pot ser qualsevol funció unimodal: en el nostre cas U és una funció gaussiana. L'atractiu dels vols A2 i A3 es pot mostrar de la següent manera: import numpy com np de scipy.stats import norm, gamma, poisson, binom, uniforme, bernoulli import matplotlib.pyplot com plt de pylab import rcParams rcParams['figure.figsize'] = 7, 4 rcParams['figure.dpi'] = 140 %config InlineBackend.figure_format = 'png' import seaborn com sns.set() dt = np.linspace(-5, 5, 300) u = norm.pdf(dt, loc=0, escala=1.4) plt.plot(dt, u, 'C0') dt_2 = 1.15 u_2 = norm.pdf(dt_2, loc=0, escala=1.4) plt.plot(dt_2, u_2, 'C2o', label=r'$u_{2} =$' + f'{u_2:.2f}') plt.vlines(dt_2, 0, u_2, color='C2') dt_3 = 2.5 u_3 = norm.pdf(dt_3, loc=0, escala=1.4) plt.plot(dt_3, u_3, 'C3o', label=r'$u_{3} =$' + f'{u_3:.2f}') plt.vlines(dt_3, 0, u_3, color='C3') plt.title('Atractivitat (utilitat) de vols\n' + r' de companyies aèries $A_{2}$ i $A_{3}$') plt.xlabel(r'$\Delta t$ (hora)') plt.ylabel('u', rotació=0) plt.legend() plt.show() Si la companyia aèria A1 entra en un acord de codeshare amb A2, llavors, en termes de temps de transferència, l'atractiu del vol de codeshare serà el mateix que el d'A2, ja que el temps de transferència ideal - t∗, respecte al qual es calculen tots els delts, no ha canviat de cap manera. No obstant això, els vols de codeshare ofereixen una sèrie d'avantatges: no cal tornar a comprovar l'equipatge, no cal tornar a comprovar-se, i per als vols internacionals, romandre en una zona clara significa no tenir control addicional del passaport. L'atractiu d'un vol de codeshare augmenta pel fet que el viatger té menys risc de complir el Δt2, i també hi ha temps addicional per estirar les cames El temps ideal de connexió ha de tenir en compte diversos factors: Temps mínim de connexió: el temps necessari per transferir amb èxit passatgers i equipatge d'un vol a un altre a l'aeroport. Temps de confort addicional, necessari per reduir els riscos de córrer a la inscripció per a un altre vol. Temps mitjà de retards de vols - hi ha estadístiques especials per a cada companyia aèria. El temps ideal de connexió per a un vol de codeshare disminuirà almenys a causa del fet que els riscos de que el passatger es retardi el vol durant la connexió són assumits per la companyia aèria - ara garanteix que fins i tot si el viatger es retarda, encara es posaran en el següent vol. Suposant que t∗ch<t∗, això simplement fa que el gràfic de la funció d'utilitat per al vol de codeshare A1 es desplaci a la dreta: dt = np.linspace(-5, 5, 300) u = norm.pdf(dt, loc=0, escala=1.4) plt.plot(dt, u, 'C0', label=r'$t^{*} - t$) dt = np.linspace(-5, 5, 300) u_ch = norm.pdf(dt, loc=0.8, escala=1.4) plt.plot(dt, u_ch, 'C0--', label=r'$t^{*}_{ch} - t$') dt_1 = 1.15 u_1 = norm.pdf(dt_1, loc=0.8, escala=1.4) plt.plot(dt_1, u_1, 'C1o', label=r'$u_{1} =$' + f'{u_1:.2f}) plt.vlines(dt_1, 0, u_1, color='C1', lw=4, alfa=0.5) dt_2 = 1.15 u_2 = norm.pdf(dt_2, loc=0, escala=1.4) plt.plot(dt_2, u_2, 'C2o', label=r'$u_{2} =$' + f'{u_2:.2f}') plt.vlines(dt_2, 0, u_2, color='C2') dt_3 = 2.5 u_3 = norm.pdf(dt_3, loc=0, escala=1.4) plt.plot(dt_3, u_3, 'C3o', label=r'$u_{3} =$' + f'{u_3:.2f}') plt.vlines(dt_3, 0, u_3, color='C3') plt.title('Atractivitat (utilitat) de vols\n' + r' de companyies aèries $A_{2}$ i $A_{3}$') plt.xlabel(r'$\Delta t$ (hora)') plt.ylabel('u', rotació=0) plt.legend() plt.show() Si anteriorment la diferència del temps de connexió ideal era d'aproximadament 1 hora i 10 minuts, per a un vol de codeshare aquesta diferència serà de només 20 minuts. Naturalment, l'aproximació al temps de connexió ideal no és l'únic factor que afecta l'atractiu (utilitat) d'un vol. El temps de transferència es pren només amb finalitats il·lustratives. Ara hem d'entendre com aquests tres valors divideixen el trànsit de passatgers en segments de preu - estem parlant clarament d'algunes fraccions. Per determinar aquestes fraccions, necessitem un perfil de demanda potencial. preus_1 = np.linspace(100, 300, 1000) rvdem_1 = gamma(a=12, loc=100, escala=8) profile_1 = rvdem_1.pdf(prices_1) plt.plot(prices_1, profile_1, label=r'$H_{1}$') preus_2 = np.linspace(60, 200, 1000) rvdem_2 = gamma(a=8, loc=60, escala=7) profile_2 = rvdem_2.pdf(prices_2) plt.plot(prices_2, profile_2, label=r'$H_{2}$') preus_3 = np.linspace(240, 500, 1000) rvdem_3 = gamma(a=10, loc=230, escala=12) profile_3 = rvdem_3.pdf(prices_3) plt.plot(prices_3, profile_3, label=r'$H_{1}$') plt.legend() plt.xlabel('Preu (c.u.)') plt.title('Profils de demanda de flux de passatgers'); L'existència d'un perfil de demanda indica que hi ha una representació fiable de quins preus la probabilitat de comprar un bitllet és diferent de 0 o 1 i com depèn del preu. Cal assenyalar immediatament que l'existència d'aquests perfils de preus no permet una demostració racional de pràctiques antigues o suboptimals. En primer lloc, una vegada que s'hagi familiaritzat amb els mètodes ML, és bastant difícil imaginar com es podria fer alguna cosa de manera diferent, molt menys fer-ho pitjor. En segon lloc, hi ha almenys diverses metodologies per "predir" el nombre de bitllets venuts a algun preu. Les diferents companyies aèries poden utilitzar diferents. Algunes, normalment petites companyies aèries poden confiar totalment en la intuïció. Els diferents graus d’atractivitat de les alternatives han de dividir d’alguna manera els fluxos de passatgers entre les companyies aèries, i ara tenim tot el que necessitem per calcular l’α per a cadascuna d’elles: El flux H1 entre les companyies aèries no es comparteix. Només els fluxos H2 i H3 es divideixen, i la divisió depèn de l'atractiu dels vols, que afecta la probabilitat de la selecció. fig, ax = plt.subplots(1, 3, figsize=(12, 3)) dt = np.linspace(-5, 5, 300) u = norm.pdf(dt, loc=0, escala=1.4) ax[0].plot(dt, u, 'C0') dt = np.linspace(-5, 5, 300) u_ch = norm.pdf(dt, loc=0.8, escala=1.4) ax[0].plot(dt, u_ch, 'C0--') ax[1].plot(dt, u_ch, 'C0--') dt_1 = 1.15 u_1 = norm.pdf(dt_1, loc=0.8, escala=1.4) ax[0].plot(dt_1, u_1, 'C1o', label=r'$u_{1} =$' + f'{u_1:.2f}') ax[0].vlines(dt_1, 0, u_1, color='C1', lw=4, alfa=0.5) dt_2 = 1.15 u_2 = norm.pdf(dt_2, loc=0, escala=1.4) ax[0].plot(dt_2, u_2, 'C2o', label=r'$u_{2} =$' + f'{u_2:.2f}') ax[0].vlines(dt_2, 0, u_2, color='C2') dt_3 = 2.5 u_3 = norm.pdf(dt_3, loc=0, escala=1.4) ax[0].plot(dt_3, u_3, 'C3o', label=r'$u_{3} =$' + f'{u_3:.2f}') ax[0].vlines(dt_3, 0, u_3, color='C3') ax[0].legend(loc=3) ax[0].set_title('Atracció per a $H_3$\n(codeshare $A_{1}$ i $A_{2}$)') ax[0].set_xlabel(r'$\Delta t$ (hora)')') x (plot, plot, plot, plot, plot o plot) dt_1 = 2.5 u_1 = norm.pdf(dt_1, loc=0.8, escala=1.4) ax[1].plot(dt_1, u_1, 'C1o', label=r'$u_{1} =$' + f'{u_1:.2f}) ax[1].vlines(dt_1, 0, u_1, color='C1', lw=4, alfa=0.5) dt_2 = 1.15 u_2 = norm.pdf(dt_2, loc=0, escala=1.4) ax[1].plot(dt_2, u_2, 'C2o', label=r'$u_{2} =$' + f'{u_2:.2f}') ax[1].vlines(dt_2, 0, u_2, color='C2') dt_3 = 2.5 u_3 = norm.pdf(dt_3, loc=0, escala=1.4) ax[1].plot(dt_3, u_3, 'C3o', label=r'$u_{3} =$' + f'{u_3:.2f}') ax[1].vlines(dt_3, 0, u_3, color='C3') ax[1].legend(loc=3) ax[1].set_title('Atractivitat per a $H_3$\n(codeshare $A_{1}$ i $A_{3}$)') ax[1].set_xlabel(r'$\Delta t$ (hora)')') dt = np.linspace(-5, 5, 300) u = norm.pdf(dt, loc=0, escala=2.6) plt.plot(dt, u, 'C0') dt_2 = 1.15 u_2 = norm.pdf(dt_2, loc=0, escala=2.6) ax[2].plot(dt_2, u_2, 'C2o', label=r'$u_{2} =$' + f'{u_2:.2f}') ax[2].vlines(dt_2, 0, u_2, color='C2') dt_3 = 2.5 u_3 = norm.pdf(dt_3, loc=0, escala=2.6) ax[2].plot(dt_3, u_3, 'C3o', label=r'$u_{3} =$' + f'u_3:.2f} ax[2].vlines(dt_3, 0, u_3, color='C3') ax[2].legend(loc=3) ax[2].set_title('Atractivitat per a $H_2$') ax[2].set_xlabel(r'$\Delta t$ (hora)'); La manera més senzilla de convertir utilitats en probabilitats és multiplicar cadascun dels valors per algun factor de manera que la suma resultant sigui igual a 1: Per exemple, si A1 conclou un acord de codeshare amb A2, les probabilitats de triar un o l'altre vol són les següents: u = np. array([0.28, 0.20, 0.06]) imprimir(u / u.sum()) [0.51851852 0.37037037 0.11111111] P3 (A1 Selecció = Seg = 1) = 0,52; P3 (A2 Selecció = Seg = 1) = 0,37; P3 (A3 Selecció = A3 Seg = 1) = 0.11. No obstant això, la elecció està influïda no només per la preferència, sinó també per la quantitat de diners disponibles per fer-ho.Coneixent els perfils de demanda, podem determinar la probabilitat de comprar un bitllet a un preu determinat. Preu (1) 1 = 190 Preu (1) 3 = 370 Preu (2) 2 = 135 Preu(3) 2 = 115 Llavors la probabilitat de comprar un bitllet a algun preu es pot definir de la següent manera: Per exemple, la probabilitat que un bitllet per a un vol de codeshare sigui comprat a 370 c.u. serà igual a 0,27: rvdem_3 = gamma(a=10, lloc=230, escala=12) impressió(rvdem_3.sf(370)) 0.2727250812333501 Els viatgers que poden permetre's un bitllet a aquest preu veuen tres alternatives davant d'ells. Tanmateix, si una persona pot permetre's el màxim confort, això no vol dir que ell o ella necessàriament l'utilitzarà. La disponibilitat d'alternatives més barates permet estalviar diners - per això hem calculat l'atractiu de les alternatives i determinat les probabilitats de selecció en funció d'elles. Les probabilitats resultants de triar un vol en particular per a aquests passatgers seran iguals: P3 (A1 Selecció = Seg = 1) = 0,14; P3 (A2 Selecció = Seg = 1) = 0,1; P3 (A3 Selecció=Seg=1)=0.03. El resultat no sembla tan impressionant, perquè la probabilitat final de comprar un bitllet per al vol més còmode no és tan alta. Què passa amb aquells que no poden permetre's comprar aquest bitllet?Si la quantitat dels mitjans del passatger cau dins de l'interval: En aquest cas, tindrà dues alternatives a la seva disposició: triar un vol amb una connexió convenient o una llarga. P3 (A2 Selecció = Seg = 2) = 0,77; P3 (Escolta = A3 A3 Seg = 2) = 0,23. u = np. array([0.20, 0.06]) Impressió(u / u.sum()) [0.76923077 0.23076923] La probabilitat de comprar un bitllet en aquest cas serà: rvdem_3 = gamma(a=10, lloc=230, escala=12) impressió(rvdem_3.sf(325)- rvdem_3.sf(370)) 0.4541835759677653 Llavors, les probabilitats de selecció resultants per a aquests viatgers són les següents: P3 (A2 Selecció = Seg = 2) = 0,35; P3 (A3 Selecció = A3 Seg = 2) = 0,1. Els viatgers la quantitat de diners es troba en el rang [305,325] només poden permetre vol A3. La probabilitat de comprar un bitllet al preu 305 per a aquest segment és: rvdem_3 = gamma(a=10, lloc=230, escala=12) impressió(rvdem_3.sf(305)- rvdem_3.sf(325)) 0.17088396696109864 Finalment, les probabilitats de comprar un bitllet per a un vol en particular s'expressaran com una suma simple: Transport de passatgers H3 Es repartiran entre les companyies aèries de la manera següent: P3 (Selecció = A1) = 0,14 P3 (Elegir = A2) = 0,1 + 0,35 = 0,45 P3 (Escolta = A3) = 0,03 + 0,1 + 0,17 = 0,3 La probabilitat P(Buy=0) que el bitllet no es comprarà en absolut és de 0,1, que en suma amb les probabilitats d'elecció anterior dóna 1. Having done the same for passenger flow H2, we obtain the following: P2 (Selecció = A2) = 0,1 P2(Choice=A3)=0.38. El trànsit de passatgers H1 encara que no es comparteixi entre les companyies aèries, però a causa del preu de 190 ue es vessarà una part d'ell, de manera que encara podem introduir la probabilitat d'elecció de vol P1(Opció=A1), que es determinarà pel preu (la probabilitat de comprar un bitllet a aquest preu): rvdem_1 = gamma(a=12, loc=100, escala=8) impressió(rvdem_1.sf(190)) 0.5494501693973257 Seria possible descriure en detall tots els valors de α, però atès que ja hem obtingut valors específics de fraccions, escriurem tot en una forma més curta: Per a una aerolínia, optimitzar els acords de codeshare és un problema d'embalatge de motxilles amb una variable binària igual a un o zero quan es tria un vol potencial per ser compartit o no. Els principals problemes comencen quan s'estima el valor dels articles emmagatzemats a la motxilla. En el cas simple, una aerolínia pot decidir que depèn de la marca: si és atractiu, un vol de codeshare també serà atractiu. En aquest enfocament ingenu, el valor de l'article emmagatzemat a la motxilla simplement augmenta en proporció a algun factor. Un enfocament més desenvolupat és utilitzar múltiples criteris d'atracció per seleccionar un article. Cada article és una ruta que té temps de sortida i arribada, així com connexions que poden variar tant en durada com en tipus. En conseqüència, triar un article canvia el valor de tots els altres, tant els que ja estan a la bossa com els que encara no s'han embalat. Això vol dir que tots els α s'han de calcular cada vegada que es selecciona un article. Tanmateix, multiplicant tots els H pels preus corresponents, es poden obtenir estimacions raonables de la renda, i el més important, es pot esbrinar amb qui i en quins termes s'ha d'entrar en un acord. El mètode és bastant cru, però cal assenyalar que vincula les preferències dels viatgers a la redistribució del trànsit de passatgers. Delta Airlines, un dels pioners en l'optimització dels acords de codeshare, va informar que aquesta avaluació de les rutes conjuntes va proporcionar fins a 50 milions de dòlars en ingressos anuals addicionals. Això no només va ser un dels resultats més destacats per als anys 2000, sinó també una prova directa de la importància de les preferències dels viatgers. Air Canada va mostrar més tard que aquest mètode va proporcionar fins a un 80% més de ingressos setmanals que el mètode ingenu que només considera la influència de la marca. Aquest mètode és dolent en el fet que divideix el problema en dues parts: primer hem de classificar les alternatives i calcular les accions òptimes de H, i després recordar que tots els H són aleatoris i calcular les quotes òptimes per separat. Modelatge i optimització La companyia A1 necessita trobar no només els millors preus, sinó també les quotes: w(1)3 - el nombre de seients reservats per compartir codis, i w(1)1 - és el nombre de seients per a aquells que viatgen d'A a B. Si es denota per V la capacitat de l'avió, llavors es compleix una condició simple per a les quotes: w(1)1+w(1)3V(1) - el mateix que per al nombre de bitllets venuts q(1)1+q(2)3+q(3)3w(1) и q(1)3w(1)3. Normalment, la funció objectiu és gratuïta i consisteix només en augmentar els ingressos generats per la selecció d'un vol conjunt. No obstant això, a més dels ingressos, també hi ha costos que tenen un impacte significatiu en la rendibilitat dels vols. Cfix - costos fixos, per exemple: pagament de la tripulació, despeses d'estacionament a l'aeroport, aterratge i aterratge, seguretat aèria. Cvar - costos variables, que depenen del nombre de passatgers, per exemple: les taxes per a la provisió del complex terminal de l'aeroport, el maneig de l'equipatge. Això també inclouria el cost del petroli, ja que la seva quantitat també depèn del nombre de passatgers i l'equipatge, però per a la senzillesa ens referim a Cfix. Пусть Cvar=cvarQ, per exemple, cvar pot ser igual a 25 c.u., el valor del qual simplement es multiplica pel nombre de passatgers - Q. Preu(2)ch – cost dels seients comprats de la companyia operadora per a un vol de codeshare. Llavors el benefici mitjà A1 serà la següent funció: Els beneficis de la segona aerolínia: Es podria pensar que si A1 entra en un acord amb A2, llavors els beneficis d'A3 no haurien de ser de cap preocupació. De fet, el compartir codi té una conseqüència molt interessant: pressió competitiva. Sabem que Hj∼Poisson(λj). Sabent que Pj(Choice=Ai), podríem registrar el nombre de bitllets comprats q(i)j com: Fins i tot per a valors petits de Hj, és una pràctica estàndard, però els viatgers de H1 i H3 són una barreja aleatòria - no hi ha tal cosa com primer vendre bitllets només per als de H1 i després vendre els seients restants només per als de H3. També s'ha de tenir en compte que si els aeroports A i B estan separats per un nombre significatiu de zones horàries, la barreja de H2 i H3 tindrà una composició diferent depenent del temps. Per exemple, si A3 redueix significativament el preu a la nit, llavors aquesta reducció pot ser vista primer pels passatgers de H3 perquè poden tenir el dia en lloc de la nit. És important recordar que les dades sempre vénen primer. Fins i tot si escrivim Hj∼Poisson(λj) és una aproximació extremadament crua presa només per exemple. La barreja dels fluxos de passatgers, la capacitat limitada de l'avió, les quotes i molts altres matisos fan impossible deduir de manera analítica la distribució del nombre de bitllets venuts. Abans de modelar alguna cosa, cal definir els paràmetres bàsics del problema. Suposem que la ruta A→B→C és la ruta Vladivostok-Moscou-Sochi: VVO→SVO→AER. Let the flights be operated by the following airplanes: VVO→SVO — is operated by airline A1 on A350 aircraft with a capacity of V=325. SVO→AER — és operada per la companyia A2 en avions A320 amb una capacitat de V=180. SVO→AER — és operada per la companyia aèria A3 na en avions Boeing 737 amb una capacitat de V=190. Els costos fixos seran els següents: C(1) fix — 48360 c.u.; C(2) fix — 10270 c.u.; C(2)fix — 9890 c.u. Costos variables : c(1)var — 6,8 c.u. / passatger c(2)var — 5.4 c.u. / passatger. c(2)var — 5.1 c.u. / passatger. Suposem que els fluxos de passatgers es distribueixin de la següent manera: H1−Poisson (λ1 = 370) H2∼Poisson(λ2=350); H3 ~ Poisson (λ3 = 110) def prob_in_trafic(preus): preu_1, preu_2, preu_3 = preus rvdem_1 = gamma(a=12, loc=100, escala=8) rvdem_2 = gamma(a=8, loc=60, escala=7) rvdem_3 = gamma(a=10, loc=230, escala=12) pb_11 = rvdem_1.sf(preu_1) pb_10 = 1 - pb_11 ph\_1 = \[pb\_10, pb\_11] u\_2 = np.array(\[0.14, 0.1\]) pseg\_2 = u\_2 / uh\_2.sum() si preu\_2 > preu\_3: pbp\_22 = rvdem\_2.sf(preu\_2) pbp\_23 = rvdem\_2.sf(preu\_3) - rvdem\_2.sf(preu\_2) pb\_22 = rvdem\_22 pbp\_23 = rvdem\_2.sf(preu\2) pbp_23 = rvdem\2.sf(preu_3) pb_22 pb\_20 = 1 - pb\_22 - pb\_23 pb\_2 = pb\20, pb\_22, pb\_23 u\_3 = np.array(\[0.2, 0.06\]) pseg\_3 = u\_3 / uh\_3.sum() si (preu\_1 + preu\_2) > (preu\_1 + preu\_3): pbp\_32 = rvdem\_3.sf(preu\_1 + preu\_2) pbp\_33 = rvdem\_3.sf(preu\_1 + preu\_3) - rvdem\_3.sf(preu\_1 + preu\_2) pbp\32 = pbp\_32 = rvdem\3.sf(preu\_1 + preu\_3) pbp\33 = rvdem\3.sf(preu\_1 + preu\_3) pbp\32 = pbp\32 = rvdem\33.sf(preu\1 + preu\2) pbp\33 = rvdem pb\_30 = 1 - pb\_32 - pb\_33 P3 = P33, P32, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, retornar ph\_1, ph\_2, ph\_3 def vendes(P): h_1 = poisson.rvs(mu=370) h_2 = poisson.rvs(mu=350) h_3 = poisson.rvs(mu=110) h\_all = np.sum(\[h\_1, h\_2, h\_3\) p\_in\_h = np.array(\[h\_1, h\_2, h\_3\) / h\_all v\_1, v\_2, v\_3 = 325, 180, 190 q\_1, q\_2, q\_3 = 0, 0, 0 per a iter en rang(h\_all): pass\_in\_h = np.random.choice(\[1, 2, 3\], p=p\_in\_h) si pass\_in\_h == 1: si np.random.choice(\[[0, 1\], p=P\[0\]): si q\_1 < v\_1: q\_1 += 1 if pass\\\_in\\\_h == 2: a\\\_i = np.random.choice(\\\[0, 2, 3\\\], p=P\\\[1\\\]) if a\\\_i == 2: if q\\\_2 < v\\\_2: q\\\_2 += 1 if a\\\_i == 3: if q\\\_3 < v\\\_3: q\\\_3 += 1 if pass\\\_in\\\_h == 3: a\\\_i = np.random.choice(\\\[0, 2, 3\\\], p=P\\\[2\\\]) if a\\\_i == 2: if q\\\_2 < v\\\_2: q\\\_2 += 1 if q\\\_1 < v\\\_1: q\\\_1 += 1 if a\\\_i == 3: if q\\\_3 < v\\\_3: q\\\_3 += 1 if q\\\_1 < v\\\_1: q\\\_1 += 1 retornar q\_1, q\_2, q\_3 def profit_a(preus, Q): profit_1 = Q[0] * preus[0] - Q[0] * 6.8 - 48360 profit_2 = Q[1] * preus[1] - Q[1] * 5.4 - 10270 profit_3 = Q[2] * preus[2] - Q[2] * 5.1 - 9890 retorn profit_1, profit_2, profit_3 def e_profit(preus, n_iter): P = prob_in_trafic(preus) retorn np.mean([profit_a(preus, vendes(P)) per a _ en rang(n_iter)], eix = 0) Ara podem començar a modelar i optimitzar. sorgeixen preguntes: què i com optimitzar? què i què comparar per veure si hi ha un augment en el benefici? Idealment, cada aerolínia vol augmentar els seus beneficis, però els canvis en el preu dels bitllets d'una aerolínia afecten a tot el trànsit de passatgers. Aquests canvis són notats per altres aerolínies i també canvien el preu, que de nou condueix a canvis en els fluxos de passatgers. Això vol dir que els guanys de beneficis no es poden aconseguir aplicant el mètode d'optimització només una vegada. Suposem que cap aerolínia ha subscrit acords de codeshare i considerem que els preus següents són òptims: Preu (1) 1 = 185 Preu (2) 2 = 114 Preu(3) 2 = 110 Llavors la distribució dels seus beneficis serà la següent: Els preus són els següents: [185, 114, 110] q_data = [] profit_data = [] P = prob_in_trafic(preus) per a i en rang(1000): Q = vendes(P) q_data.append(Q) profit_data.append(profit_a(preus, Q)) q_data = np.array(q_data) profit_data = np.array(profit_data) fig, ax = plt.subplots(1, 3, figsize=(12, 3.5) sns.kdeplot(profit_data[:, 0], ax=ax[0]) e_pa_1 = np.mean(profit_data[:, 0]) ax[0].axvline(e_pa_1, color='C3', label=f'e_pa_1:.0f} c.u.') ax[0].legend() ax[0].set_title(r'$A_{1}$') ax[0].set_xlabel('Profit (c.u.)') sns.kdeplot(profit_data[: 1], ax=ax[1]) e_pa_2 = np.mean(profit_data[:, 1]) ax[1].axvline(e_pa_2, color='C3', label=f'e_pa_2:.0f} c.u.') ax[1].legend() ax[1].set_title(r'$A_{2}$') ax[1].set_xlabel('Profit (c.u.)')') sns.kdeplot(profit_data[:, 2], ax=ax[2]) e_pa_3 = np.mean(profit_data[:, 2]) ax[2].axvline(e_pa_3, color='C3', label=f'e_pa_3:.0f} c.u.') ax[2].legend(loc='upper left') ax[2].set_title(r'$A_{3}$') ax[2].set_xlabel('Profit (c.u.)') plt.suptitle('Distribució de beneficis de les aerolínies') plt.tight_layout(); Per a la companyia aèria A3, el preu clarament no és el millor preu. No obstant això, ara estem interessats en exactament com canviarà el benefici mitjà de les companyies aèries A2 i A3 si entren en un acord de codeshare entre si. def prob_in_trafic_ch(preus): preu_1, preu_2, preu_3, preu_ch = preus[:-1] rvdem_1 = gamma(a=12, loc=100, escala=8) rvdem_2 = gamma(a=8, loc=60, escala=7) rvdem_3 = gamma(a=10, loc=230, escala=12) pb\_11 = rvdem\_1.sf(preu\_1) pb\_10 = 1 - pb\_11 ph\_1 = \[pb\_10, pb\_11] u\_2 = np.array(\[0.14, 0.1\]) pseg\_2 = u\_2 / uh\_2.sum() si preu\_2 > preu\_3: pbp\_22 = rvdem\_2.sf(preu\_2) pbp\_23 = rvdem\_2.sf(preu\_3) - rvdem\_2.sf(preu\_2) pb\_22 = rvdem\_22 pbp\_23 = rvdem\_2.sf(preu\2) pbp_23 = rvdem\2.sf(preu_3) pb_22 pb\_20 = 1 - pb\_22 - pb\_23 ph\_2 = \[pb\_20, pb\_22, pb\_23\] u\_3\_ch = np.array(\[0.28, 0.2, 0.06\]) pseg\_3\_ch = uh\_3\_ch.sum() u\_3 = np.array(\[0.2, 0.06\]) pseg\_3 = uh\_3 / uh\_3.sum() si preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu/preu pb\_30 = 1 - pb\_31 - pb\_32 - pb\_33 P3 = P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, P33, retornar ph\_1, ph\_2, ph\_3 def sales_ch(P, w_1): h_1 = poisson.rvs(mu=370) h_2 = poisson.rvs(mu=350) h_3 = poisson.rvs(mu=110) h\_all = np.sum(\[h\_1, h\_2, h\_3\) p\_in\_h = np.array(\[h\_1, h\_2, h\_3\) / h\_all v\_1, v\_2, v\_3 = 325, 180, 190 q\_1, q\_1\_ch, q\_2, q\_3 = 0, 0, 0, 0 per a iters en rang(h\_all): passi\_in\_h = np.random.choice(\[1, 2, 3\], p=p\_in\_h) si passi\_in\_h == 1: si np.random.choice(\[0, 1\), p=P\[0\]): si q\_1 < v\_1 - w\_1: q\_1 += 1 if pass\\\_in\\\_h == 2: a\\\_i = np.random.choice(\\\[0, 2, 3\\\], p=P\\\[1\\\]) if a\\\_i == 2: if q\\\_2 < v\\\_2 - w\\\_1: q\\\_2 += 1 if a\\\_i == 3: if q\\\_3 < v\\\_3: q\\\_3 += 1 if pass\\\_in\\\_h == 3: a\\\_i = np.random.choice(\\\[0, 1, 2, 3\\\], p=P\\\[2\\\]) if a\\\_i == 1: if q\\\_1\\\_ch < w\\\_1: q\\\_1\\\_ch += 1 if a\\\_i == 2: if q\\\_2 < v\\\_2 - w\\\_1: q\\\_2 += 1 if q\\\_1 < v\\\_1 - w\\\_1: q\\\_1 += 1 if a\\\_i == 3: if q\\\_3 < v\\\_3: q\\\_3 += 1 if q\\\_1 < v\\\_1 - w\\\_1: q\\\_1 += 1 retornar q\_1, q\_1\_ch, q\_2, q\_3 def profit_a_ch(preus, Q, w_1): profit_1 = (Q[0] * preus[0] + Q[1] * preus[-2]) - (Q[0] + Q[1]) * 6.8 - w_1 * preus[-1] - 48360 profit_2 = (Q[2] * preus[1] + w_1 * preus[-1]) - (Q[2] + Q[1]) * 5.4 - 10270 profit_3 = Q[3] * preus[2] - Q[3] * 5.1 - 9890 retorn profit_1, profit_2, profit_3 def e_profit_ch(preus, w_1, n_iter): P = prob_in_trafic_ch(preus) retorn np.mean([profit_a_ch(preus, sales_ch(P, w_1), w_1) per _ en rang(n_iter)], eix = 0) Vegem tots els valors dels beneficis A1 i A2 que són simultàniament més grans que zero: PA_1 = [] PA_2 = [] PA_3 = [] PP = [] per a i en rang(10000): pra_1 = np.random.randint(150, 270) pra_2 = np.random.randint(111, 170) pra_3 = 110 pra_1_ch = np.random.randint(pra_1 + pra_2 , 500) pay_ch = np.random.randint(pra_2, pra_1_ch) preus = pra_1, pra_2, pra_3, pra_1_ch, pra_3 = np.random.randint(0, 110) pa = eprofit_ch(preus, w_1, w_1, w_1) plot_1, pa_1, pa_1, pa_1, pa_1, pa_1.append. x = np.linspace(0, 17500) y_1 = -x + 20000 y_2 = -0.8 * x + 20000 plt.plot(x, y_1, 'C3', label='Indiferència') plt.plot(x, y_2, 'C2', label='Interès') plt.xlabel(r'$A_{2}$ profit (c.u)') plt.ylabel(r'$A_{1}$ profit (c.u)') plt.title('Scatter de valors de beneficis positius de dues companyies aèries') Títol de la llegenda () Títol de l’exposició( Si aquest conjunt era simètric, el punt del conjunt que està més a prop de la línia tallant segments iguals dels eixos de coordenades podria ser pres com el punt òptim. Aquest enfocament s'anomena un enfocament indiferent. Un conjunt eficient gairebé mai és simètric, de manera que els participants tenen un interès a assegurar-se que l'asimetria es té necessàriament en compte quan es pren una decisió conjunta. En aquest cas, el punt més proper a la línia per sobre del conjunt i paral·lel a la línia que passa a través dels punts de màxim interès es pren com el punt òptim (0,Profit 1) i (Profit 2,0). La construcció d'un tal conjunt per a un problema en forma estocàstica sempre requereix investigació i aproximació - no es pot construir analíticament. Deixeu que els punts d'interès màxim siguin els següents: (0, 12000) i (17500, 0). Com a línia paral·lela a una altra línia que passa a través dels punts d'interès màxim, prenem la línia amb l'equació y=−0.8x+20000. Llavors els preus òptims prendran els valors següents: Preu (1) 1 = 185 Preu (2) 2 = 114 Preu (1) x = 345 Preu (2) x = 120; Igual que en el cas de l’1/29. Després de la introducció del vol de codeshare, la distribució dels beneficis es veurà així: preus_opt = [185, 114, 110, 345, 120] w_opt = 29 P = prob_in_trafic_ch(prices_opt) q_ch_data = [] profit_ch_data = [] for i in range(1000): Q = sales_ch(P, w_opt) q_ch_data.append(Q) profit_ch_data.append(profit_a_ch(prices_opt, Q, w_opt)) q_ch_data = np.array(q_ch_data) profit_ch_data = np.array(profit_ch_data) preus_opt = [185, 114, 110, 345, 120] w_opt = 29 P = prob_in_trafic_ch(prices_opt) q_ch_data = [] profit_ch_data = [] per a i en rang(1000): Q = sales_ch(P, w_opt) q_ch_data.append(Q) profit_ch_data.append(profit_a_ch(prices_opt, Q, w_opt)) q_ch_data = np.array(q_ch_data) profit_ch_data = np.array(profit_ch_data) A més d'augmentar els beneficis, hem resolt tranquil·lament el problema de la negociació. Tots els algoritmes per optimitzar els acords de codeshare optimitzen els ingressos d'una sola aerolínia. Al final, dues aerolínies (partners potencials) utilitzant aquest algoritme es reuniran en negociacions amb figures diferents - això vol dir que en el resultat final tot dependrà de com negocien. La construcció d'un conjunt Pareto-eficient no només optimitza els beneficis de les dues aerolínies, sinó que també fa que les negociacions siguin molt més fàcils, obrint un camí més directe i més curt a la teoria del joc - eliminant completament l'element humà. La idea d'embotellar i capturar passatgers és molt profunda i té implicacions "de llarg abast".Quants diners es poden fer amb una idea com aquesta?La prova de dades reals i simulades mostra que la consideració de les preferències dels viatgers juntament amb el càlcul de les quotes i els beneficis òptims per a ambdues aerolínies dóna guanys significatius sobre els mètodes de preferència només: El color vermell mostra la quantitat de pèrdues de les aerolínies que no van arribar a un acord - es pot veure que, de mitjana, la pèrdua supera el benefici de les aerolínies que van crear un vol de codeshare. Parlar de la competència com a tal no és del tot adequat aquí. El punt és que els canvis en els fluxos de passatgers afecten a tota la xarxa de rutes. Els efectes negatius o positius d'aquests canvis poden afectar a tots els participants de la xarxa: socis, competidors i fins i tot aquells que no es van tenir en compte en absolut. Les aerolínies també sovint sobreestimen l'atractiu dels vols de codeshare. De vegades els preus s'inflen per més de 100 dòlars. Els viatgers realment valoren molt la comoditat, però a causa del preu extremadament inflat, trien opcions menys còmodes però molt més barates. Si el transportista operatiu (el que realment transporta passatgers) no sap com calcular el conjunt de solucions Pareto-optimal, el transportista de màrqueting (el que ven bitllets) pot aprofitar fàcilment això i pagar menys del que hauria de pagar. Per cert, en aquest article només es va considerar un tipus més comú de codeshare de venda gratuïta - quan ambdues aerolínies poden publicar el vol de l'altra aerolínia com a propi amb poca o cap restricció sobre el nombre de seients que es poden vendre (dins de la capacitat de l'avió o els límits establerts). No obstant això, el mètode d'optimització considerat també és adequat per a altres tipus de codeshare, per exemple, bloc-espai - quan el nombre de seients a vendre per una aerolínia comercial està fixat. El mètode també és adequat per optimitzar els acords interlines, on una aerolínia simplement reconeix els documents de transport d'una altra aerolínia. D'una banda, tenir en compte diferents acords fa que la tasca sigui una mica més complicada, però, d'altra banda, permet a la companyia aèria combinar diferents condicions, optimitzant no només els beneficis sinó també l'atractiu per als passatgers regulars i nous a causa de l'àmplia xarxa de rutes. En conclusió A 5% increase in profit just due to codeshare agreements is not a bad result. Can it be more? Of course, yes. This problem can be viewed as an extension of the IFAM fleet assignment problem based on passenger composition modeling and the principle of passenger flow bottleneck/capture. A codeshare flight can be conceptualized as a flight operated by some virtual aircraft. This means that one can use already well-established techniques for further optimization — for example, optimizing at the level of dynamic pricing (subclasses) rather than averaged and rough values. In this case, the profit gains can be even greater. IFAM considera només una aerolínia, però la innovació d'aquest model rau precisament en el fet que per primera vegada va començar a tenir en compte l'impacte dels canvis en alguns fluxos de passatgers sobre els canvis en altres fluxos de passatgers. La dificultat amb l'expansió de l'IFAM és que cada vol compartit potencial realment hauria de ser tractat com un avió virtual separat. Podria haver-hi més de 100 o fins i tot 1.000 avions potencials en la flota d'una aerolínia. I això no és tot - la decisió de l'IFAM sol ser precedida per la tasca de modelar l'horari, que està dissenyat en gran part amb l'apelació del viatger en ment. En afegir vols compartits de codi, s'ha de tenir en compte el grau en què els horaris fixos dels avions virtuals són consistents amb els horaris fixos en què volen els avions reals de l'aerolínia. As it was mentioned at the beginning of the article, the solution of the problem is possible only if there is data — more precisely, a huge amount of data. One way or another, it all comes down to modeling the discrete choices that travelers make. Some airlines, with their large amounts of historical data, do a pretty good job with this, but even they can’t compete with GDS (Global Distribution System). This is due to the fact that airlines have data on passenger flows of only their route networks, while GDS sees the whole picture and is able to analyze a much larger number of both routes and scenarios of changes in passenger flows. However, it must be said that this only applies to the new generation of GDS. Unfortunately, older systems have never dealt with such tasks or dealt with them conditionally. En realitat, cap aerolínia mai serà capaç d'avaluar la redistribució dels fluxos de passatgers de forma oportuna, simplement perquè requereix dades d'altres aerolínies. En aquest article hem tocat, encara que en el passat, sobre el tema de l'optimització de múltiples criteris, que facilita les negociacions, que al seu torn ens porta a la teoria del joc. Però aquesta teoria ha demostrat repetidament que les estratègies de cooperació són les més rendibles i sostenibles. Per aconseguir això, es necessita una nova generació de GDS, llavors qualsevol aerolínia tindria accés a dades anònimes sobre el trànsit de passatgers d'altres aerolínies. Gràcies a això és possible aconseguir un nou nivell qualitatiu d'optimització no només dels acords de codeshare, sinó també d' Per entendre les possibilitats de GDS, fem una pregunta senzilla: què passaria si en el problema considerat tots els vols no fossin realitzats per tres, sinó per una aerolínia? En aquest cas, només es podria optimitzar la suma mitjana dels beneficis de tots els vols. Obté el problema habitual IFAM, i el guany en beneficis totals esdevé molt més gran que de la introducció de vols codeshare. L'únic problema és que els vols són operats per diferents aerolínies. La gestió centralitzada té molts més avantatges, però també té dificultats. A causa de dades insuficients, les aerolínies no poden fer això, però GDS pot.