Algoritmo per combinare gli intervalli di un segmento - aiuta a creare

 

Per favore, aiutatemi a creare un algoritmo che combini pezzi (intervalli) di un segmento in un unico segmento senza intersecare segmenti, con un possibile vuoto da riempire in seguito.

Inizialmente abbiamo una matrice di numeri in un certo intervallo, i numeri possono essere ripetuti, questa matrice è divisa in segmenti dai bordi. I confini sono generati da diversi algoritmi, di solito i confini non sono uniformi, quindi risulta che l'array di numeri affettato con metodi diversi e ogni intervallo ha una dimensione diversa. In seguito, una valutazione di ogni segmento di questo tipo secondo tre criteri, ogni criterio ha il suo confine, il cui mancato rispetto elimina un pezzo della gamma. Come risultato, otteniamo una tabella con il seguente contenuto.

i - numero di sequenza dell'intervallo;

S - limite di inizio gamma;

F - limite di fine gamma;

%R - criterio #1;

%dP - criterio numero 2;

%K_SCO - criterio numero 3;

K_Svod - valutazione sommaria di tutti i criteri.

La figura qui sotto mostra come i chunks (segmenti) possono essere posizionati nel piano:

I 3 colori di segni di spunta accanto ai pezzi sono potenziali soluzioni al problema.

L'algoritmo dovrebbe fornire diverse combinazioni di soluzioni al problema in modo che la condizione sia soddisfatta:

1. I segmenti sono abbinati senza incroci (S>=A && F<B);

2. È impossibile aggiungere un segmento in più da quelli disponibili - cioè una certa completezza e densità massima che procede dalle varianti scelte e disponibili;

3. La sequenza dei segmenti è ordinata - per eliminare le combinazioni simili;

4. si usa almeno una delle barre migliori, dalprimo 30% secondoK_Svod- per ridurre le combinazioni e mantenere la priorità del punteggio migliore.

Idealmente la stima della qualità dovrebbe essere quella di massimizzare la somma di tutti i segmenti secondo K_Svod, ma potrebbe essere necessario correggere un po' per stimare lo spazio/spazi di riempimento.

Forse ho usato una terminologia sbagliata e il mio problema è già stato risolto da tempo - non giudicate - illuminatemi.

 
Aleksey Vyazmikin:


1) K_Svod - valutazione sommaria di tutti i criteri.

2) La figura qui sotto mostra come i pezzi (segmenti) possono essere posizionati nel piano:

3) I segmenti sono abbinati senza intersezioni di intervallo (S>=A && F<B);

1) cos'è questo? perché le x?

2) meglio mostrare con un'immagine cosa è giusto e cosa è sbagliato

3) cos'è "A" e cos'è "B"?

4) Fai anche un "mock-up" della tabella dei dati e mostra quello che vuoi vedere come una soluzione soddisfacente
 
Possibilmente risolto in termini di teoria dei grafici. I vertici di un grafico sono segmenti, le frecce del grafico collegano ogni vertice a tutti i possibili vertici successivi (i segmenti più vicini possibili). Ogni vertice e freccia è segnato con dei pesi e viene definita una regola con la quale si conta il peso di ogni percorso. Viene applicato un algoritmo per trovare il percorso ottimale nel grafico. Non sono pronto ad approfondire la questione)
 
mytarmailS:

1) che cos'è? perché X?

2) meglio mostrare con una foto cosa è giusto e cosa è sbagliato?

3) cos'è "A" e cos'è "B"?

4) fare anche un "mock-up" della tabella dei dati e mostrare ciò che si vuole vedere come soluzione soddisfacente

1. è un derivato di tutte e 3 le valutazioni, le X sono perché non ho ancora deciso i pesi, non è essenziale.

2. La soluzione corretta è quella di riempire lo spazio con segmenti (una linea con probabile spazio non riempito tra i segmenti) - nella figura sopra ho spuntato i colori per ciascuna delle 3 possibili soluzioni. È possibile pensare a un'euristica supplementare, diciamo che la somma dell'intervallo assegnato di tutti i segmenti è il più grande possibile, ma oltre alla somma è importante anche il valore K_Svod.

3) Questo è un valore di numeri all'interno del segmento, sarebbe meglio scrivere A1>=S1 && A1<F1 && F1<S2.

4. La soluzione sarebbe un array con indici. O non ho capito la domanda. Algoritmo, come farlo meglio, non lo so.

 
Aleksey Nikolayev:
Probabilmente risolto in termini di teoria dei grafici. I vertici di un grafico sono segmenti, le frecce del grafico collegano ogni vertice con tutti i possibili successivi (i segmenti ammissibili più vicini). Ogni vertice e freccia è segnato con dei pesi e viene definita una regola con la quale si conta il peso di ogni percorso. Viene applicato un algoritmo per trovare il percorso ottimale nel grafico. Non sono pronto ad approfondire la questione)

Grazie per l'idea, penso che sia possibile iniziare a costruire la sequenza dall'alto di ogni indice i e poi valutare le combinazioni risultanti. Tutto ciò di cui abbiamo bisogno è un criterio di selezione o diversi criteri per ottenere diverse combinazioni. O randomizzare i criteri.... non è ancora chiaro.

 
Aleksey Vyazmikin:

1. è un derivato di tutte e 3 le valutazioni, la X è dovuta al fatto che non ho ancora deciso i pesi - non è essenziale.

2. La soluzione corretta è quella di riempire lo spazio con segmenti (una linea con probabile spazio non riempito tra i segmenti) - nella figura sopra, ho spuntato i colori per ciascuna delle 3 possibili soluzioni. È possibile pensare a un'euristica supplementare, diciamo che la somma dell'intervallo assegnato di tutti i segmenti è il più grande possibile, ma oltre alla somma, anche il valore K_Svod è importante.

3) Questo è un valore di numeri all'interno del segmento, sarebbe meglio scrivere A1>=S1 && A1<F1 && F1<S2.

4. La soluzione sarebbe un array con indici. O non ho capito la domanda. L'algoritmo, come farlo meglio, non lo so.

Continuo a non capire.

 
Aleksey Vyazmikin:

Grazie per l'idea, penso che sia possibile iniziare a costruire la sequenza dall'alto di ogni indice i e poi valutare le combinazioni risultanti. Tutto ciò di cui abbiamo bisogno è un criterio di selezione o diversi criteri per ottenere diverse combinazioni. O randomizzare i criteri.... non è ancora chiaro.

E dove sono le zecche, hanno qualche tipo di criterio che il segmento appartiene a quella zecca?
Fondamentalmente, si ottengono tre zecche. Blu, rosso, verde.
Quindi, in questo esempio, tre identificatori.
Se assegnate questi identificatori in qualche modo, potete concatenarli in tre array principali.
Usando l'identificatore, otteniamo la dimensione del segmento risultante,
usiamo l'identificatore per definire l'array principale di ricezione eaumentare la sua capacità di questa dimensione,
usiamo l'identificatore per inserire il segmento alla fine dell'array.
Quindi, dobbiamo definire qualche criterio che il segmento appartiene a questa casella di controllo (identificatore).

 
mytarmailS:

Ancora non capisco

Per favore, chiarisca ciò che non capisce - cercherò di spiegarlo con altre parole.

 
Roman:

Ma dove sono le zecche, hanno qualche tipo di criterio che il segmento appartiene a quella zecca?
In pratica, hai tre zecche. Blu, rosso, verde.
Quindi, in questo esempio, tre identificatori.
Se assegnate questi identificatori in qualche modo, potete concatenarli in tre array principali.
Con l'identificatore otteniamo la dimensione del segmento risultante,
con l'identificatore definiamo un array ricevente di base eincrementiamo la sua capacità di questa dimensione,
con l'identificatore inseriamo il segmento alla fine dell'array.
Quindi, abbiamo bisogno di definire qualche criterio che il segmento appartenga a questa casella di controllo (identificatore).

Ho disegnato i segmenti, poi ho pensato di mostrare la possibilità di combinarli - ho guardato le combinazioni che non si sovrappongono e che insieme occupano una grande area. Si noti che alcuni dei segmenti hanno due tick, il che significa che è possibile avere il segmento in più di una combinazione.

Cioè non c'è un identificatore prima dell'inizio del trattamento dei dati.
 
Aleksey Vyazmikin:

Ho disegnato i segmenti, poi ho pensato di mostrare la possibilità di combinarli - ho guardato le combinazioni che non si intersecano e che insieme occupano un'area più grande. Si noti che alcuni dei segmenti hanno due tick, il che significa che è possibile avere il segmento in più di una combinazione.

Cioè non c'è un identificatore prima dell'inizio del trattamento dei dati.

Forse in base al tuo algoritmo, ogni segmento può essere identificato con qualche criterio e gli viene assegnato un identificatore.
E il fatto che un segmento possa esserein più di una combinazione dipende dal fatto che lo si voglia aggiungere di nuovo all'array principale o meno.
Usate operatoriternari o condizionali per giocare con la logica.

 
Roman:

Forse in base al tuo algoritmo, ogni segmento può essere identificato con qualche criterio e gli viene assegnato un identificatore.
E il fatto che un segmento possa esserein più di una combinazione dipende dal fatto che debba essere aggiunto di nuovo all'array principale o meno.
Usate operatoriternari o condizionali per giocare con la logica.

Quindi non c'è un algoritmo da cui partire :) Ogni segmento è identificato da un numero ordinale e ha informazioni sulle coordinate (asse X) e una sorta di stima di utilità a queste coordinate.

Finora mi viene in mente solo un'idea: scegliere il segmento più vicino a quello iniziale. Forse in questo modo possiamo scegliere i primi 3 più vicini, a seconda del numero di segmenti il numero di combinazioni crescerà.

Motivazione: